diff --git a/php/composer.json b/php/composer.json
new file mode 100644
index 0000000..3dae286
--- /dev/null
+++ b/php/composer.json
@@ -0,0 +1,27 @@
+{
+  "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": {
+      "Foo\\": "tests/generated/Foo",
+      "Bar\\": "tests/generated/Bar",
+      "Google\\Protobuf\\": "tests/generated/Google/Protobuf",
+      "Google\\Protobuf\\Internal\\": "src/Google/Protobuf/Internal",
+      "GPBMetadata\\": "tests/generated/GPBMetadata",
+      "GPBMetadata\\Google\\Protobuf\\Internal\\": "src/GPBMetadata/Google/Protobuf/Internal"
+    },
+    "files": [
+      "src/Google/Protobuf/descriptor.php"
+    ]
+  }
+}
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index d8fbbe1..16e397f 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -41,6 +41,7 @@
   PHP_ME(Message, decode, NULL, ZEND_ACC_PUBLIC)
   PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED)
   PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED)
+  PHP_ME(Message, __construct, NULL, ZEND_ACC_PROTECTED)
   {NULL, NULL, NULL}
 };
 
@@ -210,6 +211,17 @@
 // 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) {
+  if (Z_OBJVAL_P(getThis()).handlers != message_handlers) {
+    zend_class_entry* ce = Z_OBJCE_P(getThis());
+    zval_dtor(getThis());
+    Z_OBJVAL_P(getThis()) = message_create(ce TSRMLS_CC);
+  }
+}
+
 PHP_METHOD(Message, readOneof) {
   long index;
 
diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h
index fb5879d..8022a9a 100644
--- a/php/ext/google/protobuf/protobuf.h
+++ b/php/ext/google/protobuf/protobuf.h
@@ -231,8 +231,8 @@
 };
 
 MessageLayout* create_layout(const upb_msgdef* msgdef);
-void layout_init(MessageLayout* layout, void* storage, zval** properties_table
-		 TSRMLS_DC);
+void layout_init(MessageLayout* layout, void* storage,
+                 zval** properties_table TSRMLS_DC);
 zval* layout_get(MessageLayout* layout, const void* storage,
                  const upb_fielddef* field, zval** cache TSRMLS_DC);
 void layout_set(MessageLayout* layout, MessageHeader* header,
@@ -241,6 +241,7 @@
 
 PHP_METHOD(Message, readOneof);
 PHP_METHOD(Message, writeOneof);
+PHP_METHOD(Message, __construct);
 
 // -----------------------------------------------------------------------------
 // Encode / Decode.
diff --git a/php/ext/google/protobuf/storage.c b/php/ext/google/protobuf/storage.c
index 1d25a91..8a2b3a2 100644
--- a/php/ext/google/protobuf/storage.c
+++ b/php/ext/google/protobuf/storage.c
@@ -458,8 +458,8 @@
   FREE(layout);
 }
 
-void layout_init(MessageLayout* layout, void* storage, zval** properties_table
-		 TSRMLS_DC) {
+void layout_init(MessageLayout* layout, void* storage,
+                 zval** properties_table TSRMLS_DC) {
   int i;
   upb_msg_field_iter it;
   for (upb_msg_field_begin(&it, layout->msgdef), i = 0; !upb_msg_field_done(&it);
@@ -479,8 +479,8 @@
       DEREF(memory, zval**) = property_ptr;
     } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
       zval_ptr_dtor(property_ptr);
-      repeated_field_create_with_type(repeated_field_type, field, property_ptr
-				      TSRMLS_CC);
+      repeated_field_create_with_type(repeated_field_type, field,
+                                      property_ptr TSRMLS_CC);
       DEREF(memory, zval**) = property_ptr;
     } else {
       native_slot_init(upb_fielddef_type(field), memory, property_ptr);
diff --git a/php/phpunit.xml b/php/phpunit.xml
new file mode 100644
index 0000000..0191a60
--- /dev/null
+++ b/php/phpunit.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit bootstrap="./vendor/autoload.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/map_field_test.php</file>
+      <file>tests/well_known_test.php</file>
+    </testsuite>
+  </testsuites>
+</phpunit>
diff --git a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
new file mode 100644
index 0000000..7c5c8df
--- /dev/null
+++ b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
@@ -0,0 +1,260 @@
+<?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)
+            ->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.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')
+            ->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('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)
+            ->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/Google/Protobuf/Internal/DescriptorProto.php b/php/src/Google/Protobuf/Internal/DescriptorProto.php
new file mode 100644
index 0000000..f076f6b
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/DescriptorProto.php
@@ -0,0 +1,325 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a message type.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.DescriptorProto</code>
+ */
+class DescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
+     */
+    private $field;
+    private $has_field = false;
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
+     */
+    private $extension;
+    private $has_extension = false;
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
+     */
+    private $nested_type;
+    private $has_nested_type = false;
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
+     */
+    private $enum_type;
+    private $has_enum_type = false;
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
+     */
+    private $extension_range;
+    private $has_extension_range = false;
+    /**
+     * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
+     */
+    private $oneof_decl;
+    private $has_oneof_decl = false;
+    /**
+     * <code>optional .google.protobuf.MessageOptions options = 7;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
+     */
+    private $reserved_range;
+    private $has_reserved_range = false;
+    /**
+     * <pre>
+     * Reserved field names, which may not be used by fields in the same message.
+     * A given name may only be reserved once.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
+     */
+    public function getField()
+    {
+        return $this->field;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
+     */
+    public function setField(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
+        $this->field = $var;
+        $this->has_field = true;
+    }
+
+    public function hasField()
+    {
+        return $this->has_field;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
+     */
+    public function getExtension()
+    {
+        return $this->extension;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
+     */
+    public function setExtension(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
+        $this->extension = $var;
+        $this->has_extension = true;
+    }
+
+    public function hasExtension()
+    {
+        return $this->has_extension;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
+     */
+    public function getNestedType()
+    {
+        return $this->nested_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
+     */
+    public function setNestedType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
+        $this->nested_type = $var;
+        $this->has_nested_type = true;
+    }
+
+    public function hasNestedType()
+    {
+        return $this->has_nested_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
+     */
+    public function getEnumType()
+    {
+        return $this->enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
+     */
+    public function setEnumType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
+        $this->enum_type = $var;
+        $this->has_enum_type = true;
+    }
+
+    public function hasEnumType()
+    {
+        return $this->has_enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
+     */
+    public function getExtensionRange()
+    {
+        return $this->extension_range;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
+     */
+    public function setExtensionRange(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class);
+        $this->extension_range = $var;
+        $this->has_extension_range = true;
+    }
+
+    public function hasExtensionRange()
+    {
+        return $this->has_extension_range;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
+     */
+    public function getOneofDecl()
+    {
+        return $this->oneof_decl;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
+     */
+    public function setOneofDecl(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class);
+        $this->oneof_decl = $var;
+        $this->has_oneof_decl = true;
+    }
+
+    public function hasOneofDecl()
+    {
+        return $this->has_oneof_decl;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MessageOptions options = 7;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MessageOptions options = 7;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
+     */
+    public function getReservedRange()
+    {
+        return $this->reserved_range;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
+     */
+    public function setReservedRange(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class);
+        $this->reserved_range = $var;
+        $this->has_reserved_range = true;
+    }
+
+    public function hasReservedRange()
+    {
+        return $this->has_reserved_range;
+    }
+
+    /**
+     * <pre>
+     * Reserved field names, which may not be used by fields in the same message.
+     * A given name may only be reserved once.
+     * </pre>
+     *
+     * <code>repeated string reserved_name = 10;</code>
+     */
+    public function getReservedName()
+    {
+        return $this->reserved_name;
+    }
+
+    /**
+     * <pre>
+     * Reserved field names, which may not be used by fields in the same message.
+     * A given name may only be reserved once.
+     * </pre>
+     *
+     * <code>repeated string reserved_name = 10;</code>
+     */
+    public function setReservedName(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
+        $this->reserved_name = $var;
+        $this->has_reserved_name = true;
+    }
+
+    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
new file mode 100644
index 0000000..738a173
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php
@@ -0,0 +1,82 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.DescriptorProto.ExtensionRange</code>
+ */
+class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional int32 start = 1;</code>
+     */
+    private $start = 0;
+    private $has_start = false;
+    /**
+     * <code>optional int32 end = 2;</code>
+     */
+    private $end = 0;
+    private $has_end = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional int32 start = 1;</code>
+     */
+    public function getStart()
+    {
+        return $this->start;
+    }
+
+    /**
+     * <code>optional int32 start = 1;</code>
+     */
+    public function setStart($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->start = $var;
+        $this->has_start = true;
+    }
+
+    public function hasStart()
+    {
+        return $this->has_start;
+    }
+
+    /**
+     * <code>optional int32 end = 2;</code>
+     */
+    public function getEnd()
+    {
+        return $this->end;
+    }
+
+    /**
+     * <code>optional int32 end = 2;</code>
+     */
+    public function setEnd($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->end = $var;
+        $this->has_end = true;
+    }
+
+    public function hasEnd()
+    {
+        return $this->has_end;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php
new file mode 100644
index 0000000..be36b8a
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php
@@ -0,0 +1,112 @@
+<?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;
+
+/**
+ * <pre>
+ * 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.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.DescriptorProto.ReservedRange</code>
+ */
+class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Inclusive.
+     * </pre>
+     *
+     * <code>optional int32 start = 1;</code>
+     */
+    private $start = 0;
+    private $has_start = false;
+    /**
+     * <pre>
+     * Exclusive.
+     * </pre>
+     *
+     * <code>optional int32 end = 2;</code>
+     */
+    private $end = 0;
+    private $has_end = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Inclusive.
+     * </pre>
+     *
+     * <code>optional int32 start = 1;</code>
+     */
+    public function getStart()
+    {
+        return $this->start;
+    }
+
+    /**
+     * <pre>
+     * Inclusive.
+     * </pre>
+     *
+     * <code>optional int32 start = 1;</code>
+     */
+    public function setStart($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->start = $var;
+        $this->has_start = true;
+    }
+
+    public function hasStart()
+    {
+        return $this->has_start;
+    }
+
+    /**
+     * <pre>
+     * Exclusive.
+     * </pre>
+     *
+     * <code>optional int32 end = 2;</code>
+     */
+    public function getEnd()
+    {
+        return $this->end;
+    }
+
+    /**
+     * <pre>
+     * Exclusive.
+     * </pre>
+     *
+     * <code>optional int32 end = 2;</code>
+     */
+    public function setEnd($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->end = $var;
+        $this->has_end = true;
+    }
+
+    public function hasEnd()
+    {
+        return $this->has_end;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
new file mode 100644
index 0000000..9c5f245
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
@@ -0,0 +1,114 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes an enum type.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.EnumDescriptorProto</code>
+ */
+class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
+     */
+    private $value;
+    private $has_value = false;
+    /**
+     * <code>optional .google.protobuf.EnumOptions options = 3;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
+     */
+    public function setValue(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class);
+        $this->value = $var;
+        $this->has_value = true;
+    }
+
+    public function hasValue()
+    {
+        return $this->has_value;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumOptions options = 3;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumOptions options = 3;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/EnumOptions.php b/php/src/Google/Protobuf/Internal/EnumOptions.php
new file mode 100644
index 0000000..a9c4e0d
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumOptions.php
@@ -0,0 +1,158 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.EnumOptions</code>
+ */
+class EnumOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Set this option to true to allow mapping different tag names to the same
+     * value.
+     * </pre>
+     *
+     * <code>optional bool allow_alias = 2;</code>
+     */
+    private $allow_alias = false;
+    private $has_allow_alias = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * Set this option to true to allow mapping different tag names to the same
+     * value.
+     * </pre>
+     *
+     * <code>optional bool allow_alias = 2;</code>
+     */
+    public function getAllowAlias()
+    {
+        return $this->allow_alias;
+    }
+
+    /**
+     * <pre>
+     * Set this option to true to allow mapping different tag names to the same
+     * value.
+     * </pre>
+     *
+     * <code>optional bool allow_alias = 2;</code>
+     */
+    public function setAllowAlias($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->allow_alias = $var;
+        $this->has_allow_alias = true;
+    }
+
+    public function hasAllowAlias()
+    {
+        return $this->has_allow_alias;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    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
new file mode 100644
index 0000000..94dc36e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php
@@ -0,0 +1,114 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a value within an enum.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.EnumValueDescriptorProto</code>
+ */
+class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>optional int32 number = 2;</code>
+     */
+    private $number = 0;
+    private $has_number = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>optional int32 number = 2;</code>
+     */
+    public function getNumber()
+    {
+        return $this->number;
+    }
+
+    /**
+     * <code>optional int32 number = 2;</code>
+     */
+    public function setNumber($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->number = $var;
+        $this->has_number = true;
+    }
+
+    public function hasNumber()
+    {
+        return $this->has_number;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    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
new file mode 100644
index 0000000..6446ecd
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumValueOptions.php
@@ -0,0 +1,115 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.EnumValueOptions</code>
+ */
+class EnumValueOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 1 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 1 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 1 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
new file mode 100644
index 0000000..6ae2cd4
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
@@ -0,0 +1,424 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a field within a message.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.FieldDescriptorProto</code>
+ */
+class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>optional int32 number = 3;</code>
+     */
+    private $number = 0;
+    private $has_number = false;
+    /**
+     * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
+     */
+    private $label = 0;
+    private $has_label = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
+     */
+    private $type = 0;
+    private $has_type = false;
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional string type_name = 6;</code>
+     */
+    private $type_name = '';
+    private $has_type_name = false;
+    /**
+     * <pre>
+     * For extensions, this is the name of the type being extended.  It is
+     * resolved in the same manner as type_name.
+     * </pre>
+     *
+     * <code>optional string extendee = 2;</code>
+     */
+    private $extendee = '';
+    private $has_extendee = false;
+    /**
+     * <pre>
+     * 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 &gt;= 128 are escaped.
+     * TODO(kenton):  Base-64 encode?
+     * </pre>
+     *
+     * <code>optional string default_value = 7;</code>
+     */
+    private $default_value = '';
+    private $has_default_value = false;
+    /**
+     * <pre>
+     * If set, gives the index of a oneof in the containing type's oneof_decl
+     * list.  This field is a member of that oneof.
+     * </pre>
+     *
+     * <code>optional int32 oneof_index = 9;</code>
+     */
+    private $oneof_index = 0;
+    private $has_oneof_index = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string json_name = 10;</code>
+     */
+    private $json_name = '';
+    private $has_json_name = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>optional int32 number = 3;</code>
+     */
+    public function getNumber()
+    {
+        return $this->number;
+    }
+
+    /**
+     * <code>optional int32 number = 3;</code>
+     */
+    public function setNumber($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->number = $var;
+        $this->has_number = true;
+    }
+
+    public function hasNumber()
+    {
+        return $this->has_number;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
+     */
+    public function getLabel()
+    {
+        return $this->label;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
+     */
+    public function setLabel($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class);
+        $this->label = $var;
+        $this->has_label = true;
+    }
+
+    public function hasLabel()
+    {
+        return $this->has_label;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
+     */
+    public function setType($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class);
+        $this->type = $var;
+        $this->has_type = true;
+    }
+
+    public function hasType()
+    {
+        return $this->has_type;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional string type_name = 6;</code>
+     */
+    public function getTypeName()
+    {
+        return $this->type_name;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional string type_name = 6;</code>
+     */
+    public function setTypeName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->type_name = $var;
+        $this->has_type_name = true;
+    }
+
+    public function hasTypeName()
+    {
+        return $this->has_type_name;
+    }
+
+    /**
+     * <pre>
+     * For extensions, this is the name of the type being extended.  It is
+     * resolved in the same manner as type_name.
+     * </pre>
+     *
+     * <code>optional string extendee = 2;</code>
+     */
+    public function getExtendee()
+    {
+        return $this->extendee;
+    }
+
+    /**
+     * <pre>
+     * For extensions, this is the name of the type being extended.  It is
+     * resolved in the same manner as type_name.
+     * </pre>
+     *
+     * <code>optional string extendee = 2;</code>
+     */
+    public function setExtendee($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->extendee = $var;
+        $this->has_extendee = true;
+    }
+
+    public function hasExtendee()
+    {
+        return $this->has_extendee;
+    }
+
+    /**
+     * <pre>
+     * 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 &gt;= 128 are escaped.
+     * TODO(kenton):  Base-64 encode?
+     * </pre>
+     *
+     * <code>optional string default_value = 7;</code>
+     */
+    public function getDefaultValue()
+    {
+        return $this->default_value;
+    }
+
+    /**
+     * <pre>
+     * 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 &gt;= 128 are escaped.
+     * TODO(kenton):  Base-64 encode?
+     * </pre>
+     *
+     * <code>optional string default_value = 7;</code>
+     */
+    public function setDefaultValue($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->default_value = $var;
+        $this->has_default_value = true;
+    }
+
+    public function hasDefaultValue()
+    {
+        return $this->has_default_value;
+    }
+
+    /**
+     * <pre>
+     * If set, gives the index of a oneof in the containing type's oneof_decl
+     * list.  This field is a member of that oneof.
+     * </pre>
+     *
+     * <code>optional int32 oneof_index = 9;</code>
+     */
+    public function getOneofIndex()
+    {
+        return $this->oneof_index;
+    }
+
+    /**
+     * <pre>
+     * If set, gives the index of a oneof in the containing type's oneof_decl
+     * list.  This field is a member of that oneof.
+     * </pre>
+     *
+     * <code>optional int32 oneof_index = 9;</code>
+     */
+    public function setOneofIndex($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->oneof_index = $var;
+        $this->has_oneof_index = true;
+    }
+
+    public function hasOneofIndex()
+    {
+        return $this->has_oneof_index;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string json_name = 10;</code>
+     */
+    public function getJsonName()
+    {
+        return $this->json_name;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string json_name = 10;</code>
+     */
+    public function setJsonName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->json_name = $var;
+        $this->has_json_name = true;
+    }
+
+    public function hasJsonName()
+    {
+        return $this->has_json_name;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldOptions options = 8;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldOptions options = 8;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    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
new file mode 100644
index 0000000..06f2601
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php
@@ -0,0 +1,29 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldDescriptorProto.Label</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldDescriptorProto_Label
+{
+    /**
+     * <pre>
+     * 0 is reserved for errors
+     * </pre>
+     *
+     * <code>LABEL_OPTIONAL = 1;</code>
+     */
+    const LABEL_OPTIONAL = 1;
+    /**
+     * <code>LABEL_REQUIRED = 2;</code>
+     */
+    const LABEL_REQUIRED = 2;
+    /**
+     * <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
new file mode 100644
index 0000000..9bda76c
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php
@@ -0,0 +1,120 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldDescriptorProto.Type</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldDescriptorProto_Type
+{
+    /**
+     * <pre>
+     * 0 is reserved for errors.
+     * Order is weird for historical reasons.
+     * </pre>
+     *
+     * <code>TYPE_DOUBLE = 1;</code>
+     */
+    const TYPE_DOUBLE = 1;
+    /**
+     * <code>TYPE_FLOAT = 2;</code>
+     */
+    const TYPE_FLOAT = 2;
+    /**
+     * <pre>
+     * Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
+     * negative values are likely.
+     * </pre>
+     *
+     * <code>TYPE_INT64 = 3;</code>
+     */
+    const TYPE_INT64 = 3;
+    /**
+     * <code>TYPE_UINT64 = 4;</code>
+     */
+    const TYPE_UINT64 = 4;
+    /**
+     * <pre>
+     * Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
+     * negative values are likely.
+     * </pre>
+     *
+     * <code>TYPE_INT32 = 5;</code>
+     */
+    const TYPE_INT32 = 5;
+    /**
+     * <code>TYPE_FIXED64 = 6;</code>
+     */
+    const TYPE_FIXED64 = 6;
+    /**
+     * <code>TYPE_FIXED32 = 7;</code>
+     */
+    const TYPE_FIXED32 = 7;
+    /**
+     * <code>TYPE_BOOL = 8;</code>
+     */
+    const TYPE_BOOL = 8;
+    /**
+     * <code>TYPE_STRING = 9;</code>
+     */
+    const TYPE_STRING = 9;
+    /**
+     * <pre>
+     * Tag-delimited aggregate.
+     * </pre>
+     *
+     * <code>TYPE_GROUP = 10;</code>
+     */
+    const TYPE_GROUP = 10;
+    /**
+     * <pre>
+     * Length-delimited aggregate.
+     * </pre>
+     *
+     * <code>TYPE_MESSAGE = 11;</code>
+     */
+    const TYPE_MESSAGE = 11;
+    /**
+     * <pre>
+     * New in version 2.
+     * </pre>
+     *
+     * <code>TYPE_BYTES = 12;</code>
+     */
+    const TYPE_BYTES = 12;
+    /**
+     * <code>TYPE_UINT32 = 13;</code>
+     */
+    const TYPE_UINT32 = 13;
+    /**
+     * <code>TYPE_ENUM = 14;</code>
+     */
+    const TYPE_ENUM = 14;
+    /**
+     * <code>TYPE_SFIXED32 = 15;</code>
+     */
+    const TYPE_SFIXED32 = 15;
+    /**
+     * <code>TYPE_SFIXED64 = 16;</code>
+     */
+    const TYPE_SFIXED64 = 16;
+    /**
+     * <pre>
+     * Uses ZigZag encoding.
+     * </pre>
+     *
+     * <code>TYPE_SINT32 = 17;</code>
+     */
+    const TYPE_SINT32 = 17;
+    /**
+     * <pre>
+     * Uses ZigZag encoding.
+     * </pre>
+     *
+     * <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
new file mode 100644
index 0000000..af1393a
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldOptions.php
@@ -0,0 +1,429 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.FieldOptions</code>
+ */
+class FieldOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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!
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
+     */
+    private $ctype = 0;
+    private $has_ctype = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool packed = 2;</code>
+     */
+    private $packed = false;
+    private $has_packed = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
+     */
+    private $jstype = 0;
+    private $has_jstype = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool lazy = 5 [default = false];</code>
+     */
+    private $lazy = false;
+    private $has_lazy = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>optional bool weak = 10 [default = false];</code>
+     */
+    private $weak = false;
+    private $has_weak = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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!
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
+     */
+    public function getCtype()
+    {
+        return $this->ctype;
+    }
+
+    /**
+     * <pre>
+     * 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!
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
+     */
+    public function setCtype($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class);
+        $this->ctype = $var;
+        $this->has_ctype = true;
+    }
+
+    public function hasCtype()
+    {
+        return $this->has_ctype;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool packed = 2;</code>
+     */
+    public function getPacked()
+    {
+        return $this->packed;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool packed = 2;</code>
+     */
+    public function setPacked($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->packed = $var;
+        $this->has_packed = true;
+    }
+
+    public function hasPacked()
+    {
+        return $this->has_packed;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
+     */
+    public function getJstype()
+    {
+        return $this->jstype;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
+     */
+    public function setJstype($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class);
+        $this->jstype = $var;
+        $this->has_jstype = true;
+    }
+
+    public function hasJstype()
+    {
+        return $this->has_jstype;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool lazy = 5 [default = false];</code>
+     */
+    public function getLazy()
+    {
+        return $this->lazy;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool lazy = 5 [default = false];</code>
+     */
+    public function setLazy($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->lazy = $var;
+        $this->has_lazy = true;
+    }
+
+    public function hasLazy()
+    {
+        return $this->has_lazy;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>optional bool weak = 10 [default = false];</code>
+     */
+    public function getWeak()
+    {
+        return $this->weak;
+    }
+
+    /**
+     * <pre>
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>optional bool weak = 10 [default = false];</code>
+     */
+    public function setWeak($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->weak = $var;
+        $this->has_weak = true;
+    }
+
+    public function hasWeak()
+    {
+        return $this->has_weak;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    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
new file mode 100644
index 0000000..2ff2a47
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldOptions_CType.php
@@ -0,0 +1,29 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldOptions.CType</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldOptions_CType
+{
+    /**
+     * <pre>
+     * Default mode.
+     * </pre>
+     *
+     * <code>STRING = 0;</code>
+     */
+    const STRING = 0;
+    /**
+     * <code>CORD = 1;</code>
+     */
+    const CORD = 1;
+    /**
+     * <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
new file mode 100644
index 0000000..541c8ae
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php
@@ -0,0 +1,37 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldOptions.JSType</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldOptions_JSType
+{
+    /**
+     * <pre>
+     * Use the default type.
+     * </pre>
+     *
+     * <code>JS_NORMAL = 0;</code>
+     */
+    const JS_NORMAL = 0;
+    /**
+     * <pre>
+     * Use JavaScript strings.
+     * </pre>
+     *
+     * <code>JS_STRING = 1;</code>
+     */
+    const JS_STRING = 1;
+    /**
+     * <pre>
+     * Use JavaScript numbers.
+     * </pre>
+     *
+     * <code>JS_NUMBER = 2;</code>
+     */
+    const JS_NUMBER = 2;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
new file mode 100644
index 0000000..39f6776
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
@@ -0,0 +1,477 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a complete .proto file.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.FileDescriptorProto</code>
+ */
+class FileDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * file name, relative to root of source tree
+     * </pre>
+     *
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <pre>
+     * e.g. "foo", "foo.bar", etc.
+     * </pre>
+     *
+     * <code>optional string package = 2;</code>
+     */
+    private $package = '';
+    private $has_package = false;
+    /**
+     * <pre>
+     * Names of files imported by this file.
+     * </pre>
+     *
+     * <code>repeated string dependency = 3;</code>
+     */
+    private $dependency;
+    private $has_dependency = false;
+    /**
+     * <pre>
+     * Indexes of the public imported files in the dependency list above.
+     * </pre>
+     *
+     * <code>repeated int32 public_dependency = 10;</code>
+     */
+    private $public_dependency;
+    private $has_public_dependency = false;
+    /**
+     * <pre>
+     * Indexes of the weak imported files in the dependency list.
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>repeated int32 weak_dependency = 11;</code>
+     */
+    private $weak_dependency;
+    private $has_weak_dependency = false;
+    /**
+     * <pre>
+     * All top-level definitions in this file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
+     */
+    private $message_type;
+    private $has_message_type = false;
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
+     */
+    private $enum_type;
+    private $has_enum_type = false;
+    /**
+     * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
+     */
+    private $service;
+    private $has_service = false;
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
+     */
+    private $extension;
+    private $has_extension = false;
+    /**
+     * <code>optional .google.protobuf.FileOptions options = 8;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
+     */
+    private $source_code_info = null;
+    private $has_source_code_info = false;
+    /**
+     * <pre>
+     * The syntax of the proto file.
+     * The supported values are "proto2" and "proto3".
+     * </pre>
+     *
+     * <code>optional string syntax = 12;</code>
+     */
+    private $syntax = '';
+    private $has_syntax = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * file name, relative to root of source tree
+     * </pre>
+     *
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <pre>
+     * file name, relative to root of source tree
+     * </pre>
+     *
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <pre>
+     * e.g. "foo", "foo.bar", etc.
+     * </pre>
+     *
+     * <code>optional string package = 2;</code>
+     */
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    /**
+     * <pre>
+     * e.g. "foo", "foo.bar", etc.
+     * </pre>
+     *
+     * <code>optional string package = 2;</code>
+     */
+    public function setPackage($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->package = $var;
+        $this->has_package = true;
+    }
+
+    public function hasPackage()
+    {
+        return $this->has_package;
+    }
+
+    /**
+     * <pre>
+     * Names of files imported by this file.
+     * </pre>
+     *
+     * <code>repeated string dependency = 3;</code>
+     */
+    public function getDependency()
+    {
+        return $this->dependency;
+    }
+
+    /**
+     * <pre>
+     * Names of files imported by this file.
+     * </pre>
+     *
+     * <code>repeated string dependency = 3;</code>
+     */
+    public function setDependency(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
+        $this->dependency = $var;
+        $this->has_dependency = true;
+    }
+
+    public function hasDependency()
+    {
+        return $this->has_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the public imported files in the dependency list above.
+     * </pre>
+     *
+     * <code>repeated int32 public_dependency = 10;</code>
+     */
+    public function getPublicDependency()
+    {
+        return $this->public_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the public imported files in the dependency list above.
+     * </pre>
+     *
+     * <code>repeated int32 public_dependency = 10;</code>
+     */
+    public function setPublicDependency(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->public_dependency = $var;
+        $this->has_public_dependency = true;
+    }
+
+    public function hasPublicDependency()
+    {
+        return $this->has_public_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the weak imported files in the dependency list.
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>repeated int32 weak_dependency = 11;</code>
+     */
+    public function getWeakDependency()
+    {
+        return $this->weak_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the weak imported files in the dependency list.
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>repeated int32 weak_dependency = 11;</code>
+     */
+    public function setWeakDependency(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->weak_dependency = $var;
+        $this->has_weak_dependency = true;
+    }
+
+    public function hasWeakDependency()
+    {
+        return $this->has_weak_dependency;
+    }
+
+    /**
+     * <pre>
+     * All top-level definitions in this file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
+     */
+    public function getMessageType()
+    {
+        return $this->message_type;
+    }
+
+    /**
+     * <pre>
+     * All top-level definitions in this file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
+     */
+    public function setMessageType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
+        $this->message_type = $var;
+        $this->has_message_type = true;
+    }
+
+    public function hasMessageType()
+    {
+        return $this->has_message_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
+     */
+    public function getEnumType()
+    {
+        return $this->enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
+     */
+    public function setEnumType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
+        $this->enum_type = $var;
+        $this->has_enum_type = true;
+    }
+
+    public function hasEnumType()
+    {
+        return $this->has_enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
+     */
+    public function getService()
+    {
+        return $this->service;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
+     */
+    public function setService(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class);
+        $this->service = $var;
+        $this->has_service = true;
+    }
+
+    public function hasService()
+    {
+        return $this->has_service;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
+     */
+    public function getExtension()
+    {
+        return $this->extension;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
+     */
+    public function setExtension(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
+        $this->extension = $var;
+        $this->has_extension = true;
+    }
+
+    public function hasExtension()
+    {
+        return $this->has_extension;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions options = 8;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions options = 8;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
+     */
+    public function getSourceCodeInfo()
+    {
+        return $this->source_code_info;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
+     */
+    public function setSourceCodeInfo(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class);
+        $this->source_code_info = $var;
+        $this->has_source_code_info = true;
+    }
+
+    public function hasSourceCodeInfo()
+    {
+        return $this->has_source_code_info;
+    }
+
+    /**
+     * <pre>
+     * The syntax of the proto file.
+     * The supported values are "proto2" and "proto3".
+     * </pre>
+     *
+     * <code>optional string syntax = 12;</code>
+     */
+    public function getSyntax()
+    {
+        return $this->syntax;
+    }
+
+    /**
+     * <pre>
+     * The syntax of the proto file.
+     * The supported values are "proto2" and "proto3".
+     * </pre>
+     *
+     * <code>optional string syntax = 12;</code>
+     */
+    public function setSyntax($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->syntax = $var;
+        $this->has_syntax = true;
+    }
+
+    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
new file mode 100644
index 0000000..20a165c
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileDescriptorSet.php
@@ -0,0 +1,59 @@
+<?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;
+
+/**
+ * <pre>
+ * The protocol compiler can output a FileDescriptorSet containing the .proto
+ * files it parses.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.FileDescriptorSet</code>
+ */
+class FileDescriptorSet extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
+     */
+    public function getFile()
+    {
+        return $this->file;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
+     */
+    public function setFile(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class);
+        $this->file = $var;
+        $this->has_file = true;
+    }
+
+    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
new file mode 100644
index 0000000..2422f3e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileOptions.php
@@ -0,0 +1,741 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.FileOptions</code>
+ */
+class FileOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string java_package = 1;</code>
+     */
+    private $java_package = '';
+    private $has_java_package = false;
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional string java_outer_classname = 8;</code>
+     */
+    private $java_outer_classname = '';
+    private $has_java_outer_classname = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool java_multiple_files = 10 [default = false];</code>
+     */
+    private $java_multiple_files = false;
+    private $has_java_multiple_files = false;
+    /**
+     * <pre>
+     * This option does nothing.
+     * </pre>
+     *
+     * <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;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
+     */
+    private $java_string_check_utf8 = false;
+    private $has_java_string_check_utf8 = false;
+    /**
+     * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
+     */
+    private $optimize_for = 0;
+    private $has_optimize_for = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string go_package = 11;</code>
+     */
+    private $go_package = '';
+    private $has_go_package = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool cc_generic_services = 16 [default = false];</code>
+     */
+    private $cc_generic_services = false;
+    private $has_cc_generic_services = false;
+    /**
+     * <code>optional bool java_generic_services = 17 [default = false];</code>
+     */
+    private $java_generic_services = false;
+    private $has_java_generic_services = false;
+    /**
+     * <code>optional bool py_generic_services = 18 [default = false];</code>
+     */
+    private $py_generic_services = false;
+    private $has_py_generic_services = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 23 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * Enables the use of arenas for the proto messages in this file. This applies
+     * only to generated classes for C++.
+     * </pre>
+     *
+     * <code>optional bool cc_enable_arenas = 31 [default = false];</code>
+     */
+    private $cc_enable_arenas = false;
+    private $has_cc_enable_arenas = false;
+    /**
+     * <pre>
+     * Sets the objective c class prefix which is prepended to all objective c
+     * generated classes from this .proto. There is no default.
+     * </pre>
+     *
+     * <code>optional string objc_class_prefix = 36;</code>
+     */
+    private $objc_class_prefix = '';
+    private $has_objc_class_prefix = false;
+    /**
+     * <pre>
+     * Namespace for generated classes; defaults to the package.
+     * </pre>
+     *
+     * <code>optional string csharp_namespace = 37;</code>
+     */
+    private $csharp_namespace = '';
+    private $has_csharp_namespace = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string swift_prefix = 39;</code>
+     */
+    private $swift_prefix = '';
+    private $has_swift_prefix = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string java_package = 1;</code>
+     */
+    public function getJavaPackage()
+    {
+        return $this->java_package;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string java_package = 1;</code>
+     */
+    public function setJavaPackage($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->java_package = $var;
+        $this->has_java_package = true;
+    }
+
+    public function hasJavaPackage()
+    {
+        return $this->has_java_package;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional string java_outer_classname = 8;</code>
+     */
+    public function getJavaOuterClassname()
+    {
+        return $this->java_outer_classname;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional string java_outer_classname = 8;</code>
+     */
+    public function setJavaOuterClassname($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->java_outer_classname = $var;
+        $this->has_java_outer_classname = true;
+    }
+
+    public function hasJavaOuterClassname()
+    {
+        return $this->has_java_outer_classname;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool java_multiple_files = 10 [default = false];</code>
+     */
+    public function getJavaMultipleFiles()
+    {
+        return $this->java_multiple_files;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool java_multiple_files = 10 [default = false];</code>
+     */
+    public function setJavaMultipleFiles($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_multiple_files = $var;
+        $this->has_java_multiple_files = true;
+    }
+
+    public function hasJavaMultipleFiles()
+    {
+        return $this->has_java_multiple_files;
+    }
+
+    /**
+     * <pre>
+     * This option does nothing.
+     * </pre>
+     *
+     * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
+     */
+    public function getJavaGenerateEqualsAndHash()
+    {
+        return $this->java_generate_equals_and_hash;
+    }
+
+    /**
+     * <pre>
+     * This option does nothing.
+     * </pre>
+     *
+     * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
+     */
+    public function setJavaGenerateEqualsAndHash($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_generate_equals_and_hash = $var;
+        $this->has_java_generate_equals_and_hash = true;
+    }
+
+    public function hasJavaGenerateEqualsAndHash()
+    {
+        return $this->has_java_generate_equals_and_hash;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
+     */
+    public function getJavaStringCheckUtf8()
+    {
+        return $this->java_string_check_utf8;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
+     */
+    public function setJavaStringCheckUtf8($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_string_check_utf8 = $var;
+        $this->has_java_string_check_utf8 = true;
+    }
+
+    public function hasJavaStringCheckUtf8()
+    {
+        return $this->has_java_string_check_utf8;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
+     */
+    public function getOptimizeFor()
+    {
+        return $this->optimize_for;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
+     */
+    public function setOptimizeFor($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class);
+        $this->optimize_for = $var;
+        $this->has_optimize_for = true;
+    }
+
+    public function hasOptimizeFor()
+    {
+        return $this->has_optimize_for;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string go_package = 11;</code>
+     */
+    public function getGoPackage()
+    {
+        return $this->go_package;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string go_package = 11;</code>
+     */
+    public function setGoPackage($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->go_package = $var;
+        $this->has_go_package = true;
+    }
+
+    public function hasGoPackage()
+    {
+        return $this->has_go_package;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool cc_generic_services = 16 [default = false];</code>
+     */
+    public function getCcGenericServices()
+    {
+        return $this->cc_generic_services;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool cc_generic_services = 16 [default = false];</code>
+     */
+    public function setCcGenericServices($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->cc_generic_services = $var;
+        $this->has_cc_generic_services = true;
+    }
+
+    public function hasCcGenericServices()
+    {
+        return $this->has_cc_generic_services;
+    }
+
+    /**
+     * <code>optional bool java_generic_services = 17 [default = false];</code>
+     */
+    public function getJavaGenericServices()
+    {
+        return $this->java_generic_services;
+    }
+
+    /**
+     * <code>optional bool java_generic_services = 17 [default = false];</code>
+     */
+    public function setJavaGenericServices($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_generic_services = $var;
+        $this->has_java_generic_services = true;
+    }
+
+    public function hasJavaGenericServices()
+    {
+        return $this->has_java_generic_services;
+    }
+
+    /**
+     * <code>optional bool py_generic_services = 18 [default = false];</code>
+     */
+    public function getPyGenericServices()
+    {
+        return $this->py_generic_services;
+    }
+
+    /**
+     * <code>optional bool py_generic_services = 18 [default = false];</code>
+     */
+    public function setPyGenericServices($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->py_generic_services = $var;
+        $this->has_py_generic_services = true;
+    }
+
+    public function hasPyGenericServices()
+    {
+        return $this->has_py_generic_services;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 23 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 23 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * Enables the use of arenas for the proto messages in this file. This applies
+     * only to generated classes for C++.
+     * </pre>
+     *
+     * <code>optional bool cc_enable_arenas = 31 [default = false];</code>
+     */
+    public function getCcEnableArenas()
+    {
+        return $this->cc_enable_arenas;
+    }
+
+    /**
+     * <pre>
+     * Enables the use of arenas for the proto messages in this file. This applies
+     * only to generated classes for C++.
+     * </pre>
+     *
+     * <code>optional bool cc_enable_arenas = 31 [default = false];</code>
+     */
+    public function setCcEnableArenas($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->cc_enable_arenas = $var;
+        $this->has_cc_enable_arenas = true;
+    }
+
+    public function hasCcEnableArenas()
+    {
+        return $this->has_cc_enable_arenas;
+    }
+
+    /**
+     * <pre>
+     * Sets the objective c class prefix which is prepended to all objective c
+     * generated classes from this .proto. There is no default.
+     * </pre>
+     *
+     * <code>optional string objc_class_prefix = 36;</code>
+     */
+    public function getObjcClassPrefix()
+    {
+        return $this->objc_class_prefix;
+    }
+
+    /**
+     * <pre>
+     * Sets the objective c class prefix which is prepended to all objective c
+     * generated classes from this .proto. There is no default.
+     * </pre>
+     *
+     * <code>optional string objc_class_prefix = 36;</code>
+     */
+    public function setObjcClassPrefix($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->objc_class_prefix = $var;
+        $this->has_objc_class_prefix = true;
+    }
+
+    public function hasObjcClassPrefix()
+    {
+        return $this->has_objc_class_prefix;
+    }
+
+    /**
+     * <pre>
+     * Namespace for generated classes; defaults to the package.
+     * </pre>
+     *
+     * <code>optional string csharp_namespace = 37;</code>
+     */
+    public function getCsharpNamespace()
+    {
+        return $this->csharp_namespace;
+    }
+
+    /**
+     * <pre>
+     * Namespace for generated classes; defaults to the package.
+     * </pre>
+     *
+     * <code>optional string csharp_namespace = 37;</code>
+     */
+    public function setCsharpNamespace($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->csharp_namespace = $var;
+        $this->has_csharp_namespace = true;
+    }
+
+    public function hasCsharpNamespace()
+    {
+        return $this->has_csharp_namespace;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string swift_prefix = 39;</code>
+     */
+    public function getSwiftPrefix()
+    {
+        return $this->swift_prefix;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string swift_prefix = 39;</code>
+     */
+    public function setSwiftPrefix($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->swift_prefix = $var;
+        $this->has_swift_prefix = true;
+    }
+
+    public function hasSwiftPrefix()
+    {
+        return $this->has_swift_prefix;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    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
new file mode 100644
index 0000000..7fd488e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php
@@ -0,0 +1,41 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * <pre>
+ * Generated classes can be optimized for speed or code size.
+ * </pre>
+ *
+ * Protobuf enum <code>google.protobuf.FileOptions.OptimizeMode</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FileOptions_OptimizeMode
+{
+    /**
+     * <pre>
+     * Generate complete code for parsing, serialization,
+     * </pre>
+     *
+     * <code>SPEED = 1;</code>
+     */
+    const SPEED = 1;
+    /**
+     * <pre>
+     * etc.
+     * </pre>
+     *
+     * <code>CODE_SIZE = 2;</code>
+     */
+    const CODE_SIZE = 2;
+    /**
+     * <pre>
+     * Generate code using MessageLite and the lite runtime.
+     * </pre>
+     *
+     * <code>LITE_RUNTIME = 3;</code>
+     */
+    const LITE_RUNTIME = 3;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
new file mode 100644
index 0000000..8e493c2
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
@@ -0,0 +1,75 @@
+<?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;
+
+/**
+ * <pre>
+ * 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.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.GeneratedCodeInfo</code>
+ */
+class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * An Annotation connects some span of text in generated code to an element
+     * of its generating .proto file.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * An Annotation connects some span of text in generated code to an element
+     * of its generating .proto file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
+     */
+    public function getAnnotation()
+    {
+        return $this->annotation;
+    }
+
+    /**
+     * <pre>
+     * An Annotation connects some span of text in generated code to an element
+     * of its generating .proto file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
+     */
+    public function setAnnotation(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class);
+        $this->annotation = $var;
+        $this->has_annotation = true;
+    }
+
+    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
new file mode 100644
index 0000000..dcc7edf
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php
@@ -0,0 +1,198 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.GeneratedCodeInfo.Annotation</code>
+ */
+class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Identifies the element in the original source .proto file. This field
+     * is formatted the same as SourceCodeInfo.Location.path.
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    private $path;
+    private $has_path = false;
+    /**
+     * <pre>
+     * Identifies the filesystem path to the original source .proto.
+     * </pre>
+     *
+     * <code>optional string source_file = 2;</code>
+     */
+    private $source_file = '';
+    private $has_source_file = false;
+    /**
+     * <pre>
+     * Identifies the starting offset in bytes in the generated code
+     * that relates to the identified object.
+     * </pre>
+     *
+     * <code>optional int32 begin = 3;</code>
+     */
+    private $begin = 0;
+    private $has_begin = false;
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional int32 end = 4;</code>
+     */
+    private $end = 0;
+    private $has_end = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Identifies the element in the original source .proto file. This field
+     * is formatted the same as SourceCodeInfo.Location.path.
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * <pre>
+     * Identifies the element in the original source .proto file. This field
+     * is formatted the same as SourceCodeInfo.Location.path.
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function setPath(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->path = $var;
+        $this->has_path = true;
+    }
+
+    public function hasPath()
+    {
+        return $this->has_path;
+    }
+
+    /**
+     * <pre>
+     * Identifies the filesystem path to the original source .proto.
+     * </pre>
+     *
+     * <code>optional string source_file = 2;</code>
+     */
+    public function getSourceFile()
+    {
+        return $this->source_file;
+    }
+
+    /**
+     * <pre>
+     * Identifies the filesystem path to the original source .proto.
+     * </pre>
+     *
+     * <code>optional string source_file = 2;</code>
+     */
+    public function setSourceFile($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->source_file = $var;
+        $this->has_source_file = true;
+    }
+
+    public function hasSourceFile()
+    {
+        return $this->has_source_file;
+    }
+
+    /**
+     * <pre>
+     * Identifies the starting offset in bytes in the generated code
+     * that relates to the identified object.
+     * </pre>
+     *
+     * <code>optional int32 begin = 3;</code>
+     */
+    public function getBegin()
+    {
+        return $this->begin;
+    }
+
+    /**
+     * <pre>
+     * Identifies the starting offset in bytes in the generated code
+     * that relates to the identified object.
+     * </pre>
+     *
+     * <code>optional int32 begin = 3;</code>
+     */
+    public function setBegin($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->begin = $var;
+        $this->has_begin = true;
+    }
+
+    public function hasBegin()
+    {
+        return $this->has_begin;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional int32 end = 4;</code>
+     */
+    public function getEnd()
+    {
+        return $this->end;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>optional int32 end = 4;</code>
+     */
+    public function setEnd($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->end = $var;
+        $this->has_end = true;
+    }
+
+    public function hasEnd()
+    {
+        return $this->has_end;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/MessageOptions.php b/php/src/Google/Protobuf/Internal/MessageOptions.php
new file mode 100644
index 0000000..e4a214c
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MessageOptions.php
@@ -0,0 +1,334 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.MessageOptions</code>
+ */
+class MessageOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool message_set_wire_format = 1 [default = false];</code>
+     */
+    private $message_set_wire_format = false;
+    private $has_message_set_wire_format = false;
+    /**
+     * <pre>
+     * 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".
+     * </pre>
+     *
+     * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
+     */
+    private $no_standard_descriptor_accessor = false;
+    private $has_no_standard_descriptor_accessor = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * Whether the message is an automatically generated map entry type for the
+     * maps field.
+     * For maps fields:
+     *     map&lt;KeyType, ValueType&gt; 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.
+     * </pre>
+     *
+     * <code>optional bool map_entry = 7;</code>
+     */
+    private $map_entry = false;
+    private $has_map_entry = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool message_set_wire_format = 1 [default = false];</code>
+     */
+    public function getMessageSetWireFormat()
+    {
+        return $this->message_set_wire_format;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool message_set_wire_format = 1 [default = false];</code>
+     */
+    public function setMessageSetWireFormat($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->message_set_wire_format = $var;
+        $this->has_message_set_wire_format = true;
+    }
+
+    public function hasMessageSetWireFormat()
+    {
+        return $this->has_message_set_wire_format;
+    }
+
+    /**
+     * <pre>
+     * 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".
+     * </pre>
+     *
+     * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
+     */
+    public function getNoStandardDescriptorAccessor()
+    {
+        return $this->no_standard_descriptor_accessor;
+    }
+
+    /**
+     * <pre>
+     * 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".
+     * </pre>
+     *
+     * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
+     */
+    public function setNoStandardDescriptorAccessor($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->no_standard_descriptor_accessor = $var;
+        $this->has_no_standard_descriptor_accessor = true;
+    }
+
+    public function hasNoStandardDescriptorAccessor()
+    {
+        return $this->has_no_standard_descriptor_accessor;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * Whether the message is an automatically generated map entry type for the
+     * maps field.
+     * For maps fields:
+     *     map&lt;KeyType, ValueType&gt; 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.
+     * </pre>
+     *
+     * <code>optional bool map_entry = 7;</code>
+     */
+    public function getMapEntry()
+    {
+        return $this->map_entry;
+    }
+
+    /**
+     * <pre>
+     * Whether the message is an automatically generated map entry type for the
+     * maps field.
+     * For maps fields:
+     *     map&lt;KeyType, ValueType&gt; 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.
+     * </pre>
+     *
+     * <code>optional bool map_entry = 7;</code>
+     */
+    public function setMapEntry($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->map_entry = $var;
+        $this->has_map_entry = true;
+    }
+
+    public function hasMapEntry()
+    {
+        return $this->has_map_entry;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    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
new file mode 100644
index 0000000..3d8df7a
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php
@@ -0,0 +1,237 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a method of a service.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.MethodDescriptorProto</code>
+ */
+class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <pre>
+     * Input and output type names.  These are resolved in the same way as
+     * FieldDescriptorProto.type_name, but must refer to a message type.
+     * </pre>
+     *
+     * <code>optional string input_type = 2;</code>
+     */
+    private $input_type = '';
+    private $has_input_type = false;
+    /**
+     * <code>optional string output_type = 3;</code>
+     */
+    private $output_type = '';
+    private $has_output_type = false;
+    /**
+     * <code>optional .google.protobuf.MethodOptions options = 4;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+    /**
+     * <pre>
+     * Identifies if client streams multiple client messages
+     * </pre>
+     *
+     * <code>optional bool client_streaming = 5 [default = false];</code>
+     */
+    private $client_streaming = false;
+    private $has_client_streaming = false;
+    /**
+     * <pre>
+     * Identifies if server streams multiple server messages
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <pre>
+     * Input and output type names.  These are resolved in the same way as
+     * FieldDescriptorProto.type_name, but must refer to a message type.
+     * </pre>
+     *
+     * <code>optional string input_type = 2;</code>
+     */
+    public function getInputType()
+    {
+        return $this->input_type;
+    }
+
+    /**
+     * <pre>
+     * Input and output type names.  These are resolved in the same way as
+     * FieldDescriptorProto.type_name, but must refer to a message type.
+     * </pre>
+     *
+     * <code>optional string input_type = 2;</code>
+     */
+    public function setInputType($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->input_type = $var;
+        $this->has_input_type = true;
+    }
+
+    public function hasInputType()
+    {
+        return $this->has_input_type;
+    }
+
+    /**
+     * <code>optional string output_type = 3;</code>
+     */
+    public function getOutputType()
+    {
+        return $this->output_type;
+    }
+
+    /**
+     * <code>optional string output_type = 3;</code>
+     */
+    public function setOutputType($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->output_type = $var;
+        $this->has_output_type = true;
+    }
+
+    public function hasOutputType()
+    {
+        return $this->has_output_type;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions options = 4;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions options = 4;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+    /**
+     * <pre>
+     * Identifies if client streams multiple client messages
+     * </pre>
+     *
+     * <code>optional bool client_streaming = 5 [default = false];</code>
+     */
+    public function getClientStreaming()
+    {
+        return $this->client_streaming;
+    }
+
+    /**
+     * <pre>
+     * Identifies if client streams multiple client messages
+     * </pre>
+     *
+     * <code>optional bool client_streaming = 5 [default = false];</code>
+     */
+    public function setClientStreaming($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->client_streaming = $var;
+        $this->has_client_streaming = true;
+    }
+
+    public function hasClientStreaming()
+    {
+        return $this->has_client_streaming;
+    }
+
+    /**
+     * <pre>
+     * Identifies if server streams multiple server messages
+     * </pre>
+     *
+     * <code>optional bool server_streaming = 6 [default = false];</code>
+     */
+    public function getServerStreaming()
+    {
+        return $this->server_streaming;
+    }
+
+    /**
+     * <pre>
+     * Identifies if server streams multiple server messages
+     * </pre>
+     *
+     * <code>optional bool server_streaming = 6 [default = false];</code>
+     */
+    public function setServerStreaming($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->server_streaming = $var;
+        $this->has_server_streaming = true;
+    }
+
+    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
new file mode 100644
index 0000000..3325e52
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MethodOptions.php
@@ -0,0 +1,143 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.MethodOptions</code>
+ */
+class MethodOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
+     */
+    private $idempotency_level = 0;
+    private $has_idempotency_level = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
+     */
+    public function getIdempotencyLevel()
+    {
+        return $this->idempotency_level;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
+     */
+    public function setIdempotencyLevel($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\MethodOptions_IdempotencyLevel::class);
+        $this->idempotency_level = $var;
+        $this->has_idempotency_level = true;
+    }
+
+    public function hasIdempotencyLevel()
+    {
+        return $this->has_idempotency_level;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    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
new file mode 100644
index 0000000..62768b5
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php
@@ -0,0 +1,39 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * <pre>
+ * 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.
+ * </pre>
+ *
+ * Protobuf enum <code>google.protobuf.MethodOptions.IdempotencyLevel</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class MethodOptions_IdempotencyLevel
+{
+    /**
+     * <code>IDEMPOTENCY_UNKNOWN = 0;</code>
+     */
+    const IDEMPOTENCY_UNKNOWN = 0;
+    /**
+     * <pre>
+     * implies idempotent
+     * </pre>
+     *
+     * <code>NO_SIDE_EFFECTS = 1;</code>
+     */
+    const NO_SIDE_EFFECTS = 1;
+    /**
+     * <pre>
+     * idempotent, but may have side effects
+     * </pre>
+     *
+     * <code>IDEMPOTENT = 2;</code>
+     */
+    const IDEMPOTENT = 2;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
new file mode 100644
index 0000000..e5fbe37
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
@@ -0,0 +1,86 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a oneof.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.OneofDescriptorProto</code>
+ */
+class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>optional .google.protobuf.OneofOptions options = 2;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.OneofOptions options = 2;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/OneofOptions.php b/php/src/Google/Protobuf/Internal/OneofOptions.php
new file mode 100644
index 0000000..083d992
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/OneofOptions.php
@@ -0,0 +1,66 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.OneofOptions</code>
+ */
+class OneofOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
new file mode 100644
index 0000000..624bde8
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
@@ -0,0 +1,114 @@
+<?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;
+
+/**
+ * <pre>
+ * Describes a service.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.ServiceDescriptorProto</code>
+ */
+class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
+     */
+    private $method;
+    private $has_method = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
+     */
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
+     */
+    public function setMethod(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class);
+        $this->method = $var;
+        $this->has_method = true;
+    }
+
+    public function hasMethod()
+    {
+        return $this->has_method;
+    }
+
+    /**
+     * <code>optional .google.protobuf.ServiceOptions options = 3;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.ServiceOptions options = 3;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    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
new file mode 100644
index 0000000..5f3564e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/ServiceOptions.php
@@ -0,0 +1,115 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.ServiceOptions</code>
+ */
+class ServiceOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    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
new file mode 100644
index 0000000..d2352dd
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/SourceCodeInfo.php
@@ -0,0 +1,191 @@
+<?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;
+
+/**
+ * <pre>
+ * Encapsulates information about the original source file from which a
+ * FileDescriptorProto was generated.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.SourceCodeInfo</code>
+ */
+class SourceCodeInfo extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
+     */
+    public function getLocation()
+    {
+        return $this->location;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
+     */
+    public function setLocation(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class);
+        $this->location = $var;
+        $this->has_location = true;
+    }
+
+    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
new file mode 100644
index 0000000..d1bdb16
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php
@@ -0,0 +1,379 @@
+<?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;
+
+/**
+ * Protobuf type <code>google.protobuf.SourceCodeInfo.Location</code>
+ */
+class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    private $path;
+    private $has_path = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>repeated int32 span = 2 [packed = true];</code>
+     */
+    private $span;
+    private $has_span = false;
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string leading_comments = 3;</code>
+     */
+    private $leading_comments = '';
+    private $has_leading_comments = false;
+    /**
+     * <code>optional string trailing_comments = 4;</code>
+     */
+    private $trailing_comments = '';
+    private $has_trailing_comments = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * <pre>
+     * 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).
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function setPath(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->path = $var;
+        $this->has_path = true;
+    }
+
+    public function hasPath()
+    {
+        return $this->has_path;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>repeated int32 span = 2 [packed = true];</code>
+     */
+    public function getSpan()
+    {
+        return $this->span;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>repeated int32 span = 2 [packed = true];</code>
+     */
+    public function setSpan(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->span = $var;
+        $this->has_span = true;
+    }
+
+    public function hasSpan()
+    {
+        return $this->has_span;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string leading_comments = 3;</code>
+     */
+    public function getLeadingComments()
+    {
+        return $this->leading_comments;
+    }
+
+    /**
+     * <pre>
+     * 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.
+     * </pre>
+     *
+     * <code>optional string leading_comments = 3;</code>
+     */
+    public function setLeadingComments($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->leading_comments = $var;
+        $this->has_leading_comments = true;
+    }
+
+    public function hasLeadingComments()
+    {
+        return $this->has_leading_comments;
+    }
+
+    /**
+     * <code>optional string trailing_comments = 4;</code>
+     */
+    public function getTrailingComments()
+    {
+        return $this->trailing_comments;
+    }
+
+    /**
+     * <code>optional string trailing_comments = 4;</code>
+     */
+    public function setTrailingComments($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trailing_comments = $var;
+        $this->has_trailing_comments = true;
+    }
+
+    public function hasTrailingComments()
+    {
+        return $this->has_trailing_comments;
+    }
+
+    /**
+     * <code>repeated string leading_detached_comments = 6;</code>
+     */
+    public function getLeadingDetachedComments()
+    {
+        return $this->leading_detached_comments;
+    }
+
+    /**
+     * <code>repeated string leading_detached_comments = 6;</code>
+     */
+    public function setLeadingDetachedComments(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
+        $this->leading_detached_comments = $var;
+        $this->has_leading_detached_comments = true;
+    }
+
+    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
new file mode 100644
index 0000000..c0f4831
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/UninterpretedOption.php
@@ -0,0 +1,246 @@
+<?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;
+
+/**
+ * <pre>
+ * 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.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.UninterpretedOption</code>
+ */
+class UninterpretedOption extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
+     */
+    private $name;
+    private $has_name = false;
+    /**
+     * <pre>
+     * The value of the uninterpreted option, in whatever type the tokenizer
+     * identified it as during parsing. Exactly one of these should be set.
+     * </pre>
+     *
+     * <code>optional string identifier_value = 3;</code>
+     */
+    private $identifier_value = '';
+    private $has_identifier_value = false;
+    /**
+     * <code>optional uint64 positive_int_value = 4;</code>
+     */
+    private $positive_int_value = 0;
+    private $has_positive_int_value = false;
+    /**
+     * <code>optional int64 negative_int_value = 5;</code>
+     */
+    private $negative_int_value = 0;
+    private $has_negative_int_value = false;
+    /**
+     * <code>optional double double_value = 6;</code>
+     */
+    private $double_value = 0.0;
+    private $has_double_value = false;
+    /**
+     * <code>optional bytes string_value = 7;</code>
+     */
+    private $string_value = '';
+    private $has_string_value = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
+     */
+    public function setName(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <pre>
+     * The value of the uninterpreted option, in whatever type the tokenizer
+     * identified it as during parsing. Exactly one of these should be set.
+     * </pre>
+     *
+     * <code>optional string identifier_value = 3;</code>
+     */
+    public function getIdentifierValue()
+    {
+        return $this->identifier_value;
+    }
+
+    /**
+     * <pre>
+     * The value of the uninterpreted option, in whatever type the tokenizer
+     * identified it as during parsing. Exactly one of these should be set.
+     * </pre>
+     *
+     * <code>optional string identifier_value = 3;</code>
+     */
+    public function setIdentifierValue($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->identifier_value = $var;
+        $this->has_identifier_value = true;
+    }
+
+    public function hasIdentifierValue()
+    {
+        return $this->has_identifier_value;
+    }
+
+    /**
+     * <code>optional uint64 positive_int_value = 4;</code>
+     */
+    public function getPositiveIntValue()
+    {
+        return $this->positive_int_value;
+    }
+
+    /**
+     * <code>optional uint64 positive_int_value = 4;</code>
+     */
+    public function setPositiveIntValue($var)
+    {
+        GPBUtil::checkUint64($var);
+        $this->positive_int_value = $var;
+        $this->has_positive_int_value = true;
+    }
+
+    public function hasPositiveIntValue()
+    {
+        return $this->has_positive_int_value;
+    }
+
+    /**
+     * <code>optional int64 negative_int_value = 5;</code>
+     */
+    public function getNegativeIntValue()
+    {
+        return $this->negative_int_value;
+    }
+
+    /**
+     * <code>optional int64 negative_int_value = 5;</code>
+     */
+    public function setNegativeIntValue($var)
+    {
+        GPBUtil::checkInt64($var);
+        $this->negative_int_value = $var;
+        $this->has_negative_int_value = true;
+    }
+
+    public function hasNegativeIntValue()
+    {
+        return $this->has_negative_int_value;
+    }
+
+    /**
+     * <code>optional double double_value = 6;</code>
+     */
+    public function getDoubleValue()
+    {
+        return $this->double_value;
+    }
+
+    /**
+     * <code>optional double double_value = 6;</code>
+     */
+    public function setDoubleValue($var)
+    {
+        GPBUtil::checkDouble($var);
+        $this->double_value = $var;
+        $this->has_double_value = true;
+    }
+
+    public function hasDoubleValue()
+    {
+        return $this->has_double_value;
+    }
+
+    /**
+     * <code>optional bytes string_value = 7;</code>
+     */
+    public function getStringValue()
+    {
+        return $this->string_value;
+    }
+
+    /**
+     * <code>optional bytes string_value = 7;</code>
+     */
+    public function setStringValue($var)
+    {
+        GPBUtil::checkString($var, False);
+        $this->string_value = $var;
+        $this->has_string_value = true;
+    }
+
+    public function hasStringValue()
+    {
+        return $this->has_string_value;
+    }
+
+    /**
+     * <code>optional string aggregate_value = 8;</code>
+     */
+    public function getAggregateValue()
+    {
+        return $this->aggregate_value;
+    }
+
+    /**
+     * <code>optional string aggregate_value = 8;</code>
+     */
+    public function setAggregateValue($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->aggregate_value = $var;
+        $this->has_aggregate_value = true;
+    }
+
+    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
new file mode 100644
index 0000000..86484d2
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php
@@ -0,0 +1,90 @@
+<?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;
+
+/**
+ * <pre>
+ * 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".
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.UninterpretedOption.NamePart</code>
+ */
+class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>required string name_part = 1;</code>
+     */
+    private $name_part = '';
+    private $has_name_part = false;
+    /**
+     * <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();
+    }
+
+    /**
+     * <code>required string name_part = 1;</code>
+     */
+    public function getNamePart()
+    {
+        return $this->name_part;
+    }
+
+    /**
+     * <code>required string name_part = 1;</code>
+     */
+    public function setNamePart($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name_part = $var;
+        $this->has_name_part = true;
+    }
+
+    public function hasNamePart()
+    {
+        return $this->has_name_part;
+    }
+
+    /**
+     * <code>required bool is_extension = 2;</code>
+     */
+    public function getIsExtension()
+    {
+        return $this->is_extension;
+    }
+
+    /**
+     * <code>required bool is_extension = 2;</code>
+     */
+    public function setIsExtension($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->is_extension = $var;
+        $this->has_is_extension = true;
+    }
+
+    public function hasIsExtension()
+    {
+        return $this->has_is_extension;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/descriptor_internal.pb.php b/php/src/Google/Protobuf/descriptor_internal.pb.php
deleted file mode 100644
index 161a9f5..0000000
--- a/php/src/Google/Protobuf/descriptor_internal.pb.php
+++ /dev/null
@@ -1,2532 +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\DescriptorPool;
-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;
-
-class FileDescriptorSet extends \Google\Protobuf\Internal\Message
-{
-    private $file;
-    private $has_file = false;
-
-    public function getFile()
-    {
-        return $this->file;
-    }
-
-    public function setFile(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class);
-        $this->file = $var;
-        $this->has_file = true;
-    }
-
-    public function hasFile()
-    {
-        return $this->has_file;
-    }
-
-}
-
-class FileDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $package = '';
-    private $has_package = false;
-    private $dependency;
-    private $has_dependency = false;
-    private $public_dependency;
-    private $has_public_dependency = false;
-    private $weak_dependency;
-    private $has_weak_dependency = false;
-    private $message_type;
-    private $has_message_type = false;
-    private $enum_type;
-    private $has_enum_type = false;
-    private $service;
-    private $has_service = false;
-    private $extension;
-    private $has_extension = false;
-    private $options = null;
-    private $has_options = false;
-    private $source_code_info = null;
-    private $has_source_code_info = false;
-    private $syntax = '';
-    private $has_syntax = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getPackage()
-    {
-        return $this->package;
-    }
-
-    public function setPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->package = $var;
-        $this->has_package = true;
-    }
-
-    public function hasPackage()
-    {
-        return $this->has_package;
-    }
-
-    public function getDependency()
-    {
-        return $this->dependency;
-    }
-
-    public function setDependency(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->dependency = $var;
-        $this->has_dependency = true;
-    }
-
-    public function hasDependency()
-    {
-        return $this->has_dependency;
-    }
-
-    public function getPublicDependency()
-    {
-        return $this->public_dependency;
-    }
-
-    public function setPublicDependency(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->public_dependency = $var;
-        $this->has_public_dependency = true;
-    }
-
-    public function hasPublicDependency()
-    {
-        return $this->has_public_dependency;
-    }
-
-    public function getWeakDependency()
-    {
-        return $this->weak_dependency;
-    }
-
-    public function setWeakDependency(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->weak_dependency = $var;
-        $this->has_weak_dependency = true;
-    }
-
-    public function hasWeakDependency()
-    {
-        return $this->has_weak_dependency;
-    }
-
-    public function getMessageType()
-    {
-        return $this->message_type;
-    }
-
-    public function setMessageType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
-        $this->message_type = $var;
-        $this->has_message_type = true;
-    }
-
-    public function hasMessageType()
-    {
-        return $this->has_message_type;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function setEnumType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
-        $this->enum_type = $var;
-        $this->has_enum_type = true;
-    }
-
-    public function hasEnumType()
-    {
-        return $this->has_enum_type;
-    }
-
-    public function getService()
-    {
-        return $this->service;
-    }
-
-    public function setService(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class);
-        $this->service = $var;
-        $this->has_service = true;
-    }
-
-    public function hasService()
-    {
-        return $this->has_service;
-    }
-
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    public function setExtension(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->extension = $var;
-        $this->has_extension = true;
-    }
-
-    public function hasExtension()
-    {
-        return $this->has_extension;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    public function getSourceCodeInfo()
-    {
-        return $this->source_code_info;
-    }
-
-    public function setSourceCodeInfo(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class);
-        $this->source_code_info = $var;
-        $this->has_source_code_info = true;
-    }
-
-    public function hasSourceCodeInfo()
-    {
-        return $this->has_source_code_info;
-    }
-
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    public function setSyntax($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->syntax = $var;
-        $this->has_syntax = true;
-    }
-
-    public function hasSyntax()
-    {
-        return $this->has_syntax;
-    }
-
-}
-
-class DescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $field;
-    private $has_field = false;
-    private $extension;
-    private $has_extension = false;
-    private $nested_type;
-    private $has_nested_type = false;
-    private $enum_type;
-    private $has_enum_type = false;
-    private $extension_range;
-    private $has_extension_range = false;
-    private $oneof_decl;
-    private $has_oneof_decl = false;
-    private $options = null;
-    private $has_options = false;
-    private $reserved_range;
-    private $has_reserved_range = false;
-    private $reserved_name;
-    private $has_reserved_name = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getField()
-    {
-        return $this->field;
-    }
-
-    public function setField(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->field = $var;
-        $this->has_field = true;
-    }
-
-    public function hasField()
-    {
-        return $this->has_field;
-    }
-
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    public function setExtension(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->extension = $var;
-        $this->has_extension = true;
-    }
-
-    public function hasExtension()
-    {
-        return $this->has_extension;
-    }
-
-    public function getNestedType()
-    {
-        return $this->nested_type;
-    }
-
-    public function setNestedType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
-        $this->nested_type = $var;
-        $this->has_nested_type = true;
-    }
-
-    public function hasNestedType()
-    {
-        return $this->has_nested_type;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function setEnumType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
-        $this->enum_type = $var;
-        $this->has_enum_type = true;
-    }
-
-    public function hasEnumType()
-    {
-        return $this->has_enum_type;
-    }
-
-    public function getExtensionRange()
-    {
-        return $this->extension_range;
-    }
-
-    public function setExtensionRange(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class);
-        $this->extension_range = $var;
-        $this->has_extension_range = true;
-    }
-
-    public function hasExtensionRange()
-    {
-        return $this->has_extension_range;
-    }
-
-    public function getOneofDecl()
-    {
-        return $this->oneof_decl;
-    }
-
-    public function setOneofDecl(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class);
-        $this->oneof_decl = $var;
-        $this->has_oneof_decl = true;
-    }
-
-    public function hasOneofDecl()
-    {
-        return $this->has_oneof_decl;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    public function getReservedRange()
-    {
-        return $this->reserved_range;
-    }
-
-    public function setReservedRange(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class);
-        $this->reserved_range = $var;
-        $this->has_reserved_range = true;
-    }
-
-    public function hasReservedRange()
-    {
-        return $this->has_reserved_range;
-    }
-
-    public function getReservedName()
-    {
-        return $this->reserved_name;
-    }
-
-    public function setReservedName(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->reserved_name = $var;
-        $this->has_reserved_name = true;
-    }
-
-    public function hasReservedName()
-    {
-        return $this->has_reserved_name;
-    }
-
-}
-
-class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message
-{
-    private $start = 0;
-    private $has_start = false;
-    private $end = 0;
-    private $has_end = false;
-
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
-class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message
-{
-    private $start = 0;
-    private $has_start = false;
-    private $end = 0;
-    private $has_end = false;
-
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
-class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $number = 0;
-    private $has_number = false;
-    private $label = 0;
-    private $has_label = false;
-    private $type = 0;
-    private $has_type = false;
-    private $type_name = '';
-    private $has_type_name = false;
-    private $extendee = '';
-    private $has_extendee = false;
-    private $default_value = '';
-    private $has_default_value = false;
-    private $oneof_index = 0;
-    private $has_oneof_index = false;
-    private $json_name = '';
-    private $has_json_name = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-        $this->has_number = true;
-    }
-
-    public function hasNumber()
-    {
-        return $this->has_number;
-    }
-
-    public function getLabel()
-    {
-        return $this->label;
-    }
-
-    public function setLabel($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class);
-        $this->label = $var;
-        $this->has_label = true;
-    }
-
-    public function hasLabel()
-    {
-        return $this->has_label;
-    }
-
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    public function setType($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class);
-        $this->type = $var;
-        $this->has_type = true;
-    }
-
-    public function hasType()
-    {
-        return $this->has_type;
-    }
-
-    public function getTypeName()
-    {
-        return $this->type_name;
-    }
-
-    public function setTypeName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->type_name = $var;
-        $this->has_type_name = true;
-    }
-
-    public function hasTypeName()
-    {
-        return $this->has_type_name;
-    }
-
-    public function getExtendee()
-    {
-        return $this->extendee;
-    }
-
-    public function setExtendee($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->extendee = $var;
-        $this->has_extendee = true;
-    }
-
-    public function hasExtendee()
-    {
-        return $this->has_extendee;
-    }
-
-    public function getDefaultValue()
-    {
-        return $this->default_value;
-    }
-
-    public function setDefaultValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->default_value = $var;
-        $this->has_default_value = true;
-    }
-
-    public function hasDefaultValue()
-    {
-        return $this->has_default_value;
-    }
-
-    public function getOneofIndex()
-    {
-        return $this->oneof_index;
-    }
-
-    public function setOneofIndex($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->oneof_index = $var;
-        $this->has_oneof_index = true;
-    }
-
-    public function hasOneofIndex()
-    {
-        return $this->has_oneof_index;
-    }
-
-    public function getJsonName()
-    {
-        return $this->json_name;
-    }
-
-    public function setJsonName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->json_name = $var;
-        $this->has_json_name = true;
-    }
-
-    public function hasJsonName()
-    {
-        return $this->has_json_name;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class FieldDescriptorProto_Type
-{
-    const TYPE_DOUBLE = 1;
-    const TYPE_FLOAT = 2;
-    const TYPE_INT64 = 3;
-    const TYPE_UINT64 = 4;
-    const TYPE_INT32 = 5;
-    const TYPE_FIXED64 = 6;
-    const TYPE_FIXED32 = 7;
-    const TYPE_BOOL = 8;
-    const TYPE_STRING = 9;
-    const TYPE_GROUP = 10;
-    const TYPE_MESSAGE = 11;
-    const TYPE_BYTES = 12;
-    const TYPE_UINT32 = 13;
-    const TYPE_ENUM = 14;
-    const TYPE_SFIXED32 = 15;
-    const TYPE_SFIXED64 = 16;
-    const TYPE_SINT32 = 17;
-    const TYPE_SINT64 = 18;
-}
-
-class FieldDescriptorProto_Label
-{
-    const LABEL_OPTIONAL = 1;
-    const LABEL_REQUIRED = 2;
-    const LABEL_REPEATED = 3;
-}
-
-class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $value;
-    private $has_value = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    public function setValue(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class);
-        $this->value = $var;
-        $this->has_value = true;
-    }
-
-    public function hasValue()
-    {
-        return $this->has_value;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $number = 0;
-    private $has_number = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-        $this->has_number = true;
-    }
-
-    public function hasNumber()
-    {
-        return $this->has_number;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $method;
-    private $has_method = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getMethod()
-    {
-        return $this->method;
-    }
-
-    public function setMethod(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class);
-        $this->method = $var;
-        $this->has_method = true;
-    }
-
-    public function hasMethod()
-    {
-        return $this->has_method;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $input_type = '';
-    private $has_input_type = false;
-    private $output_type = '';
-    private $has_output_type = false;
-    private $options = null;
-    private $has_options = false;
-    private $client_streaming = false;
-    private $has_client_streaming = false;
-    private $server_streaming = false;
-    private $has_server_streaming = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getInputType()
-    {
-        return $this->input_type;
-    }
-
-    public function setInputType($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->input_type = $var;
-        $this->has_input_type = true;
-    }
-
-    public function hasInputType()
-    {
-        return $this->has_input_type;
-    }
-
-    public function getOutputType()
-    {
-        return $this->output_type;
-    }
-
-    public function setOutputType($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->output_type = $var;
-        $this->has_output_type = true;
-    }
-
-    public function hasOutputType()
-    {
-        return $this->has_output_type;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    public function getClientStreaming()
-    {
-        return $this->client_streaming;
-    }
-
-    public function setClientStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->client_streaming = $var;
-        $this->has_client_streaming = true;
-    }
-
-    public function hasClientStreaming()
-    {
-        return $this->has_client_streaming;
-    }
-
-    public function getServerStreaming()
-    {
-        return $this->server_streaming;
-    }
-
-    public function setServerStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->server_streaming = $var;
-        $this->has_server_streaming = true;
-    }
-
-    public function hasServerStreaming()
-    {
-        return $this->has_server_streaming;
-    }
-
-}
-
-class FileOptions extends \Google\Protobuf\Internal\Message
-{
-    private $java_package = '';
-    private $has_java_package = false;
-    private $java_outer_classname = '';
-    private $has_java_outer_classname = false;
-    private $java_multiple_files = false;
-    private $has_java_multiple_files = false;
-    private $java_generate_equals_and_hash = false;
-    private $has_java_generate_equals_and_hash = false;
-    private $java_string_check_utf8 = false;
-    private $has_java_string_check_utf8 = false;
-    private $optimize_for = 0;
-    private $has_optimize_for = false;
-    private $go_package = '';
-    private $has_go_package = false;
-    private $cc_generic_services = false;
-    private $has_cc_generic_services = false;
-    private $java_generic_services = false;
-    private $has_java_generic_services = false;
-    private $py_generic_services = false;
-    private $has_py_generic_services = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $cc_enable_arenas = false;
-    private $has_cc_enable_arenas = false;
-    private $objc_class_prefix = '';
-    private $has_objc_class_prefix = false;
-    private $csharp_namespace = '';
-    private $has_csharp_namespace = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getJavaPackage()
-    {
-        return $this->java_package;
-    }
-
-    public function setJavaPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->java_package = $var;
-        $this->has_java_package = true;
-    }
-
-    public function hasJavaPackage()
-    {
-        return $this->has_java_package;
-    }
-
-    public function getJavaOuterClassname()
-    {
-        return $this->java_outer_classname;
-    }
-
-    public function setJavaOuterClassname($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->java_outer_classname = $var;
-        $this->has_java_outer_classname = true;
-    }
-
-    public function hasJavaOuterClassname()
-    {
-        return $this->has_java_outer_classname;
-    }
-
-    public function getJavaMultipleFiles()
-    {
-        return $this->java_multiple_files;
-    }
-
-    public function setJavaMultipleFiles($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_multiple_files = $var;
-        $this->has_java_multiple_files = true;
-    }
-
-    public function hasJavaMultipleFiles()
-    {
-        return $this->has_java_multiple_files;
-    }
-
-    public function getJavaGenerateEqualsAndHash()
-    {
-        return $this->java_generate_equals_and_hash;
-    }
-
-    public function setJavaGenerateEqualsAndHash($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_generate_equals_and_hash = $var;
-        $this->has_java_generate_equals_and_hash = true;
-    }
-
-    public function hasJavaGenerateEqualsAndHash()
-    {
-        return $this->has_java_generate_equals_and_hash;
-    }
-
-    public function getJavaStringCheckUtf8()
-    {
-        return $this->java_string_check_utf8;
-    }
-
-    public function setJavaStringCheckUtf8($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_string_check_utf8 = $var;
-        $this->has_java_string_check_utf8 = true;
-    }
-
-    public function hasJavaStringCheckUtf8()
-    {
-        return $this->has_java_string_check_utf8;
-    }
-
-    public function getOptimizeFor()
-    {
-        return $this->optimize_for;
-    }
-
-    public function setOptimizeFor($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class);
-        $this->optimize_for = $var;
-        $this->has_optimize_for = true;
-    }
-
-    public function hasOptimizeFor()
-    {
-        return $this->has_optimize_for;
-    }
-
-    public function getGoPackage()
-    {
-        return $this->go_package;
-    }
-
-    public function setGoPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->go_package = $var;
-        $this->has_go_package = true;
-    }
-
-    public function hasGoPackage()
-    {
-        return $this->has_go_package;
-    }
-
-    public function getCcGenericServices()
-    {
-        return $this->cc_generic_services;
-    }
-
-    public function setCcGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->cc_generic_services = $var;
-        $this->has_cc_generic_services = true;
-    }
-
-    public function hasCcGenericServices()
-    {
-        return $this->has_cc_generic_services;
-    }
-
-    public function getJavaGenericServices()
-    {
-        return $this->java_generic_services;
-    }
-
-    public function setJavaGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_generic_services = $var;
-        $this->has_java_generic_services = true;
-    }
-
-    public function hasJavaGenericServices()
-    {
-        return $this->has_java_generic_services;
-    }
-
-    public function getPyGenericServices()
-    {
-        return $this->py_generic_services;
-    }
-
-    public function setPyGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->py_generic_services = $var;
-        $this->has_py_generic_services = true;
-    }
-
-    public function hasPyGenericServices()
-    {
-        return $this->has_py_generic_services;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getCcEnableArenas()
-    {
-        return $this->cc_enable_arenas;
-    }
-
-    public function setCcEnableArenas($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->cc_enable_arenas = $var;
-        $this->has_cc_enable_arenas = true;
-    }
-
-    public function hasCcEnableArenas()
-    {
-        return $this->has_cc_enable_arenas;
-    }
-
-    public function getObjcClassPrefix()
-    {
-        return $this->objc_class_prefix;
-    }
-
-    public function setObjcClassPrefix($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->objc_class_prefix = $var;
-        $this->has_objc_class_prefix = true;
-    }
-
-    public function hasObjcClassPrefix()
-    {
-        return $this->has_objc_class_prefix;
-    }
-
-    public function getCsharpNamespace()
-    {
-        return $this->csharp_namespace;
-    }
-
-    public function setCsharpNamespace($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->csharp_namespace = $var;
-        $this->has_csharp_namespace = true;
-    }
-
-    public function hasCsharpNamespace()
-    {
-        return $this->has_csharp_namespace;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class FileOptions_OptimizeMode
-{
-    const SPEED = 1;
-    const CODE_SIZE = 2;
-    const LITE_RUNTIME = 3;
-}
-
-class MessageOptions extends \Google\Protobuf\Internal\Message
-{
-    private $message_set_wire_format = false;
-    private $has_message_set_wire_format = false;
-    private $no_standard_descriptor_accessor = false;
-    private $has_no_standard_descriptor_accessor = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $map_entry = false;
-    private $has_map_entry = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getMessageSetWireFormat()
-    {
-        return $this->message_set_wire_format;
-    }
-
-    public function setMessageSetWireFormat($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->message_set_wire_format = $var;
-        $this->has_message_set_wire_format = true;
-    }
-
-    public function hasMessageSetWireFormat()
-    {
-        return $this->has_message_set_wire_format;
-    }
-
-    public function getNoStandardDescriptorAccessor()
-    {
-        return $this->no_standard_descriptor_accessor;
-    }
-
-    public function setNoStandardDescriptorAccessor($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->no_standard_descriptor_accessor = $var;
-        $this->has_no_standard_descriptor_accessor = true;
-    }
-
-    public function hasNoStandardDescriptorAccessor()
-    {
-        return $this->has_no_standard_descriptor_accessor;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getMapEntry()
-    {
-        return $this->map_entry;
-    }
-
-    public function setMapEntry($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->map_entry = $var;
-        $this->has_map_entry = true;
-    }
-
-    public function hasMapEntry()
-    {
-        return $this->has_map_entry;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class FieldOptions extends \Google\Protobuf\Internal\Message
-{
-    private $ctype = 0;
-    private $has_ctype = false;
-    private $packed = false;
-    private $has_packed = false;
-    private $jstype = 0;
-    private $has_jstype = false;
-    private $lazy = false;
-    private $has_lazy = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $weak = false;
-    private $has_weak = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getCtype()
-    {
-        return $this->ctype;
-    }
-
-    public function setCtype($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class);
-        $this->ctype = $var;
-        $this->has_ctype = true;
-    }
-
-    public function hasCtype()
-    {
-        return $this->has_ctype;
-    }
-
-    public function getPacked()
-    {
-        return $this->packed;
-    }
-
-    public function setPacked($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->packed = $var;
-        $this->has_packed = true;
-    }
-
-    public function hasPacked()
-    {
-        return $this->has_packed;
-    }
-
-    public function getJstype()
-    {
-        return $this->jstype;
-    }
-
-    public function setJstype($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class);
-        $this->jstype = $var;
-        $this->has_jstype = true;
-    }
-
-    public function hasJstype()
-    {
-        return $this->has_jstype;
-    }
-
-    public function getLazy()
-    {
-        return $this->lazy;
-    }
-
-    public function setLazy($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->lazy = $var;
-        $this->has_lazy = true;
-    }
-
-    public function hasLazy()
-    {
-        return $this->has_lazy;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getWeak()
-    {
-        return $this->weak;
-    }
-
-    public function setWeak($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->weak = $var;
-        $this->has_weak = true;
-    }
-
-    public function hasWeak()
-    {
-        return $this->has_weak;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class FieldOptions_CType
-{
-    const STRING = 0;
-    const CORD = 1;
-    const STRING_PIECE = 2;
-}
-
-class FieldOptions_JSType
-{
-    const JS_NORMAL = 0;
-    const JS_STRING = 1;
-    const JS_NUMBER = 2;
-}
-
-class OneofOptions extends \Google\Protobuf\Internal\Message
-{
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class EnumOptions extends \Google\Protobuf\Internal\Message
-{
-    private $allow_alias = false;
-    private $has_allow_alias = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getAllowAlias()
-    {
-        return $this->allow_alias;
-    }
-
-    public function setAllowAlias($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->allow_alias = $var;
-        $this->has_allow_alias = true;
-    }
-
-    public function hasAllowAlias()
-    {
-        return $this->has_allow_alias;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class EnumValueOptions extends \Google\Protobuf\Internal\Message
-{
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class ServiceOptions extends \Google\Protobuf\Internal\Message
-{
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class MethodOptions extends \Google\Protobuf\Internal\Message
-{
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class UninterpretedOption extends \Google\Protobuf\Internal\Message
-{
-    private $name;
-    private $has_name = false;
-    private $identifier_value = '';
-    private $has_identifier_value = false;
-    private $positive_int_value = 0;
-    private $has_positive_int_value = false;
-    private $negative_int_value = 0;
-    private $has_negative_int_value = false;
-    private $double_value = 0.0;
-    private $has_double_value = false;
-    private $string_value = '';
-    private $has_string_value = false;
-    private $aggregate_value = '';
-    private $has_aggregate_value = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getIdentifierValue()
-    {
-        return $this->identifier_value;
-    }
-
-    public function setIdentifierValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->identifier_value = $var;
-        $this->has_identifier_value = true;
-    }
-
-    public function hasIdentifierValue()
-    {
-        return $this->has_identifier_value;
-    }
-
-    public function getPositiveIntValue()
-    {
-        return $this->positive_int_value;
-    }
-
-    public function setPositiveIntValue($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->positive_int_value = $var;
-        $this->has_positive_int_value = true;
-    }
-
-    public function hasPositiveIntValue()
-    {
-        return $this->has_positive_int_value;
-    }
-
-    public function getNegativeIntValue()
-    {
-        return $this->negative_int_value;
-    }
-
-    public function setNegativeIntValue($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->negative_int_value = $var;
-        $this->has_negative_int_value = true;
-    }
-
-    public function hasNegativeIntValue()
-    {
-        return $this->has_negative_int_value;
-    }
-
-    public function getDoubleValue()
-    {
-        return $this->double_value;
-    }
-
-    public function setDoubleValue($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->double_value = $var;
-        $this->has_double_value = true;
-    }
-
-    public function hasDoubleValue()
-    {
-        return $this->has_double_value;
-    }
-
-    public function getStringValue()
-    {
-        return $this->string_value;
-    }
-
-    public function setStringValue($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->string_value = $var;
-        $this->has_string_value = true;
-    }
-
-    public function hasStringValue()
-    {
-        return $this->has_string_value;
-    }
-
-    public function getAggregateValue()
-    {
-        return $this->aggregate_value;
-    }
-
-    public function setAggregateValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->aggregate_value = $var;
-        $this->has_aggregate_value = true;
-    }
-
-    public function hasAggregateValue()
-    {
-        return $this->has_aggregate_value;
-    }
-
-}
-
-class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message
-{
-    private $name_part = '';
-    private $has_name_part = false;
-    private $is_extension = false;
-    private $has_is_extension = false;
-
-    public function getNamePart()
-    {
-        return $this->name_part;
-    }
-
-    public function setNamePart($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name_part = $var;
-        $this->has_name_part = true;
-    }
-
-    public function hasNamePart()
-    {
-        return $this->has_name_part;
-    }
-
-    public function getIsExtension()
-    {
-        return $this->is_extension;
-    }
-
-    public function setIsExtension($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->is_extension = $var;
-        $this->has_is_extension = true;
-    }
-
-    public function hasIsExtension()
-    {
-        return $this->has_is_extension;
-    }
-
-}
-
-class SourceCodeInfo extends \Google\Protobuf\Internal\Message
-{
-    private $location;
-    private $has_location = false;
-
-    public function getLocation()
-    {
-        return $this->location;
-    }
-
-    public function setLocation(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class);
-        $this->location = $var;
-        $this->has_location = true;
-    }
-
-    public function hasLocation()
-    {
-        return $this->has_location;
-    }
-
-}
-
-class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message
-{
-    private $path;
-    private $has_path = false;
-    private $span;
-    private $has_span = false;
-    private $leading_comments = '';
-    private $has_leading_comments = false;
-    private $trailing_comments = '';
-    private $has_trailing_comments = false;
-    private $leading_detached_comments;
-    private $has_leading_detached_comments = false;
-
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    public function setPath(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->path = $var;
-        $this->has_path = true;
-    }
-
-    public function hasPath()
-    {
-        return $this->has_path;
-    }
-
-    public function getSpan()
-    {
-        return $this->span;
-    }
-
-    public function setSpan(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->span = $var;
-        $this->has_span = true;
-    }
-
-    public function hasSpan()
-    {
-        return $this->has_span;
-    }
-
-    public function getLeadingComments()
-    {
-        return $this->leading_comments;
-    }
-
-    public function setLeadingComments($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->leading_comments = $var;
-        $this->has_leading_comments = true;
-    }
-
-    public function hasLeadingComments()
-    {
-        return $this->has_leading_comments;
-    }
-
-    public function getTrailingComments()
-    {
-        return $this->trailing_comments;
-    }
-
-    public function setTrailingComments($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->trailing_comments = $var;
-        $this->has_trailing_comments = true;
-    }
-
-    public function hasTrailingComments()
-    {
-        return $this->has_trailing_comments;
-    }
-
-    public function getLeadingDetachedComments()
-    {
-        return $this->leading_detached_comments;
-    }
-
-    public function setLeadingDetachedComments(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->leading_detached_comments = $var;
-        $this->has_leading_detached_comments = true;
-    }
-
-    public function hasLeadingDetachedComments()
-    {
-        return $this->has_leading_detached_comments;
-    }
-
-}
-
-class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
-{
-    private $annotation;
-    private $has_annotation = false;
-
-    public function getAnnotation()
-    {
-        return $this->annotation;
-    }
-
-    public function setAnnotation(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class);
-        $this->annotation = $var;
-        $this->has_annotation = true;
-    }
-
-    public function hasAnnotation()
-    {
-        return $this->has_annotation;
-    }
-
-}
-
-class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message
-{
-    private $path;
-    private $has_path = false;
-    private $source_file = '';
-    private $has_source_file = false;
-    private $begin = 0;
-    private $has_begin = false;
-    private $end = 0;
-    private $has_end = false;
-
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    public function setPath(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->path = $var;
-        $this->has_path = true;
-    }
-
-    public function hasPath()
-    {
-        return $this->has_path;
-    }
-
-    public function getSourceFile()
-    {
-        return $this->source_file;
-    }
-
-    public function setSourceFile($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->source_file = $var;
-        $this->has_source_file = true;
-    }
-
-    public function hasSourceFile()
-    {
-        return $this->has_source_file;
-    }
-
-    public function getBegin()
-    {
-        return $this->begin;
-    }
-
-    public function setBegin($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->begin = $var;
-        $this->has_begin = true;
-    }
-
-    public function hasBegin()
-    {
-        return $this->has_begin;
-    }
-
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->addMessage('google.protobuf.internal.FileDescriptorSet', FileDescriptorSet::class)
-    ->repeated('file', GPBType::MESSAGE, 1, 'google.protobuf.internal.FileDescriptorProto')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FileDescriptorProto', FileDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('package', GPBType::STRING, 2)
-    ->repeated('dependency', GPBType::STRING, 3)
-    ->repeated('public_dependency', GPBType::INT32, 10)
-    ->repeated('weak_dependency', GPBType::INT32, 11)
-    ->repeated('message_type', GPBType::MESSAGE, 4, 'google.protobuf.internal.DescriptorProto')
-    ->repeated('enum_type', GPBType::MESSAGE, 5, 'google.protobuf.internal.EnumDescriptorProto')
-    ->repeated('service', GPBType::MESSAGE, 6, 'google.protobuf.internal.ServiceDescriptorProto')
-    ->repeated('extension', GPBType::MESSAGE, 7, 'google.protobuf.internal.FieldDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 8, 'google.protobuf.internal.FileOptions')
-    ->optional('source_code_info', GPBType::MESSAGE, 9, 'google.protobuf.internal.SourceCodeInfo')
-    ->optional('syntax', GPBType::STRING, 12)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.DescriptorProto', DescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->repeated('field', GPBType::MESSAGE, 2, 'google.protobuf.internal.FieldDescriptorProto')
-    ->repeated('extension', GPBType::MESSAGE, 6, 'google.protobuf.internal.FieldDescriptorProto')
-    ->repeated('nested_type', GPBType::MESSAGE, 3, 'google.protobuf.internal.DescriptorProto')
-    ->repeated('enum_type', GPBType::MESSAGE, 4, 'google.protobuf.internal.EnumDescriptorProto')
-    ->repeated('extension_range', GPBType::MESSAGE, 5, 'google.protobuf.internal.DescriptorProto.ExtensionRange')
-    ->repeated('oneof_decl', GPBType::MESSAGE, 8, 'google.protobuf.internal.OneofDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 7, 'google.protobuf.internal.MessageOptions')
-    ->repeated('reserved_range', GPBType::MESSAGE, 9, 'google.protobuf.internal.DescriptorProto.ReservedRange')
-    ->repeated('reserved_name', GPBType::STRING, 10)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.DescriptorProto.ExtensionRange', DescriptorProto_ExtensionRange::class)
-    ->optional('start', GPBType::INT32, 1)
-    ->optional('end', GPBType::INT32, 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.DescriptorProto.ReservedRange', DescriptorProto_ReservedRange::class)
-    ->optional('start', GPBType::INT32, 1)
-    ->optional('end', GPBType::INT32, 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FieldDescriptorProto', FieldDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('number', GPBType::INT32, 3)
-    ->optional('label', GPBType::ENUM, 4, 'google.protobuf.internal.FieldDescriptorProto.Label')
-    ->optional('type', GPBType::ENUM, 5, 'google.protobuf.internal.FieldDescriptorProto.Type')
-    ->optional('type_name', GPBType::STRING, 6)
-    ->optional('extendee', GPBType::STRING, 2)
-    ->optional('default_value', GPBType::STRING, 7)
-    ->optional('oneof_index', GPBType::INT32, 9)
-    ->optional('json_name', GPBType::STRING, 10)
-    ->optional('options', GPBType::MESSAGE, 8, 'google.protobuf.internal.FieldOptions')
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Type', 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', Label::class)
-    ->value("LABEL_OPTIONAL", 1)
-    ->value("LABEL_REQUIRED", 2)
-    ->value("LABEL_REPEATED", 3)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.OneofDescriptorProto', OneofDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('options', GPBType::MESSAGE, 2, 'google.protobuf.internal.OneofOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumDescriptorProto', EnumDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->repeated('value', GPBType::MESSAGE, 2, 'google.protobuf.internal.EnumValueDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumValueDescriptorProto', EnumValueDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('number', GPBType::INT32, 2)
-    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumValueOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.ServiceDescriptorProto', ServiceDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->repeated('method', GPBType::MESSAGE, 2, 'google.protobuf.internal.MethodDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.ServiceOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.MethodDescriptorProto', MethodDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('input_type', GPBType::STRING, 2)
-    ->optional('output_type', GPBType::STRING, 3)
-    ->optional('options', GPBType::MESSAGE, 4, 'google.protobuf.internal.MethodOptions')
-    ->optional('client_streaming', GPBType::BOOL, 5)
-    ->optional('server_streaming', GPBType::BOOL, 6)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FileOptions', FileOptions::class)
-    ->optional('java_package', GPBType::STRING, 1)
-    ->optional('java_outer_classname', GPBType::STRING, 8)
-    ->optional('java_multiple_files', GPBType::BOOL, 10)
-    ->optional('java_generate_equals_and_hash', GPBType::BOOL, 20)
-    ->optional('java_string_check_utf8', GPBType::BOOL, 27)
-    ->optional('optimize_for', GPBType::ENUM, 9, 'google.protobuf.internal.FileOptions.OptimizeMode')
-    ->optional('go_package', GPBType::STRING, 11)
-    ->optional('cc_generic_services', GPBType::BOOL, 16)
-    ->optional('java_generic_services', GPBType::BOOL, 17)
-    ->optional('py_generic_services', GPBType::BOOL, 18)
-    ->optional('deprecated', GPBType::BOOL, 23)
-    ->optional('cc_enable_arenas', GPBType::BOOL, 31)
-    ->optional('objc_class_prefix', GPBType::STRING, 36)
-    ->optional('csharp_namespace', GPBType::STRING, 37)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FileOptions.OptimizeMode', OptimizeMode::class)
-    ->value("SPEED", 1)
-    ->value("CODE_SIZE", 2)
-    ->value("LITE_RUNTIME", 3)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.MessageOptions', MessageOptions::class)
-    ->optional('message_set_wire_format', GPBType::BOOL, 1)
-    ->optional('no_standard_descriptor_accessor', GPBType::BOOL, 2)
-    ->optional('deprecated', GPBType::BOOL, 3)
-    ->optional('map_entry', GPBType::BOOL, 7)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FieldOptions', FieldOptions::class)
-    ->optional('ctype', GPBType::ENUM, 1, 'google.protobuf.internal.FieldOptions.CType')
-    ->optional('packed', GPBType::BOOL, 2)
-    ->optional('jstype', GPBType::ENUM, 6, 'google.protobuf.internal.FieldOptions.JSType')
-    ->optional('lazy', GPBType::BOOL, 5)
-    ->optional('deprecated', GPBType::BOOL, 3)
-    ->optional('weak', GPBType::BOOL, 10)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldOptions.CType', CType::class)
-    ->value("STRING", 0)
-    ->value("CORD", 1)
-    ->value("STRING_PIECE", 2)
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldOptions.JSType', JSType::class)
-    ->value("JS_NORMAL", 0)
-    ->value("JS_STRING", 1)
-    ->value("JS_NUMBER", 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.OneofOptions', OneofOptions::class)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumOptions', EnumOptions::class)
-    ->optional('allow_alias', GPBType::BOOL, 2)
-    ->optional('deprecated', GPBType::BOOL, 3)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumValueOptions', EnumValueOptions::class)
-    ->optional('deprecated', GPBType::BOOL, 1)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.ServiceOptions', ServiceOptions::class)
-    ->optional('deprecated', GPBType::BOOL, 33)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.MethodOptions', MethodOptions::class)
-    ->optional('deprecated', GPBType::BOOL, 33)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.UninterpretedOption', UninterpretedOption::class)
-    ->repeated('name', GPBType::MESSAGE, 2, 'google.protobuf.internal.UninterpretedOption.NamePart')
-    ->optional('identifier_value', GPBType::STRING, 3)
-    ->optional('positive_int_value', GPBType::UINT64, 4)
-    ->optional('negative_int_value', GPBType::INT64, 5)
-    ->optional('double_value', GPBType::DOUBLE, 6)
-    ->optional('string_value', GPBType::BYTES, 7)
-    ->optional('aggregate_value', GPBType::STRING, 8)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.UninterpretedOption.NamePart', UninterpretedOption_NamePart::class)
-    ->required('name_part', GPBType::STRING, 1)
-    ->required('is_extension', GPBType::BOOL, 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.SourceCodeInfo', SourceCodeInfo::class)
-    ->repeated('location', GPBType::MESSAGE, 1, 'google.protobuf.internal.SourceCodeInfo.Location')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.SourceCodeInfo.Location', SourceCodeInfo_Location::class)
-    ->repeated('path', GPBType::INT32, 1)
-    ->repeated('span', GPBType::INT32, 2)
-    ->optional('leading_comments', GPBType::STRING, 3)
-    ->optional('trailing_comments', GPBType::STRING, 4)
-    ->repeated('leading_detached_comments', GPBType::STRING, 6)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.GeneratedCodeInfo', GeneratedCodeInfo::class)
-    ->repeated('annotation', GPBType::MESSAGE, 1, 'google.protobuf.internal.GeneratedCodeInfo.Annotation')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.GeneratedCodeInfo.Annotation', GeneratedCodeInfo_Annotation::class)
-    ->repeated('path', GPBType::INT32, 1)
-    ->optional('source_file', GPBType::STRING, 2)
-    ->optional('begin', GPBType::INT32, 3)
-    ->optional('end', GPBType::INT32, 4)
-    ->finalizeToPool();
-
-$pool->finish();
diff --git a/php/tests/array_test.php b/php/tests/array_test.php
index a79a08b..a4cad71 100644
--- a/php/tests/array_test.php
+++ b/php/tests/array_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\RepeatedField;
diff --git a/php/tests/autoload.php b/php/tests/autoload.php
new file mode 100755
index 0000000..0a917fc
--- /dev/null
+++ b/php/tests/autoload.php
@@ -0,0 +1,25 @@
+<?php
+
+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;
+    }
+
+}
+
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
index d07907c..af9c041 100644
--- a/php/tests/encode_decode_test.php
+++ b/php/tests/encode_decode_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_base.php');
 require_once('test_util.php');
 
diff --git a/php/tests/gdb_test.sh b/php/tests/gdb_test.sh
new file mode 100755
index 0000000..3c0d97a
--- /dev/null
+++ b/php/tests/gdb_test.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# 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
index b3ecd3a..27912ec 100644
--- a/php/tests/generated_class_test.php
+++ b/php/tests/generated_class_test.php
@@ -1,7 +1,6 @@
 <?php
 
-require_once('test.pb.php');
-require_once('test_no_namespace.pb.php');
+require_once('generated/NoNameSpace.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\RepeatedField;
diff --git a/php/tests/google/protobuf/empty.pb.php b/php/tests/google/protobuf/empty.pb.php
deleted file mode 100644
index fdd0fe4..0000000
--- a/php/tests/google/protobuf/empty.pb.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/empty.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-class GPBEmpty extends \Google\Protobuf\Internal\Message
-{
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0ab7010a1b676f6f676c652f70726f746f6275662f656d7074792e70726f" .
-    "746f120f676f6f676c652e70726f746f62756622070a05456d7074794276" .
-    "0a13636f6d2e676f6f676c652e70726f746f627566420a456d7074795072" .
-    "6f746f50015a276769746875622e636f6d2f676f6c616e672f70726f746f" .
-    "6275662f7074797065732f656d707479f80101a20203475042aa021e476f" .
-    "6f676c652e50726f746f6275662e57656c6c4b6e6f776e54797065736206" .
-    "70726f746f33"
-));
-
diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php
index 4e42361..d4ec44f 100644
--- a/php/tests/map_field_test.php
+++ b/php/tests/map_field_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\GPBType;
diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php
index ec54597..af32727 100644
--- a/php/tests/memory_leak_test.php
+++ b/php/tests/memory_leak_test.php
@@ -2,7 +2,15 @@
 
 # phpunit has memory leak by itself. Thus, it cannot be used to test memory leak.
 
-require_once('test.pb.php');
+require_once('generated/Bar/TestInclude.php');
+require_once('generated/Foo/TestEnum.php');
+require_once('generated/Foo/TestMessage.php');
+require_once('generated/Foo/TestMessage_Sub.php');
+require_once('generated/Foo/TestPackedMessage.php');
+require_once('generated/Foo/TestPhpDoc.php');
+require_once('generated/Foo/TestUnpackedMessage.php');
+require_once('generated/GPBMetadata/Proto/Test.php');
+require_once('generated/GPBMetadata/Proto/TestInclude.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\RepeatedField;
diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php
index 485956c..4f626f1 100644
--- a/php/tests/php_implementation_test.php
+++ b/php/tests/php_implementation_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_base.php');
 require_once('test_util.php');
 
diff --git a/php/tests/test.proto b/php/tests/proto/test.proto
similarity index 98%
rename from php/tests/test.proto
rename to php/tests/proto/test.proto
index f15f629..fc283a0 100644
--- a/php/tests/test.proto
+++ b/php/tests/proto/test.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
 
-import 'test_include.proto';
+import 'proto/test_include.proto';
 
 package foo;
 
diff --git a/php/tests/test_include.proto b/php/tests/proto/test_include.proto
similarity index 100%
rename from php/tests/test_include.proto
rename to php/tests/proto/test_include.proto
diff --git a/php/tests/test_no_namespace.proto b/php/tests/proto/test_no_namespace.proto
similarity index 100%
rename from php/tests/test_no_namespace.proto
rename to php/tests/proto/test_no_namespace.proto
diff --git a/php/tests/test.pb.php b/php/tests/test.pb.php
deleted file mode 100644
index 87332ae..0000000
--- a/php/tests/test.pb.php
+++ /dev/null
@@ -1,2325 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test.proto
-
-namespace Foo;
-
-require_once('test_include.pb.php');
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Protobuf type <code>foo.TestMessage</code>
- */
-class TestMessage extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <pre>
-     * Singular
-     * </pre>
-     *
-     * <code>optional int32 optional_int32 = 1;</code>
-     */
-    private $optional_int32 = 0;
-    /**
-     * <code>optional int64 optional_int64 = 2;</code>
-     */
-    private $optional_int64 = 0;
-    /**
-     * <code>optional uint32 optional_uint32 = 3;</code>
-     */
-    private $optional_uint32 = 0;
-    /**
-     * <code>optional uint64 optional_uint64 = 4;</code>
-     */
-    private $optional_uint64 = 0;
-    /**
-     * <code>optional sint32 optional_sint32 = 5;</code>
-     */
-    private $optional_sint32 = 0;
-    /**
-     * <code>optional sint64 optional_sint64 = 6;</code>
-     */
-    private $optional_sint64 = 0;
-    /**
-     * <code>optional fixed32 optional_fixed32 = 7;</code>
-     */
-    private $optional_fixed32 = 0;
-    /**
-     * <code>optional fixed64 optional_fixed64 = 8;</code>
-     */
-    private $optional_fixed64 = 0;
-    /**
-     * <code>optional sfixed32 optional_sfixed32 = 9;</code>
-     */
-    private $optional_sfixed32 = 0;
-    /**
-     * <code>optional sfixed64 optional_sfixed64 = 10;</code>
-     */
-    private $optional_sfixed64 = 0;
-    /**
-     * <code>optional float optional_float = 11;</code>
-     */
-    private $optional_float = 0.0;
-    /**
-     * <code>optional double optional_double = 12;</code>
-     */
-    private $optional_double = 0.0;
-    /**
-     * <code>optional bool optional_bool = 13;</code>
-     */
-    private $optional_bool = false;
-    /**
-     * <code>optional string optional_string = 14;</code>
-     */
-    private $optional_string = '';
-    /**
-     * <code>optional bytes optional_bytes = 15;</code>
-     */
-    private $optional_bytes = '';
-    /**
-     * <code>optional .foo.TestEnum optional_enum = 16;</code>
-     */
-    private $optional_enum = 0;
-    /**
-     * <code>optional .foo.TestMessage.Sub optional_message = 17;</code>
-     */
-    private $optional_message = null;
-    /**
-     * <code>optional .bar.TestInclude optional_included_message = 18;</code>
-     */
-    private $optional_included_message = null;
-    /**
-     * <code>optional .foo.TestMessage recursive = 19;</code>
-     */
-    private $recursive = null;
-    /**
-     * <pre>
-     * Repeated
-     * </pre>
-     *
-     * <code>repeated int32 repeated_int32 = 31;</code>
-     */
-    private $repeated_int32;
-    /**
-     * <code>repeated int64 repeated_int64 = 32;</code>
-     */
-    private $repeated_int64;
-    /**
-     * <code>repeated uint32 repeated_uint32 = 33;</code>
-     */
-    private $repeated_uint32;
-    /**
-     * <code>repeated uint64 repeated_uint64 = 34;</code>
-     */
-    private $repeated_uint64;
-    /**
-     * <code>repeated sint32 repeated_sint32 = 35;</code>
-     */
-    private $repeated_sint32;
-    /**
-     * <code>repeated sint64 repeated_sint64 = 36;</code>
-     */
-    private $repeated_sint64;
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 37;</code>
-     */
-    private $repeated_fixed32;
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 38;</code>
-     */
-    private $repeated_fixed64;
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 39;</code>
-     */
-    private $repeated_sfixed32;
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 40;</code>
-     */
-    private $repeated_sfixed64;
-    /**
-     * <code>repeated float repeated_float = 41;</code>
-     */
-    private $repeated_float;
-    /**
-     * <code>repeated double repeated_double = 42;</code>
-     */
-    private $repeated_double;
-    /**
-     * <code>repeated bool repeated_bool = 43;</code>
-     */
-    private $repeated_bool;
-    /**
-     * <code>repeated string repeated_string = 44;</code>
-     */
-    private $repeated_string;
-    /**
-     * <code>repeated bytes repeated_bytes = 45;</code>
-     */
-    private $repeated_bytes;
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 46;</code>
-     */
-    private $repeated_enum;
-    /**
-     * <code>repeated .foo.TestMessage.Sub repeated_message = 47;</code>
-     */
-    private $repeated_message;
-    /**
-     * <code>repeated .foo.TestMessage repeated_recursive = 48;</code>
-     */
-    private $repeated_recursive;
-    /**
-     * <code>map&lt;int32, int32&gt; map_int32_int32 = 71;</code>
-     */
-    private $map_int32_int32;
-    /**
-     * <code>map&lt;int64, int64&gt; map_int64_int64 = 72;</code>
-     */
-    private $map_int64_int64;
-    /**
-     * <code>map&lt;uint32, uint32&gt; map_uint32_uint32 = 73;</code>
-     */
-    private $map_uint32_uint32;
-    /**
-     * <code>map&lt;uint64, uint64&gt; map_uint64_uint64 = 74;</code>
-     */
-    private $map_uint64_uint64;
-    /**
-     * <code>map&lt;sint32, sint32&gt; map_sint32_sint32 = 75;</code>
-     */
-    private $map_sint32_sint32;
-    /**
-     * <code>map&lt;sint64, sint64&gt; map_sint64_sint64 = 76;</code>
-     */
-    private $map_sint64_sint64;
-    /**
-     * <code>map&lt;fixed32, fixed32&gt; map_fixed32_fixed32 = 77;</code>
-     */
-    private $map_fixed32_fixed32;
-    /**
-     * <code>map&lt;fixed64, fixed64&gt; map_fixed64_fixed64 = 78;</code>
-     */
-    private $map_fixed64_fixed64;
-    /**
-     * <code>map&lt;sfixed32, sfixed32&gt; map_sfixed32_sfixed32 = 79;</code>
-     */
-    private $map_sfixed32_sfixed32;
-    /**
-     * <code>map&lt;sfixed64, sfixed64&gt; map_sfixed64_sfixed64 = 80;</code>
-     */
-    private $map_sfixed64_sfixed64;
-    /**
-     * <code>map&lt;int32, float&gt; map_int32_float = 81;</code>
-     */
-    private $map_int32_float;
-    /**
-     * <code>map&lt;int32, double&gt; map_int32_double = 82;</code>
-     */
-    private $map_int32_double;
-    /**
-     * <code>map&lt;bool, bool&gt; map_bool_bool = 83;</code>
-     */
-    private $map_bool_bool;
-    /**
-     * <code>map&lt;string, string&gt; map_string_string = 84;</code>
-     */
-    private $map_string_string;
-    /**
-     * <code>map&lt;int32, bytes&gt; map_int32_bytes = 85;</code>
-     */
-    private $map_int32_bytes;
-    /**
-     * <code>map&lt;int32, .foo.TestEnum&gt; map_int32_enum = 86;</code>
-     */
-    private $map_int32_enum;
-    /**
-     * <code>map&lt;int32, .foo.TestMessage.Sub&gt; map_int32_message = 87;</code>
-     */
-    private $map_int32_message;
-    /**
-     * <code>map&lt;int32, .foo.TestMessage&gt; map_recursive = 88;</code>
-     */
-    private $map_recursive;
-    protected $my_oneof;
-
-    /**
-     * <pre>
-     * Singular
-     * </pre>
-     *
-     * <code>optional int32 optional_int32 = 1;</code>
-     */
-    public function getOptionalInt32()
-    {
-        return $this->optional_int32;
-    }
-
-    /**
-     * <pre>
-     * Singular
-     * </pre>
-     *
-     * <code>optional int32 optional_int32 = 1;</code>
-     */
-    public function setOptionalInt32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->optional_int32 = $var;
-    }
-
-    /**
-     * <code>optional int64 optional_int64 = 2;</code>
-     */
-    public function getOptionalInt64()
-    {
-        return $this->optional_int64;
-    }
-
-    /**
-     * <code>optional int64 optional_int64 = 2;</code>
-     */
-    public function setOptionalInt64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->optional_int64 = $var;
-    }
-
-    /**
-     * <code>optional uint32 optional_uint32 = 3;</code>
-     */
-    public function getOptionalUint32()
-    {
-        return $this->optional_uint32;
-    }
-
-    /**
-     * <code>optional uint32 optional_uint32 = 3;</code>
-     */
-    public function setOptionalUint32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->optional_uint32 = $var;
-    }
-
-    /**
-     * <code>optional uint64 optional_uint64 = 4;</code>
-     */
-    public function getOptionalUint64()
-    {
-        return $this->optional_uint64;
-    }
-
-    /**
-     * <code>optional uint64 optional_uint64 = 4;</code>
-     */
-    public function setOptionalUint64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->optional_uint64 = $var;
-    }
-
-    /**
-     * <code>optional sint32 optional_sint32 = 5;</code>
-     */
-    public function getOptionalSint32()
-    {
-        return $this->optional_sint32;
-    }
-
-    /**
-     * <code>optional sint32 optional_sint32 = 5;</code>
-     */
-    public function setOptionalSint32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->optional_sint32 = $var;
-    }
-
-    /**
-     * <code>optional sint64 optional_sint64 = 6;</code>
-     */
-    public function getOptionalSint64()
-    {
-        return $this->optional_sint64;
-    }
-
-    /**
-     * <code>optional sint64 optional_sint64 = 6;</code>
-     */
-    public function setOptionalSint64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->optional_sint64 = $var;
-    }
-
-    /**
-     * <code>optional fixed32 optional_fixed32 = 7;</code>
-     */
-    public function getOptionalFixed32()
-    {
-        return $this->optional_fixed32;
-    }
-
-    /**
-     * <code>optional fixed32 optional_fixed32 = 7;</code>
-     */
-    public function setOptionalFixed32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->optional_fixed32 = $var;
-    }
-
-    /**
-     * <code>optional fixed64 optional_fixed64 = 8;</code>
-     */
-    public function getOptionalFixed64()
-    {
-        return $this->optional_fixed64;
-    }
-
-    /**
-     * <code>optional fixed64 optional_fixed64 = 8;</code>
-     */
-    public function setOptionalFixed64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->optional_fixed64 = $var;
-    }
-
-    /**
-     * <code>optional sfixed32 optional_sfixed32 = 9;</code>
-     */
-    public function getOptionalSfixed32()
-    {
-        return $this->optional_sfixed32;
-    }
-
-    /**
-     * <code>optional sfixed32 optional_sfixed32 = 9;</code>
-     */
-    public function setOptionalSfixed32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->optional_sfixed32 = $var;
-    }
-
-    /**
-     * <code>optional sfixed64 optional_sfixed64 = 10;</code>
-     */
-    public function getOptionalSfixed64()
-    {
-        return $this->optional_sfixed64;
-    }
-
-    /**
-     * <code>optional sfixed64 optional_sfixed64 = 10;</code>
-     */
-    public function setOptionalSfixed64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->optional_sfixed64 = $var;
-    }
-
-    /**
-     * <code>optional float optional_float = 11;</code>
-     */
-    public function getOptionalFloat()
-    {
-        return $this->optional_float;
-    }
-
-    /**
-     * <code>optional float optional_float = 11;</code>
-     */
-    public function setOptionalFloat($var)
-    {
-        GPBUtil::checkFloat($var);
-        $this->optional_float = $var;
-    }
-
-    /**
-     * <code>optional double optional_double = 12;</code>
-     */
-    public function getOptionalDouble()
-    {
-        return $this->optional_double;
-    }
-
-    /**
-     * <code>optional double optional_double = 12;</code>
-     */
-    public function setOptionalDouble($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->optional_double = $var;
-    }
-
-    /**
-     * <code>optional bool optional_bool = 13;</code>
-     */
-    public function getOptionalBool()
-    {
-        return $this->optional_bool;
-    }
-
-    /**
-     * <code>optional bool optional_bool = 13;</code>
-     */
-    public function setOptionalBool($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->optional_bool = $var;
-    }
-
-    /**
-     * <code>optional string optional_string = 14;</code>
-     */
-    public function getOptionalString()
-    {
-        return $this->optional_string;
-    }
-
-    /**
-     * <code>optional string optional_string = 14;</code>
-     */
-    public function setOptionalString($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->optional_string = $var;
-    }
-
-    /**
-     * <code>optional bytes optional_bytes = 15;</code>
-     */
-    public function getOptionalBytes()
-    {
-        return $this->optional_bytes;
-    }
-
-    /**
-     * <code>optional bytes optional_bytes = 15;</code>
-     */
-    public function setOptionalBytes($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->optional_bytes = $var;
-    }
-
-    /**
-     * <code>optional .foo.TestEnum optional_enum = 16;</code>
-     */
-    public function getOptionalEnum()
-    {
-        return $this->optional_enum;
-    }
-
-    /**
-     * <code>optional .foo.TestEnum optional_enum = 16;</code>
-     */
-    public function setOptionalEnum($var)
-    {
-        GPBUtil::checkEnum($var, \Foo\TestEnum::class);
-        $this->optional_enum = $var;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub optional_message = 17;</code>
-     */
-    public function getOptionalMessage()
-    {
-        return $this->optional_message;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub optional_message = 17;</code>
-     */
-    public function setOptionalMessage(&$var)
-    {
-        GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class);
-        $this->optional_message = $var;
-    }
-
-    /**
-     * <code>optional .bar.TestInclude optional_included_message = 18;</code>
-     */
-    public function getOptionalIncludedMessage()
-    {
-        return $this->optional_included_message;
-    }
-
-    /**
-     * <code>optional .bar.TestInclude optional_included_message = 18;</code>
-     */
-    public function setOptionalIncludedMessage(&$var)
-    {
-        GPBUtil::checkMessage($var, \Bar\TestInclude::class);
-        $this->optional_included_message = $var;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage recursive = 19;</code>
-     */
-    public function getRecursive()
-    {
-        return $this->recursive;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage recursive = 19;</code>
-     */
-    public function setRecursive(&$var)
-    {
-        GPBUtil::checkMessage($var, \Foo\TestMessage::class);
-        $this->recursive = $var;
-    }
-
-    /**
-     * <pre>
-     * Repeated
-     * </pre>
-     *
-     * <code>repeated int32 repeated_int32 = 31;</code>
-     */
-    public function getRepeatedInt32()
-    {
-        return $this->repeated_int32;
-    }
-
-    /**
-     * <pre>
-     * Repeated
-     * </pre>
-     *
-     * <code>repeated int32 repeated_int32 = 31;</code>
-     */
-    public function setRepeatedInt32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->repeated_int32 = $var;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 32;</code>
-     */
-    public function getRepeatedInt64()
-    {
-        return $this->repeated_int64;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 32;</code>
-     */
-    public function setRepeatedInt64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT64);
-        $this->repeated_int64 = $var;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 33;</code>
-     */
-    public function getRepeatedUint32()
-    {
-        return $this->repeated_uint32;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 33;</code>
-     */
-    public function setRepeatedUint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT32);
-        $this->repeated_uint32 = $var;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 34;</code>
-     */
-    public function getRepeatedUint64()
-    {
-        return $this->repeated_uint64;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 34;</code>
-     */
-    public function setRepeatedUint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT64);
-        $this->repeated_uint64 = $var;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 35;</code>
-     */
-    public function getRepeatedSint32()
-    {
-        return $this->repeated_sint32;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 35;</code>
-     */
-    public function setRepeatedSint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT32);
-        $this->repeated_sint32 = $var;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 36;</code>
-     */
-    public function getRepeatedSint64()
-    {
-        return $this->repeated_sint64;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 36;</code>
-     */
-    public function setRepeatedSint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT64);
-        $this->repeated_sint64 = $var;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 37;</code>
-     */
-    public function getRepeatedFixed32()
-    {
-        return $this->repeated_fixed32;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 37;</code>
-     */
-    public function setRepeatedFixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
-        $this->repeated_fixed32 = $var;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 38;</code>
-     */
-    public function getRepeatedFixed64()
-    {
-        return $this->repeated_fixed64;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 38;</code>
-     */
-    public function setRepeatedFixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
-        $this->repeated_fixed64 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 39;</code>
-     */
-    public function getRepeatedSfixed32()
-    {
-        return $this->repeated_sfixed32;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 39;</code>
-     */
-    public function setRepeatedSfixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
-        $this->repeated_sfixed32 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 40;</code>
-     */
-    public function getRepeatedSfixed64()
-    {
-        return $this->repeated_sfixed64;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 40;</code>
-     */
-    public function setRepeatedSfixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
-        $this->repeated_sfixed64 = $var;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 41;</code>
-     */
-    public function getRepeatedFloat()
-    {
-        return $this->repeated_float;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 41;</code>
-     */
-    public function setRepeatedFloat(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
-        $this->repeated_float = $var;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 42;</code>
-     */
-    public function getRepeatedDouble()
-    {
-        return $this->repeated_double;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 42;</code>
-     */
-    public function setRepeatedDouble(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
-        $this->repeated_double = $var;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 43;</code>
-     */
-    public function getRepeatedBool()
-    {
-        return $this->repeated_bool;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 43;</code>
-     */
-    public function setRepeatedBool(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BOOL);
-        $this->repeated_bool = $var;
-    }
-
-    /**
-     * <code>repeated string repeated_string = 44;</code>
-     */
-    public function getRepeatedString()
-    {
-        return $this->repeated_string;
-    }
-
-    /**
-     * <code>repeated string repeated_string = 44;</code>
-     */
-    public function setRepeatedString(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->repeated_string = $var;
-    }
-
-    /**
-     * <code>repeated bytes repeated_bytes = 45;</code>
-     */
-    public function getRepeatedBytes()
-    {
-        return $this->repeated_bytes;
-    }
-
-    /**
-     * <code>repeated bytes repeated_bytes = 45;</code>
-     */
-    public function setRepeatedBytes(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BYTES);
-        $this->repeated_bytes = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 46;</code>
-     */
-    public function getRepeatedEnum()
-    {
-        return $this->repeated_enum;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 46;</code>
-     */
-    public function setRepeatedEnum(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
-        $this->repeated_enum = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage.Sub repeated_message = 47;</code>
-     */
-    public function getRepeatedMessage()
-    {
-        return $this->repeated_message;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage.Sub repeated_message = 47;</code>
-     */
-    public function setRepeatedMessage(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage_Sub::class);
-        $this->repeated_message = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage repeated_recursive = 48;</code>
-     */
-    public function getRepeatedRecursive()
-    {
-        return $this->repeated_recursive;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage repeated_recursive = 48;</code>
-     */
-    public function setRepeatedRecursive(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage::class);
-        $this->repeated_recursive = $var;
-    }
-
-    /**
-     * <code>optional int32 oneof_int32 = 51;</code>
-     */
-    public function getOneofInt32()
-    {
-        return $this->readOneof(51);
-    }
-
-    /**
-     * <code>optional int32 oneof_int32 = 51;</code>
-     */
-    public function setOneofInt32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->writeOneof(51, $var);
-    }
-
-    /**
-     * <code>optional int64 oneof_int64 = 52;</code>
-     */
-    public function getOneofInt64()
-    {
-        return $this->readOneof(52);
-    }
-
-    /**
-     * <code>optional int64 oneof_int64 = 52;</code>
-     */
-    public function setOneofInt64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->writeOneof(52, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_uint32 = 53;</code>
-     */
-    public function getOneofUint32()
-    {
-        return $this->readOneof(53);
-    }
-
-    /**
-     * <code>optional uint32 oneof_uint32 = 53;</code>
-     */
-    public function setOneofUint32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(53, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_uint64 = 54;</code>
-     */
-    public function getOneofUint64()
-    {
-        return $this->readOneof(54);
-    }
-
-    /**
-     * <code>optional uint64 oneof_uint64 = 54;</code>
-     */
-    public function setOneofUint64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(54, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sint32 = 55;</code>
-     */
-    public function getOneofSint32()
-    {
-        return $this->readOneof(55);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sint32 = 55;</code>
-     */
-    public function setOneofSint32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(55, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sint64 = 56;</code>
-     */
-    public function getOneofSint64()
-    {
-        return $this->readOneof(56);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sint64 = 56;</code>
-     */
-    public function setOneofSint64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(56, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_fixed32 = 57;</code>
-     */
-    public function getOneofFixed32()
-    {
-        return $this->readOneof(57);
-    }
-
-    /**
-     * <code>optional uint32 oneof_fixed32 = 57;</code>
-     */
-    public function setOneofFixed32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(57, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_fixed64 = 58;</code>
-     */
-    public function getOneofFixed64()
-    {
-        return $this->readOneof(58);
-    }
-
-    /**
-     * <code>optional uint64 oneof_fixed64 = 58;</code>
-     */
-    public function setOneofFixed64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(58, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sfixed32 = 59;</code>
-     */
-    public function getOneofSfixed32()
-    {
-        return $this->readOneof(59);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sfixed32 = 59;</code>
-     */
-    public function setOneofSfixed32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(59, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sfixed64 = 60;</code>
-     */
-    public function getOneofSfixed64()
-    {
-        return $this->readOneof(60);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sfixed64 = 60;</code>
-     */
-    public function setOneofSfixed64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(60, $var);
-    }
-
-    /**
-     * <code>optional double oneof_double = 61;</code>
-     */
-    public function getOneofDouble()
-    {
-        return $this->readOneof(61);
-    }
-
-    /**
-     * <code>optional double oneof_double = 61;</code>
-     */
-    public function setOneofDouble($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->writeOneof(61, $var);
-    }
-
-    /**
-     * <code>optional float oneof_float = 62;</code>
-     */
-    public function getOneofFloat()
-    {
-        return $this->readOneof(62);
-    }
-
-    /**
-     * <code>optional float oneof_float = 62;</code>
-     */
-    public function setOneofFloat($var)
-    {
-        GPBUtil::checkFloat($var);
-        $this->writeOneof(62, $var);
-    }
-
-    /**
-     * <code>optional bool oneof_bool = 63;</code>
-     */
-    public function getOneofBool()
-    {
-        return $this->readOneof(63);
-    }
-
-    /**
-     * <code>optional bool oneof_bool = 63;</code>
-     */
-    public function setOneofBool($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->writeOneof(63, $var);
-    }
-
-    /**
-     * <code>optional string oneof_string = 64;</code>
-     */
-    public function getOneofString()
-    {
-        return $this->readOneof(64);
-    }
-
-    /**
-     * <code>optional string oneof_string = 64;</code>
-     */
-    public function setOneofString($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->writeOneof(64, $var);
-    }
-
-    /**
-     * <code>optional bytes oneof_bytes = 65;</code>
-     */
-    public function getOneofBytes()
-    {
-        return $this->readOneof(65);
-    }
-
-    /**
-     * <code>optional bytes oneof_bytes = 65;</code>
-     */
-    public function setOneofBytes($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->writeOneof(65, $var);
-    }
-
-    /**
-     * <code>optional .foo.TestEnum oneof_enum = 66;</code>
-     */
-    public function getOneofEnum()
-    {
-        return $this->readOneof(66);
-    }
-
-    /**
-     * <code>optional .foo.TestEnum oneof_enum = 66;</code>
-     */
-    public function setOneofEnum($var)
-    {
-        GPBUtil::checkEnum($var, \Foo\TestEnum::class);
-        $this->writeOneof(66, $var);
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub oneof_message = 67;</code>
-     */
-    public function getOneofMessage()
-    {
-        return $this->readOneof(67);
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub oneof_message = 67;</code>
-     */
-    public function setOneofMessage(&$var)
-    {
-        GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class);
-        $this->writeOneof(67, $var);
-    }
-
-    /**
-     * <code>map&lt;int32, int32&gt; map_int32_int32 = 71;</code>
-     */
-    public function getMapInt32Int32()
-    {
-        return $this->map_int32_int32;
-    }
-
-    /**
-     * <code>map&lt;int32, int32&gt; map_int32_int32 = 71;</code>
-     */
-    public function setMapInt32Int32(&$var)
-    {
-        $this->map_int32_int32 = $var;
-    }
-
-    /**
-     * <code>map&lt;int64, int64&gt; map_int64_int64 = 72;</code>
-     */
-    public function getMapInt64Int64()
-    {
-        return $this->map_int64_int64;
-    }
-
-    /**
-     * <code>map&lt;int64, int64&gt; map_int64_int64 = 72;</code>
-     */
-    public function setMapInt64Int64(&$var)
-    {
-        $this->map_int64_int64 = $var;
-    }
-
-    /**
-     * <code>map&lt;uint32, uint32&gt; map_uint32_uint32 = 73;</code>
-     */
-    public function getMapUint32Uint32()
-    {
-        return $this->map_uint32_uint32;
-    }
-
-    /**
-     * <code>map&lt;uint32, uint32&gt; map_uint32_uint32 = 73;</code>
-     */
-    public function setMapUint32Uint32(&$var)
-    {
-        $this->map_uint32_uint32 = $var;
-    }
-
-    /**
-     * <code>map&lt;uint64, uint64&gt; map_uint64_uint64 = 74;</code>
-     */
-    public function getMapUint64Uint64()
-    {
-        return $this->map_uint64_uint64;
-    }
-
-    /**
-     * <code>map&lt;uint64, uint64&gt; map_uint64_uint64 = 74;</code>
-     */
-    public function setMapUint64Uint64(&$var)
-    {
-        $this->map_uint64_uint64 = $var;
-    }
-
-    /**
-     * <code>map&lt;sint32, sint32&gt; map_sint32_sint32 = 75;</code>
-     */
-    public function getMapSint32Sint32()
-    {
-        return $this->map_sint32_sint32;
-    }
-
-    /**
-     * <code>map&lt;sint32, sint32&gt; map_sint32_sint32 = 75;</code>
-     */
-    public function setMapSint32Sint32(&$var)
-    {
-        $this->map_sint32_sint32 = $var;
-    }
-
-    /**
-     * <code>map&lt;sint64, sint64&gt; map_sint64_sint64 = 76;</code>
-     */
-    public function getMapSint64Sint64()
-    {
-        return $this->map_sint64_sint64;
-    }
-
-    /**
-     * <code>map&lt;sint64, sint64&gt; map_sint64_sint64 = 76;</code>
-     */
-    public function setMapSint64Sint64(&$var)
-    {
-        $this->map_sint64_sint64 = $var;
-    }
-
-    /**
-     * <code>map&lt;fixed32, fixed32&gt; map_fixed32_fixed32 = 77;</code>
-     */
-    public function getMapFixed32Fixed32()
-    {
-        return $this->map_fixed32_fixed32;
-    }
-
-    /**
-     * <code>map&lt;fixed32, fixed32&gt; map_fixed32_fixed32 = 77;</code>
-     */
-    public function setMapFixed32Fixed32(&$var)
-    {
-        $this->map_fixed32_fixed32 = $var;
-    }
-
-    /**
-     * <code>map&lt;fixed64, fixed64&gt; map_fixed64_fixed64 = 78;</code>
-     */
-    public function getMapFixed64Fixed64()
-    {
-        return $this->map_fixed64_fixed64;
-    }
-
-    /**
-     * <code>map&lt;fixed64, fixed64&gt; map_fixed64_fixed64 = 78;</code>
-     */
-    public function setMapFixed64Fixed64(&$var)
-    {
-        $this->map_fixed64_fixed64 = $var;
-    }
-
-    /**
-     * <code>map&lt;sfixed32, sfixed32&gt; map_sfixed32_sfixed32 = 79;</code>
-     */
-    public function getMapSfixed32Sfixed32()
-    {
-        return $this->map_sfixed32_sfixed32;
-    }
-
-    /**
-     * <code>map&lt;sfixed32, sfixed32&gt; map_sfixed32_sfixed32 = 79;</code>
-     */
-    public function setMapSfixed32Sfixed32(&$var)
-    {
-        $this->map_sfixed32_sfixed32 = $var;
-    }
-
-    /**
-     * <code>map&lt;sfixed64, sfixed64&gt; map_sfixed64_sfixed64 = 80;</code>
-     */
-    public function getMapSfixed64Sfixed64()
-    {
-        return $this->map_sfixed64_sfixed64;
-    }
-
-    /**
-     * <code>map&lt;sfixed64, sfixed64&gt; map_sfixed64_sfixed64 = 80;</code>
-     */
-    public function setMapSfixed64Sfixed64(&$var)
-    {
-        $this->map_sfixed64_sfixed64 = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, float&gt; map_int32_float = 81;</code>
-     */
-    public function getMapInt32Float()
-    {
-        return $this->map_int32_float;
-    }
-
-    /**
-     * <code>map&lt;int32, float&gt; map_int32_float = 81;</code>
-     */
-    public function setMapInt32Float(&$var)
-    {
-        $this->map_int32_float = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, double&gt; map_int32_double = 82;</code>
-     */
-    public function getMapInt32Double()
-    {
-        return $this->map_int32_double;
-    }
-
-    /**
-     * <code>map&lt;int32, double&gt; map_int32_double = 82;</code>
-     */
-    public function setMapInt32Double(&$var)
-    {
-        $this->map_int32_double = $var;
-    }
-
-    /**
-     * <code>map&lt;bool, bool&gt; map_bool_bool = 83;</code>
-     */
-    public function getMapBoolBool()
-    {
-        return $this->map_bool_bool;
-    }
-
-    /**
-     * <code>map&lt;bool, bool&gt; map_bool_bool = 83;</code>
-     */
-    public function setMapBoolBool(&$var)
-    {
-        $this->map_bool_bool = $var;
-    }
-
-    /**
-     * <code>map&lt;string, string&gt; map_string_string = 84;</code>
-     */
-    public function getMapStringString()
-    {
-        return $this->map_string_string;
-    }
-
-    /**
-     * <code>map&lt;string, string&gt; map_string_string = 84;</code>
-     */
-    public function setMapStringString(&$var)
-    {
-        $this->map_string_string = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, bytes&gt; map_int32_bytes = 85;</code>
-     */
-    public function getMapInt32Bytes()
-    {
-        return $this->map_int32_bytes;
-    }
-
-    /**
-     * <code>map&lt;int32, bytes&gt; map_int32_bytes = 85;</code>
-     */
-    public function setMapInt32Bytes(&$var)
-    {
-        $this->map_int32_bytes = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestEnum&gt; map_int32_enum = 86;</code>
-     */
-    public function getMapInt32Enum()
-    {
-        return $this->map_int32_enum;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestEnum&gt; map_int32_enum = 86;</code>
-     */
-    public function setMapInt32Enum(&$var)
-    {
-        $this->map_int32_enum = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage.Sub&gt; map_int32_message = 87;</code>
-     */
-    public function getMapInt32Message()
-    {
-        return $this->map_int32_message;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage.Sub&gt; map_int32_message = 87;</code>
-     */
-    public function setMapInt32Message(&$var)
-    {
-        $this->map_int32_message = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage&gt; map_recursive = 88;</code>
-     */
-    public function getMapRecursive()
-    {
-        return $this->map_recursive;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage&gt; map_recursive = 88;</code>
-     */
-    public function setMapRecursive(&$var)
-    {
-        $this->map_recursive = $var;
-    }
-
-    public function getMyOneof()
-    {
-        return $this->my_oneof;
-    }
-
-}
-
-/**
- * Protobuf type <code>foo.TestMessage.Sub</code>
- */
-class TestMessage_Sub extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    private $a = 0;
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-/**
- * Protobuf type <code>foo.TestPackedMessage</code>
- */
-class TestPackedMessage extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = true];</code>
-     */
-    private $repeated_int32;
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = true];</code>
-     */
-    private $repeated_int64;
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = true];</code>
-     */
-    private $repeated_uint32;
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = true];</code>
-     */
-    private $repeated_uint64;
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = true];</code>
-     */
-    private $repeated_sint32;
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = true];</code>
-     */
-    private $repeated_sint64;
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = true];</code>
-     */
-    private $repeated_fixed32;
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = true];</code>
-     */
-    private $repeated_fixed64;
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = true];</code>
-     */
-    private $repeated_sfixed32;
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = true];</code>
-     */
-    private $repeated_sfixed64;
-    /**
-     * <code>repeated float repeated_float = 100 [packed = true];</code>
-     */
-    private $repeated_float;
-    /**
-     * <code>repeated double repeated_double = 101 [packed = true];</code>
-     */
-    private $repeated_double;
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = true];</code>
-     */
-    private $repeated_bool;
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = true];</code>
-     */
-    private $repeated_enum;
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = true];</code>
-     */
-    public function getRepeatedInt32()
-    {
-        return $this->repeated_int32;
-    }
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = true];</code>
-     */
-    public function setRepeatedInt32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->repeated_int32 = $var;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = true];</code>
-     */
-    public function getRepeatedInt64()
-    {
-        return $this->repeated_int64;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = true];</code>
-     */
-    public function setRepeatedInt64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT64);
-        $this->repeated_int64 = $var;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = true];</code>
-     */
-    public function getRepeatedUint32()
-    {
-        return $this->repeated_uint32;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = true];</code>
-     */
-    public function setRepeatedUint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT32);
-        $this->repeated_uint32 = $var;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = true];</code>
-     */
-    public function getRepeatedUint64()
-    {
-        return $this->repeated_uint64;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = true];</code>
-     */
-    public function setRepeatedUint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT64);
-        $this->repeated_uint64 = $var;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = true];</code>
-     */
-    public function getRepeatedSint32()
-    {
-        return $this->repeated_sint32;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = true];</code>
-     */
-    public function setRepeatedSint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT32);
-        $this->repeated_sint32 = $var;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = true];</code>
-     */
-    public function getRepeatedSint64()
-    {
-        return $this->repeated_sint64;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = true];</code>
-     */
-    public function setRepeatedSint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT64);
-        $this->repeated_sint64 = $var;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = true];</code>
-     */
-    public function getRepeatedFixed32()
-    {
-        return $this->repeated_fixed32;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = true];</code>
-     */
-    public function setRepeatedFixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
-        $this->repeated_fixed32 = $var;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = true];</code>
-     */
-    public function getRepeatedFixed64()
-    {
-        return $this->repeated_fixed64;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = true];</code>
-     */
-    public function setRepeatedFixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
-        $this->repeated_fixed64 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = true];</code>
-     */
-    public function getRepeatedSfixed32()
-    {
-        return $this->repeated_sfixed32;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = true];</code>
-     */
-    public function setRepeatedSfixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
-        $this->repeated_sfixed32 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = true];</code>
-     */
-    public function getRepeatedSfixed64()
-    {
-        return $this->repeated_sfixed64;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = true];</code>
-     */
-    public function setRepeatedSfixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
-        $this->repeated_sfixed64 = $var;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = true];</code>
-     */
-    public function getRepeatedFloat()
-    {
-        return $this->repeated_float;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = true];</code>
-     */
-    public function setRepeatedFloat(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
-        $this->repeated_float = $var;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = true];</code>
-     */
-    public function getRepeatedDouble()
-    {
-        return $this->repeated_double;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = true];</code>
-     */
-    public function setRepeatedDouble(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
-        $this->repeated_double = $var;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = true];</code>
-     */
-    public function getRepeatedBool()
-    {
-        return $this->repeated_bool;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = true];</code>
-     */
-    public function setRepeatedBool(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BOOL);
-        $this->repeated_bool = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = true];</code>
-     */
-    public function getRepeatedEnum()
-    {
-        return $this->repeated_enum;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = true];</code>
-     */
-    public function setRepeatedEnum(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
-        $this->repeated_enum = $var;
-    }
-
-}
-
-/**
- * <pre>
- * Need to be in sync with TestPackedMessage.
- * </pre>
- *
- * Protobuf type <code>foo.TestUnpackedMessage</code>
- */
-class TestUnpackedMessage extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = false];</code>
-     */
-    private $repeated_int32;
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = false];</code>
-     */
-    private $repeated_int64;
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = false];</code>
-     */
-    private $repeated_uint32;
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = false];</code>
-     */
-    private $repeated_uint64;
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = false];</code>
-     */
-    private $repeated_sint32;
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = false];</code>
-     */
-    private $repeated_sint64;
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = false];</code>
-     */
-    private $repeated_fixed32;
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = false];</code>
-     */
-    private $repeated_fixed64;
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = false];</code>
-     */
-    private $repeated_sfixed32;
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = false];</code>
-     */
-    private $repeated_sfixed64;
-    /**
-     * <code>repeated float repeated_float = 100 [packed = false];</code>
-     */
-    private $repeated_float;
-    /**
-     * <code>repeated double repeated_double = 101 [packed = false];</code>
-     */
-    private $repeated_double;
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = false];</code>
-     */
-    private $repeated_bool;
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = false];</code>
-     */
-    private $repeated_enum;
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = false];</code>
-     */
-    public function getRepeatedInt32()
-    {
-        return $this->repeated_int32;
-    }
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = false];</code>
-     */
-    public function setRepeatedInt32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->repeated_int32 = $var;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = false];</code>
-     */
-    public function getRepeatedInt64()
-    {
-        return $this->repeated_int64;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = false];</code>
-     */
-    public function setRepeatedInt64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT64);
-        $this->repeated_int64 = $var;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = false];</code>
-     */
-    public function getRepeatedUint32()
-    {
-        return $this->repeated_uint32;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = false];</code>
-     */
-    public function setRepeatedUint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT32);
-        $this->repeated_uint32 = $var;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = false];</code>
-     */
-    public function getRepeatedUint64()
-    {
-        return $this->repeated_uint64;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = false];</code>
-     */
-    public function setRepeatedUint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT64);
-        $this->repeated_uint64 = $var;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = false];</code>
-     */
-    public function getRepeatedSint32()
-    {
-        return $this->repeated_sint32;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = false];</code>
-     */
-    public function setRepeatedSint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT32);
-        $this->repeated_sint32 = $var;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = false];</code>
-     */
-    public function getRepeatedSint64()
-    {
-        return $this->repeated_sint64;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = false];</code>
-     */
-    public function setRepeatedSint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT64);
-        $this->repeated_sint64 = $var;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = false];</code>
-     */
-    public function getRepeatedFixed32()
-    {
-        return $this->repeated_fixed32;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = false];</code>
-     */
-    public function setRepeatedFixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
-        $this->repeated_fixed32 = $var;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = false];</code>
-     */
-    public function getRepeatedFixed64()
-    {
-        return $this->repeated_fixed64;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = false];</code>
-     */
-    public function setRepeatedFixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
-        $this->repeated_fixed64 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = false];</code>
-     */
-    public function getRepeatedSfixed32()
-    {
-        return $this->repeated_sfixed32;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = false];</code>
-     */
-    public function setRepeatedSfixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
-        $this->repeated_sfixed32 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = false];</code>
-     */
-    public function getRepeatedSfixed64()
-    {
-        return $this->repeated_sfixed64;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = false];</code>
-     */
-    public function setRepeatedSfixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
-        $this->repeated_sfixed64 = $var;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = false];</code>
-     */
-    public function getRepeatedFloat()
-    {
-        return $this->repeated_float;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = false];</code>
-     */
-    public function setRepeatedFloat(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
-        $this->repeated_float = $var;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = false];</code>
-     */
-    public function getRepeatedDouble()
-    {
-        return $this->repeated_double;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = false];</code>
-     */
-    public function setRepeatedDouble(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
-        $this->repeated_double = $var;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = false];</code>
-     */
-    public function getRepeatedBool()
-    {
-        return $this->repeated_bool;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = false];</code>
-     */
-    public function setRepeatedBool(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BOOL);
-        $this->repeated_bool = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = false];</code>
-     */
-    public function getRepeatedEnum()
-    {
-        return $this->repeated_enum;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = false];</code>
-     */
-    public function setRepeatedEnum(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
-        $this->repeated_enum = $var;
-    }
-
-}
-
-/**
- * <pre>
- * /&#42;*&#47;&#64;&lt;&gt;&amp;&#92;{
- * </pre>
- *
- * Protobuf type <code>foo.TestPhpDoc</code>
- */
-class TestPhpDoc extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    private $a = 0;
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-/**
- * Protobuf enum <code>foo.TestEnum</code>
- */
-class TestEnum
-{
-    /**
-     * <code>ZERO = 0;</code>
-     */
-    const ZERO = 0;
-    /**
-     * <code>ONE = 1;</code>
-     */
-    const ONE = 1;
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0a9c250a0a746573742e70726f746f1203666f6f1a12746573745f696e63" .
-    "6c7564652e70726f746f22be1d0a0b546573744d65737361676512160a0e" .
-    "6f7074696f6e616c5f696e74333218012001280512160a0e6f7074696f6e" .
-    "616c5f696e74363418022001280312170a0f6f7074696f6e616c5f75696e" .
-    "74333218032001280d12170a0f6f7074696f6e616c5f75696e7436341804" .
-    "2001280412170a0f6f7074696f6e616c5f73696e74333218052001281112" .
-    "170a0f6f7074696f6e616c5f73696e74363418062001281212180a106f70" .
-    "74696f6e616c5f6669786564333218072001280712180a106f7074696f6e" .
-    "616c5f6669786564363418082001280612190a116f7074696f6e616c5f73" .
-    "6669786564333218092001280f12190a116f7074696f6e616c5f73666978" .
-    "65643634180a2001281012160a0e6f7074696f6e616c5f666c6f6174180b" .
-    "2001280212170a0f6f7074696f6e616c5f646f75626c65180c2001280112" .
-    "150a0d6f7074696f6e616c5f626f6f6c180d2001280812170a0f6f707469" .
-    "6f6e616c5f737472696e67180e2001280912160a0e6f7074696f6e616c5f" .
-    "6279746573180f2001280c12240a0d6f7074696f6e616c5f656e756d1810" .
-    "2001280e320d2e666f6f2e54657374456e756d122e0a106f7074696f6e61" .
-    "6c5f6d65737361676518112001280b32142e666f6f2e546573744d657373" .
-    "6167652e53756212330a196f7074696f6e616c5f696e636c756465645f6d" .
-    "65737361676518122001280b32102e6261722e54657374496e636c756465" .
-    "12230a0972656375727369766518132001280b32102e666f6f2e54657374" .
-    "4d65737361676512160a0e72657065617465645f696e743332181f200328" .
-    "0512160a0e72657065617465645f696e74363418202003280312170a0f72" .
-    "657065617465645f75696e74333218212003280d12170a0f726570656174" .
-    "65645f75696e74363418222003280412170a0f72657065617465645f7369" .
-    "6e74333218232003281112170a0f72657065617465645f73696e74363418" .
-    "242003281212180a1072657065617465645f666978656433321825200328" .
-    "0712180a1072657065617465645f6669786564363418262003280612190a" .
-    "1172657065617465645f736669786564333218272003280f12190a117265" .
-    "7065617465645f736669786564363418282003281012160a0e7265706561" .
-    "7465645f666c6f617418292003280212170a0f72657065617465645f646f" .
-    "75626c65182a2003280112150a0d72657065617465645f626f6f6c182b20" .
-    "03280812170a0f72657065617465645f737472696e67182c200328091216" .
-    "0a0e72657065617465645f6279746573182d2003280c12240a0d72657065" .
-    "617465645f656e756d182e2003280e320d2e666f6f2e54657374456e756d" .
-    "122e0a1072657065617465645f6d657373616765182f2003280b32142e66" .
-    "6f6f2e546573744d6573736167652e537562122c0a127265706561746564" .
-    "5f72656375727369766518302003280b32102e666f6f2e546573744d6573" .
-    "7361676512150a0b6f6e656f665f696e743332183320012805480012150a" .
-    "0b6f6e656f665f696e743634183420012803480012160a0c6f6e656f665f" .
-    "75696e74333218352001280d480012160a0c6f6e656f665f75696e743634" .
-    "183620012804480012160a0c6f6e656f665f73696e74333218372001280d" .
-    "480012160a0c6f6e656f665f73696e743634183820012804480012170a0d" .
-    "6f6e656f665f6669786564333218392001280d480012170a0d6f6e656f66" .
-    "5f66697865643634183a20012804480012180a0e6f6e656f665f73666978" .
-    "65643332183b2001280d480012180a0e6f6e656f665f7366697865643634" .
-    "183c20012804480012160a0c6f6e656f665f646f75626c65183d20012801" .
-    "480012150a0b6f6e656f665f666c6f6174183e20012802480012140a0a6f" .
-    "6e656f665f626f6f6c183f20012808480012160a0c6f6e656f665f737472" .
-    "696e67184020012809480012150a0b6f6e656f665f627974657318412001" .
-    "280c480012230a0a6f6e656f665f656e756d18422001280e320d2e666f6f" .
-    "2e54657374456e756d4800122d0a0d6f6e656f665f6d6573736167651843" .
-    "2001280b32142e666f6f2e546573744d6573736167652e5375624800123c" .
-    "0a0f6d61705f696e7433325f696e74333218472003280b32232e666f6f2e" .
-    "546573744d6573736167652e4d6170496e743332496e743332456e747279" .
-    "123c0a0f6d61705f696e7436345f696e74363418482003280b32232e666f" .
-    "6f2e546573744d6573736167652e4d6170496e743634496e743634456e74" .
-    "727912400a116d61705f75696e7433325f75696e74333218492003280b32" .
-    "252e666f6f2e546573744d6573736167652e4d617055696e74333255696e" .
-    "743332456e74727912400a116d61705f75696e7436345f75696e74363418" .
-    "4a2003280b32252e666f6f2e546573744d6573736167652e4d617055696e" .
-    "74363455696e743634456e74727912400a116d61705f73696e7433325f73" .
-    "696e743332184b2003280b32252e666f6f2e546573744d6573736167652e" .
-    "4d617053696e74333253696e743332456e74727912400a116d61705f7369" .
-    "6e7436345f73696e743634184c2003280b32252e666f6f2e546573744d65" .
-    "73736167652e4d617053696e74363453696e743634456e74727912440a13" .
-    "6d61705f666978656433325f66697865643332184d2003280b32272e666f" .
-    "6f2e546573744d6573736167652e4d617046697865643332466978656433" .
-    "32456e74727912440a136d61705f666978656436345f6669786564363418" .
-    "4e2003280b32272e666f6f2e546573744d6573736167652e4d6170466978" .
-    "6564363446697865643634456e74727912480a156d61705f736669786564" .
-    "33325f7366697865643332184f2003280b32292e666f6f2e546573744d65" .
-    "73736167652e4d617053666978656433325366697865643332456e747279" .
-    "12480a156d61705f73666978656436345f73666978656436341850200328" .
-    "0b32292e666f6f2e546573744d6573736167652e4d617053666978656436" .
-    "345366697865643634456e747279123c0a0f6d61705f696e7433325f666c" .
-    "6f617418512003280b32232e666f6f2e546573744d6573736167652e4d61" .
-    "70496e743332466c6f6174456e747279123e0a106d61705f696e7433325f" .
-    "646f75626c6518522003280b32242e666f6f2e546573744d657373616765" .
-    "2e4d6170496e743332446f75626c65456e74727912380a0d6d61705f626f" .
-    "6f6c5f626f6f6c18532003280b32212e666f6f2e546573744d6573736167" .
-    "652e4d6170426f6f6c426f6f6c456e74727912400a116d61705f73747269" .
-    "6e675f737472696e6718542003280b32252e666f6f2e546573744d657373" .
-    "6167652e4d6170537472696e67537472696e67456e747279123c0a0f6d61" .
-    "705f696e7433325f627974657318552003280b32232e666f6f2e54657374" .
-    "4d6573736167652e4d6170496e7433324279746573456e747279123a0a0e" .
-    "6d61705f696e7433325f656e756d18562003280b32222e666f6f2e546573" .
-    "744d6573736167652e4d6170496e743332456e756d456e74727912400a11" .
-    "6d61705f696e7433325f6d65737361676518572003280b32252e666f6f2e" .
-    "546573744d6573736167652e4d6170496e7433324d657373616765456e74" .
-    "727912390a0d6d61705f72656375727369766518582003280b32222e666f" .
-    "6f2e546573744d6573736167652e4d6170526563757273697665456e7472" .
-    "791a340a124d6170496e743332496e743332456e747279120b0a036b6579" .
-    "180120012805120d0a0576616c75651802200128053a0238011a340a124d" .
-    "6170496e743634496e743634456e747279120b0a036b6579180120012803" .
-    "120d0a0576616c75651802200128033a0238011a360a144d617055696e74" .
-    "333255696e743332456e747279120b0a036b657918012001280d120d0a05" .
-    "76616c756518022001280d3a0238011a360a144d617055696e7436345569" .
-    "6e743634456e747279120b0a036b6579180120012804120d0a0576616c75" .
-    "651802200128043a0238011a360a144d617053696e74333253696e743332" .
-    "456e747279120b0a036b6579180120012811120d0a0576616c7565180220" .
-    "0128113a0238011a360a144d617053696e74363453696e743634456e7472" .
-    "79120b0a036b6579180120012812120d0a0576616c75651802200128123a" .
-    "0238011a380a164d61704669786564333246697865643332456e74727912" .
-    "0b0a036b6579180120012807120d0a0576616c75651802200128073a0238" .
-    "011a380a164d61704669786564363446697865643634456e747279120b0a" .
-    "036b6579180120012806120d0a0576616c75651802200128063a0238011a" .
-    "3a0a184d617053666978656433325366697865643332456e747279120b0a" .
-    "036b657918012001280f120d0a0576616c756518022001280f3a0238011a" .
-    "3a0a184d617053666978656436345366697865643634456e747279120b0a" .
-    "036b6579180120012810120d0a0576616c75651802200128103a0238011a" .
-    "340a124d6170496e743332466c6f6174456e747279120b0a036b65791801" .
-    "20012805120d0a0576616c75651802200128023a0238011a350a134d6170" .
-    "496e743332446f75626c65456e747279120b0a036b657918012001280512" .
-    "0d0a0576616c75651802200128013a0238011a320a104d6170426f6f6c42" .
-    "6f6f6c456e747279120b0a036b6579180120012808120d0a0576616c7565" .
-    "1802200128083a0238011a360a144d6170537472696e67537472696e6745" .
-    "6e747279120b0a036b6579180120012809120d0a0576616c756518022001" .
-    "28093a0238011a340a124d6170496e7433324279746573456e747279120b" .
-    "0a036b6579180120012805120d0a0576616c756518022001280c3a023801" .
-    "1a420a114d6170496e743332456e756d456e747279120b0a036b65791801" .
-    "20012805121c0a0576616c756518022001280e320d2e666f6f2e54657374" .
-    "456e756d3a0238011a4c0a144d6170496e7433324d657373616765456e74" .
-    "7279120b0a036b657918012001280512230a0576616c756518022001280b" .
-    "32142e666f6f2e546573744d6573736167652e5375623a0238011a450a11" .
-    "4d6170526563757273697665456e747279120b0a036b6579180120012805" .
-    "121f0a0576616c756518022001280b32102e666f6f2e546573744d657373" .
-    "6167653a0238011a100a0353756212090a0161180120012805420a0a086d" .
-    "795f6f6e656f6622b7030a11546573745061636b65644d65737361676512" .
-    "1a0a0e72657065617465645f696e743332185a2003280542021001121a0a" .
-    "0e72657065617465645f696e743634185b2003280342021001121b0a0f72" .
-    "657065617465645f75696e743332185c2003280d42021001121b0a0f7265" .
-    "7065617465645f75696e743634185d2003280442021001121b0a0f726570" .
-    "65617465645f73696e743332185e2003281142021001121b0a0f72657065" .
-    "617465645f73696e743634185f2003281242021001121c0a107265706561" .
-    "7465645f6669786564333218602003280742021001121c0a107265706561" .
-    "7465645f6669786564363418612003280642021001121d0a117265706561" .
-    "7465645f736669786564333218622003280f42021001121d0a1172657065" .
-    "617465645f736669786564363418632003281042021001121a0a0e726570" .
-    "65617465645f666c6f617418642003280242021001121b0a0f7265706561" .
-    "7465645f646f75626c651865200328014202100112190a0d726570656174" .
-    "65645f626f6f6c1866200328084202100112280a0d72657065617465645f" .
-    "656e756d18672003280e320d2e666f6f2e54657374456e756d4202100122" .
-    "b9030a1354657374556e7061636b65644d657373616765121a0a0e726570" .
-    "65617465645f696e743332185a2003280542021000121a0a0e7265706561" .
-    "7465645f696e743634185b2003280342021000121b0a0f72657065617465" .
-    "645f75696e743332185c2003280d42021000121b0a0f7265706561746564" .
-    "5f75696e743634185d2003280442021000121b0a0f72657065617465645f" .
-    "73696e743332185e2003281142021000121b0a0f72657065617465645f73" .
-    "696e743634185f2003281242021000121c0a1072657065617465645f6669" .
-    "786564333218602003280742021000121c0a1072657065617465645f6669" .
-    "786564363418612003280642021000121d0a1172657065617465645f7366" .
-    "69786564333218622003280f42021000121d0a1172657065617465645f73" .
-    "6669786564363418632003281042021000121a0a0e72657065617465645f" .
-    "666c6f617418642003280242021000121b0a0f72657065617465645f646f" .
-    "75626c651865200328014202100012190a0d72657065617465645f626f6f" .
-    "6c1866200328084202100012280a0d72657065617465645f656e756d1867" .
-    "2003280e320d2e666f6f2e54657374456e756d4202100022170a0a546573" .
-    "74506870446f6312090a01611801200128052a1d0a0854657374456e756d" .
-    "12080a045a45524f100012070a034f4e451001620670726f746f33"
-));
-
diff --git a/php/tests/test.sh b/php/tests/test.sh
index a6ca89b..3635d86 100755
--- a/php/tests/test.sh
+++ b/php/tests/test.sh
@@ -1,14 +1,11 @@
 #!/bin/bash
 
-# Generate test file
-../../src/protoc --php_out=. test.proto test_include.proto
-
 # Compile c extension
 pushd ../ext/google/protobuf/
 make clean
 set -e
 # Add following in configure for debug: --enable-debug CFLAGS='-g -O0'
-phpize && ./configure && make
+phpize && ./configure  --enable-debug CFLAGS='-g -O0' && make
 popd
 
 tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php )
@@ -18,7 +15,7 @@
   echo "****************************"
   echo "* $t"
   echo "****************************"
-  php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` $t
+  php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php $t
   echo ""
 done
 
diff --git a/php/tests/test_include.pb.php b/php/tests/test_include.pb.php
deleted file mode 100644
index 11ff59c..0000000
--- a/php/tests/test_include.pb.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test_include.proto
-
-namespace Bar;
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Protobuf type <code>bar.TestInclude</code>
- */
-class TestInclude extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    private $a = 0;
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" .
-    "0b54657374496e636c75646512090a0161180120012805620670726f746f" .
-    "33"
-));
-
diff --git a/php/tests/test_no_namespace.pb.php b/php/tests/test_no_namespace.pb.php
deleted file mode 100644
index 2f92c95..0000000
--- a/php/tests/test_no_namespace.pb.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test_no_namespace.proto
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-class NoNameSpace extends \Google\Protobuf\Internal\Message
-{
-    private $a = 0;
-
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0a3b0a17746573745f6e6f5f6e616d6573706163652e70726f746f22180a" .
-    "0b4e6f4e616d65537061636512090a0161180120012805620670726f746f" .
-    "33"
-));
-
diff --git a/php/tests/well_known_test.php b/php/tests/well_known_test.php
index 30715ba..40ff1c8 100644
--- a/php/tests/well_known_test.php
+++ b/php/tests/well_known_test.php
@@ -1,7 +1,5 @@
 <?php
 
-require_once("google/protobuf/empty.pb.php");
-
 use Google\Protobuf\GPBEmpty;
 
 class WellKnownTest extends PHPUnit_Framework_TestCase {
