Merge "Upgrade protobuf to 3.2.0" am: 7dc275cd70 am: 9b9bcfecdd am: 7341fcb745 am: 45f0bf3bf0 am: f8e1c54d82

Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/protobuf/+/2520001

Change-Id: I23e659bc31ae03faa57c00251623489705ee1300
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index ca74a42..bf5e7a5 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "ec31ce829473039ac598ca6fdcb245cbd6fa82ba"
+    "sha1": "7155092f3df112159d55132081937e1fe5c30490"
   },
   "path_in_vcs": "protobuf"
 }
\ No newline at end of file
diff --git a/Android.bp b/Android.bp
index af1d5f1..72288cb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -27,51 +27,27 @@
 
 rust_library {
     name: "libprotobuf",
-    // has rustc warnings
     host_supported: true,
     crate_name: "protobuf",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.27.1",
+    cargo_pkg_version: "3.2.0",
     srcs: [
         "src/lib.rs",
         ":copy_protobuf_build_out",
     ],
-    edition: "2018",
+    edition: "2021",
     features: ["bytes"],
     rustlibs: [
         "libbytes",
+        "libonce_cell",
+        "libprotobuf_support",
+        "libthiserror",
     ],
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
-        "com.android.compos",
-        "com.android.virt",
+        "//apex_available:anyapex",
     ],
     product_available: true,
     vendor_available: true,
     min_sdk_version: "29",
 }
-
-rust_library_host {
-    name: "libprotobuf_with_serde",
-    // has rustc warnings
-    crate_name: "protobuf",
-    cargo_env_compat: true,
-    cargo_pkg_version: "2.27.1",
-    srcs: [
-        "src/lib.rs",
-        ":copy_protobuf_build_out",
-    ],
-    edition: "2018",
-    features: [
-        "serde",
-        "serde_derive",
-        "with-serde",
-    ],
-    rustlibs: [
-        "libserde",
-    ],
-    proc_macros: ["libserde_derive"],
-    product_available: true,
-    vendor_available: true,
-}
diff --git a/Cargo.toml b/Cargo.toml
index 9e4935f..1e5cda4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,15 +10,16 @@
 # See Cargo.toml.orig for the original contents.
 
 [package]
-edition = "2018"
+edition = "2021"
 name = "protobuf"
-version = "2.27.1"
+version = "3.2.0"
 authors = ["Stepan Koltsov <stepan.koltsov@gmail.com>"]
 description = """
 Rust implementation of Google protocol buffers
 """
 homepage = "https://github.com/stepancheg/rust-protobuf/"
 documentation = "https://github.com/stepancheg/rust-protobuf/blob/master/README.md"
+readme = "README.md"
 license = "MIT"
 repository = "https://github.com/stepancheg/rust-protobuf/"
 
@@ -26,25 +27,21 @@
 all-features = true
 
 [lib]
-doctest = false
 bench = false
 
 [dependencies.bytes]
-version = "1.0"
+version = "1.1"
 optional = true
 
-[dependencies.serde]
-version = "1.0"
-features = ["derive"]
-optional = true
+[dependencies.once_cell]
+version = "1.9.0"
 
-[dependencies.serde_derive]
-version = "1.0"
-optional = true
+[dependencies.protobuf-support]
+version = "=3.2.0"
+
+[dependencies.thiserror]
+version = "1.0.30"
 
 [features]
+default = []
 with-bytes = ["bytes"]
-with-serde = [
-    "serde",
-    "serde_derive",
-]
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index c1be2f7..7b40d37 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,9 +1,9 @@
 [package]
 
 name = "protobuf"
-version = "2.27.1"
+version = "3.2.0"
 authors = ["Stepan Koltsov <stepan.koltsov@gmail.com>"]
-edition = "2018"
+edition = "2021"
 license = "MIT"
 homepage = "https://github.com/stepancheg/rust-protobuf/"
 repository = "https://github.com/stepancheg/rust-protobuf/"
@@ -13,17 +13,18 @@
 """
 
 [lib]
-doctest = false
 bench = false
 
 [features]
 with-bytes = ["bytes"]
-with-serde = ["serde", "serde_derive"]
+default = []
 
 [dependencies]
-bytes = { version = "1.0", optional = true }
-serde        = { version = "1.0", features = ["derive"], optional = true }
-serde_derive = { version = "1.0", optional = true }
+bytes = { version = "1.1", optional = true }
+thiserror = "1.0.30"
+once_cell = "1.9.0"
+
+protobuf-support = { path = "../protobuf-support", version = "=3.2.0" }
 
 [package.metadata.docs.rs]
 all-features = true
diff --git a/METADATA b/METADATA
index 2bcb504..49cc1ce 100644
--- a/METADATA
+++ b/METADATA
@@ -1,3 +1,7 @@
+# This project was upgraded with external_updater.
+# Usage: tools/external_updater/updater.sh update rust/crates/protobuf
+# For more info, check https://cs.android.com/android/platform/superproject/+/master:tools/external_updater/README.md
+
 name: "protobuf"
 description: "Rust implementation of Google protocol buffers"
 third_party {
@@ -7,13 +11,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/protobuf/protobuf-2.27.1.crate"
+    value: "https://static.crates.io/crates/protobuf/protobuf-3.2.0.crate"
   }
-  version: "2.27.1"
+  version: "3.2.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2022
-    month: 3
-    day: 1
+    year: 2023
+    month: 4
+    day: 3
   }
 }
diff --git a/README.md b/README.md
index af32486..7fb45f9 100644
--- a/README.md
+++ b/README.md
@@ -2,94 +2,31 @@
 
 # Library to read and write protocol buffers data
 
-# Version 2 is stable
+## Features
 
-Currently developed branch of rust-protobuf [is 3](https://docs.rs/protobuf/%3E=3.0.0-alpha).
-It has the same spirit as version 2, but contains numerous improvements like:
-* runtime reflection for mutability, not just for access
-* protobuf text format and JSON parsing (which rely on reflection)
-* dynamic message support: work with protobuf data without generating code from schema
+This crate has one feature, which is `with-bytes`.
 
-Stable version of rust-protobuf will be supported until version 3 released.
+`with-bytes` enables `protobuf` crate support for
+[`bytes` crate](https://github.com/tokio-rs/bytes):
+when parsing bytes or strings from `bytes::Bytes`,
+`protobuf` will be able to reference the input instead of allocating subarrays.
 
-[Tracking issue for version 3](https://github.com/stepancheg/rust-protobuf/issues/518).
+Note, codegen also need to be instructed to generate `Bytes` or `Chars` for
+`bytes` or `string` protobuf types instead of default `Vec<u8>` or `String`,
+just enabling option on this crate is not enough.
 
-# How to generate rust code
+See `Customize` struct in [`protobuf-codegen` crate](https://docs.rs/protobuf-codegen).
 
-There are several ways to generate rust code from `.proto` files
+## Accompanying crates
 
-## Invoke `protoc` programmatically with protoc-rust crate (recommended)
-
-Have a look at readme in [protoc-rust crate](https://docs.rs/protoc-rust/=2).
-
-## Use pure rust protobuf parser and code generator
-
-Readme should be in
-[protobuf-codegen-pure crate](https://docs.rs/protobuf-codegen-pure/=2).
-
-## Use protoc-gen-rust plugin
-
-Readme is [here](https://docs.rs/protobuf-codegen/=2).
-
-## Generated code
-
-Have a look at generated files (for current development version),
-used internally in rust-protobuf:
-
-* [descriptor.rs](https://github.com/stepancheg/rust-protobuf/blob/master/protobuf/src/descriptor.rs)
-  for [descriptor.proto](https://github.com/stepancheg/rust-protobuf/blob/master/protoc-bin-vendored/include/google/protobuf/descriptor.proto)
-  (that is part of Google protobuf)
-
-# Copy on write
-
-Rust-protobuf can be used with [bytes crate](https://github.com/tokio-rs/bytes).
-
-To enable `Bytes` you need to:
-
-1. Enable `with-bytes` feature in rust-protobuf:
-
-```rust
-[dependencies]
-protobuf = { version = "~2.0", features = ["with-bytes"] }
-```
-
-2. Enable bytes option
-
-with `Customize` when codegen is invoked programmatically:
-
-```rust
-protoc_rust::run(protoc_rust::Args {
-    ...
-    customize: Customize {
-        carllerche_bytes_for_bytes: Some(true),
-        carllerche_bytes_for_string: Some(true),
-        ..Default::default()
-    },
-});
-```
-
-or in `.proto` file:
-
-```rust
-import "rustproto.proto";
-
-option (rustproto.carllerche_bytes_for_bytes_all) = true;
-option (rustproto.carllerche_bytes_for_string_all) = true;
-```
-
-With these options enabled, fields of type `bytes` or `string` are
-generated as `Bytes` or `Chars` respectively. When `CodedInputStream` is constructed
-from `Bytes` object, fields of these types get subslices of original `Bytes` object,
-instead of being allocated on heap.
-
-# Accompanying crates
-
-* [`protoc-rust`](https://docs.rs/protoc-rust/=2)
-  and [`protobuf-codegen-pure`](https://docs.rs/protobuf-codegen-pure/=2)
+* [`protobuf-json-mapping`](https://docs.rs/protobuf-json-mapping)
+  implements JSON parsing and serialization for protobuf messages.
+* [`protobuf-codegen`](https://docs.rs/protobuf-codegen)
   can be used to rust code from `.proto` crates.
-* [`protobuf-codegen`](https://docs.rs/protobuf-codegen/=2) for `protoc-gen-rust` protoc plugin.
-* [`protoc`](https://docs.rs/protoc/=2) crate can be used to invoke `protoc` programmatically.
-* [`protoc-bin-vendored`](https://docs.rs/protoc-bin-vendored/=2) contains `protoc` command
-  packed into the crate.
+* [`protoc-bin-vendored`](https://docs.rs/protoc-bin-vendored)
+  contains `protoc` command packed into the crate.
+* [`protobuf-parse`](https://docs.rs/protobuf-parse) contains
+  `.proto` file parser. Rarely need to be used directly,
+  but can be used for mechanical processing of `.proto` files.
 
 <!-- cargo-sync-readme end -->
diff --git a/benches/coded_input_stream.rs b/benches/coded_input_stream.rs
index d1795e5..10831da 100644
--- a/benches/coded_input_stream.rs
+++ b/benches/coded_input_stream.rs
@@ -102,3 +102,34 @@
         assert_eq!(1000, count);
     })
 }
+
+fn xorshift(mut x: u64) -> u64 {
+    x ^= x << 13;
+    x ^= x >> 7;
+    x ^= x << 17;
+    x
+}
+
+#[bench]
+fn read_varint_large(b: &mut Bencher) {
+    let mut v = Vec::new();
+    {
+        let mut v = protobuf::CodedOutputStream::vec(&mut v);
+        let mut rng = 1;
+        for _ in 0..1000 {
+            // one or two byte varints
+            v.write_raw_varint64(rng).unwrap();
+            rng = xorshift(rng);
+        }
+        v.flush().expect("flush");
+    }
+    b.iter(|| {
+        let mut is = CodedInputStream::from_bytes(test::black_box(&v));
+        let mut count = 0;
+        while !is.eof().expect("eof") {
+            test::black_box(is.read_raw_varint64().expect("read"));
+            count += 1;
+        }
+        assert_eq!(1000, count);
+    })
+}
diff --git a/benches/coded_output_stream.rs b/benches/coded_output_stream.rs
index 9edf95c..8aed4d8 100644
--- a/benches/coded_output_stream.rs
+++ b/benches/coded_output_stream.rs
@@ -48,3 +48,18 @@
         v
     });
 }
+
+#[bench]
+fn bench_write_raw_varint_32(b: &mut Bencher) {
+    let mut v = Vec::with_capacity(10_000);
+    b.iter(|| {
+        v.clear();
+        {
+            let mut os = CodedOutputStream::new(&mut v);
+            for i in 0..1000 {
+                os.write_raw_varint32(i * 139 % 1000).unwrap();
+            }
+        }
+        v.len()
+    })
+}
diff --git a/benches/write.rs b/benches/write.rs
new file mode 100644
index 0000000..3b49831
--- /dev/null
+++ b/benches/write.rs
@@ -0,0 +1,23 @@
+// `cargo test --benches` and `#[feature(test)]` work only in nightly
+#![cfg(rustc_nightly)]
+#![feature(test)]
+
+extern crate test;
+
+use protobuf::well_known_types::struct_::value;
+use protobuf::well_known_types::struct_::Struct;
+use protobuf::well_known_types::struct_::Value;
+use protobuf::Message;
+use test::Bencher;
+
+#[bench]
+fn write_to_bytes(b: &mut Bencher) {
+    let mut value = Value::new();
+    value.kind = Some(value::Kind::NumberValue(10.0));
+    let mut value2 = Value::new();
+    value2.kind = Some(value::Kind::BoolValue(true));
+    let mut s = Struct::new();
+    s.fields.insert("foo".to_owned(), value);
+    s.fields.insert("bar".to_owned(), value2);
+    b.iter(|| s.write_to_bytes());
+}
diff --git a/build.rs b/build.rs
index 653ba35..ba76c56 100644
--- a/build.rs
+++ b/build.rs
@@ -1,4 +1,5 @@
 use std::env;
+use std::env::VarError;
 use std::fs::File;
 use std::io::Read;
 use std::io::Write;
@@ -16,7 +17,7 @@
     version.contains("nightly")
 }
 
-fn main() {
+fn cfg_rust_version() {
     let rustc = env::var("RUSTC").expect("RUSTC unset");
 
     let mut child = process::Command::new(rustc)
@@ -39,8 +40,16 @@
     if version_is_nightly(&rustc_version) {
         println!("cargo:rustc-cfg=rustc_nightly");
     }
+}
 
-    write_version();
+fn cfg_serde() {
+    match env::var("CARGO_FEATURE_WITH_SERDE") {
+        Ok(_) => {
+            println!("cargo:rustc-cfg=serde");
+        }
+        Err(VarError::NotUnicode(..)) => panic!(),
+        Err(VarError::NotPresent) => {}
+    }
 }
 
 fn out_dir() -> PathBuf {
@@ -76,3 +85,9 @@
     writeln!(file, "pub const {}: () = ();", version_ident).unwrap();
     file.flush().unwrap();
 }
+
+fn main() {
+    cfg_rust_version();
+    cfg_serde();
+    write_version();
+}
diff --git a/cargo2android.json b/cargo2android.json
index cafe7cd..e6792f4 100644
--- a/cargo2android.json
+++ b/cargo2android.json
@@ -1,24 +1,12 @@
 {
   "apex-available": [
     "//apex_available:platform",
-    "com.android.btservices",
-    "com.android.compos",
-    "com.android.virt"
+    "//apex_available:anyapex"
   ],
   "copy-out": true,
   "dependencies": true,
   "device": true,
   "features": "bytes",
-  "variants": [
-    {
-      "suffix": ""
-    },
-    {
-      "suffix": "_with_serde",
-      "features": "with-serde",
-      "device": false
-    }
-  ],
   "min-sdk-version": "29",
   "run": true
-}
\ No newline at end of file
+}
diff --git a/cargo_1.out b/cargo_1.out
new file mode 100644
index 0000000..23d4847
--- /dev/null
+++ b/cargo_1.out
@@ -0,0 +1,4 @@
+### Running: /usr/local/google/home/jeffv/android/aosp/development/scripts/../../prebuilts/rust/linux-x86/1.68.0/bin/cargo -v clean --target-dir target.tmp >> ./cargo_1.out 2>&1
+    Removing /tmp/tmpbssc9a1g/protobuf-3.2.0/target.tmp
+### Running: /usr/local/google/home/jeffv/android/aosp/development/scripts/../../prebuilts/rust/linux-x86/1.68.0/bin/cargo -v build --target x86_64-unknown-linux-gnu --no-default-features --features with-serde --target-dir target.tmp >> ./cargo_1.out 2>&1
+error: none of the selected packages contains these features: with-serde
diff --git a/out/version.rs b/out/version.rs
index 18bbac5..4ede33b 100644
--- a/out/version.rs
+++ b/out/version.rs
@@ -1,7 +1,7 @@
 /// protobuf crate version
-pub const VERSION: &'static str = "2.27.1";
+pub const VERSION: &'static str = "3.2.0";
 /// This symbol is used by codegen
 #[doc(hidden)]
-pub const VERSION_IDENT: &'static str = "VERSION_2_27_1";
+pub const VERSION_IDENT: &'static str = "VERSION_3_2_0";
 /// This symbol can be referenced to assert that proper version of crate is used
-pub const VERSION_2_27_1: () = ();
+pub const VERSION_3_2_0: () = ();
diff --git a/regenerate.sh b/regenerate.sh
index 0173496..37ec4bc 100755
--- a/regenerate.sh
+++ b/regenerate.sh
@@ -16,9 +16,11 @@
 esac
 
 cargo build --manifest-path=../protobuf-codegen/Cargo.toml
-cargo build --manifest-path=../protoc-bin-vendored/Cargo.toml --bin protoc-bin-which
+cargo build --manifest-path=../protoc-bin/Cargo.toml --bin protoc-bin-print-paths
 
-PROTOC=$(cargo run --manifest-path=../protoc-bin-vendored/Cargo.toml --bin protoc-bin-which)
+eval "$(cargo run --manifest-path=../protoc-bin/Cargo.toml --bin protoc-bin-print-paths)"
+
+test -n "$PROTOC"
 
 where_am_i=$(
     cd ..
@@ -40,35 +42,20 @@
 "$PROTOC" \
     --plugin=protoc-gen-rust="$where_am_i/target/debug/protoc-gen-rust$exe_suffix" \
     --rust_out tmp-generated \
-    --rust_opt 'serde_derive=true inside_protobuf=true' \
+    --rust_opt 'inside_protobuf=true gen_mod_rs=false' \
     -I../proto \
-    -I../protoc-bin-vendored/include \
-    ../protoc-bin-vendored/include/google/protobuf/*.proto \
-    ../protoc-bin-vendored/include/google/protobuf/compiler/* \
-    ../proto/rustproto.proto
+    ../proto/google/protobuf/*.proto \
+    ../proto/google/protobuf/compiler/*.proto \
+    ../proto/rustproto.proto \
+    ../proto/doctest_pb.proto
 
-mv tmp-generated/descriptor.rs tmp-generated/plugin.rs tmp-generated/rustproto.rs src/
+mv \
+    tmp-generated/descriptor.rs \
+    tmp-generated/plugin.rs \
+    tmp-generated/rustproto.rs \
+    tmp-generated/doctest_pb.rs \
+    src/
+mv tmp-generated/well_known_types_mod.rs src/well_known_types/mod.rs
 mv tmp-generated/*.rs src/well_known_types/
-(
-    cd src/well_known_types
-    exec >mod.rs
-    echo "// This file is generated. Do not edit"
-    echo '//! Generated code for "well known types"'
-    echo "//!"
-    echo "//! [This document](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf) describes these types."
-
-    mod_list() {
-        # shellcheck disable=SC2010
-        ls | grep -v mod.rs | sed -e 's,\.rs$,,'
-    }
-
-    echo
-    mod_list | sed -e 's,^,mod ,; s,$,;,'
-
-    echo
-    mod_list | while read -r mod; do
-        echo "pub use self::$mod::*;"
-    done
-)
 
 # vim: set ts=4 sw=4 et:
diff --git a/src/any.rs b/src/any.rs
deleted file mode 100644
index 31ddd82..0000000
--- a/src/any.rs
+++ /dev/null
@@ -1,114 +0,0 @@
-use crate::parse_from_bytes;
-use crate::reflect::MessageDescriptor;
-use crate::well_known_types::Any;
-use crate::Message;
-use crate::ProtobufResult;
-
-impl Any {
-    fn type_url(type_url_prefix: &str, descriptor: &MessageDescriptor) -> String {
-        format!("{}/{}", type_url_prefix, descriptor.full_name())
-    }
-
-    fn get_type_name_from_type_url(type_url: &str) -> Option<&str> {
-        match type_url.rfind('/') {
-            Some(i) => Some(&type_url[i + 1..]),
-            None => None,
-        }
-    }
-
-    /// Pack any message into `well_known_types::Any` value.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// # use protobuf::Message;
-    /// # use protobuf::ProtobufResult;
-    /// use protobuf::well_known_types::Any;
-    ///
-    /// # fn the_test<MyMessage: Message>(message: &MyMessage) -> ProtobufResult<()> {
-    /// let message: &MyMessage = message;
-    /// let any = Any::pack(message)?;
-    /// assert!(any.is::<MyMessage>());
-    /// #   Ok(())
-    /// # }
-    /// ```
-    pub fn pack<M: Message>(message: &M) -> ProtobufResult<Any> {
-        Any::pack_dyn(message)
-    }
-
-    /// Pack any message into `well_known_types::Any` value.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use protobuf::Message;
-    /// # use protobuf::ProtobufResult;
-    /// use protobuf::well_known_types::Any;
-    ///
-    /// # fn the_test(message: &dyn Message) -> ProtobufResult<()> {
-    /// let message: &dyn Message = message;
-    /// let any = Any::pack_dyn(message)?;
-    /// assert!(any.is_dyn(message.descriptor()));
-    /// #   Ok(())
-    /// # }
-    /// ```
-    pub fn pack_dyn(message: &dyn Message) -> ProtobufResult<Any> {
-        Any::pack_with_type_url_prefix(message, "type.googleapis.com")
-    }
-
-    fn pack_with_type_url_prefix(
-        message: &dyn Message,
-        type_url_prefix: &str,
-    ) -> ProtobufResult<Any> {
-        Ok(Any {
-            type_url: Any::type_url(type_url_prefix, message.descriptor()),
-            value: message.write_to_bytes()?,
-            ..Default::default()
-        })
-    }
-
-    /// Check if `Any` contains a message of given type.
-    pub fn is<M: Message>(&self) -> bool {
-        self.is_dyn(M::descriptor_static())
-    }
-
-    /// Check if `Any` contains a message of given type.
-    pub fn is_dyn(&self, descriptor: &MessageDescriptor) -> bool {
-        match Any::get_type_name_from_type_url(&self.type_url) {
-            Some(type_name) => type_name == descriptor.full_name(),
-            None => false,
-        }
-    }
-
-    /// Extract a message from this `Any`.
-    ///
-    /// # Returns
-    ///
-    /// * `Ok(None)` when message type mismatch
-    /// * `Err` when parse failed
-    pub fn unpack<M: Message>(&self) -> ProtobufResult<Option<M>> {
-        if !self.is::<M>() {
-            return Ok(None);
-        }
-        Ok(Some(parse_from_bytes(&self.value)?))
-    }
-
-    /// Extract a message from this `Any`.
-    ///
-    /// # Returns
-    ///
-    /// * `Ok(None)` when message type mismatch
-    /// * `Err` when parse failed
-    pub fn unpack_dyn(
-        &self,
-        descriptor: &MessageDescriptor,
-    ) -> ProtobufResult<Option<Box<dyn Message>>> {
-        if !self.is_dyn(descriptor) {
-            return Ok(None);
-        }
-        let mut message = descriptor.new_instance();
-        message.merge_from_bytes(&self.value)?;
-        message.check_initialized()?;
-        Ok(Some(message))
-    }
-}
diff --git a/src/byteorder.rs b/src/byteorder.rs
new file mode 100644
index 0000000..364af6e
--- /dev/null
+++ b/src/byteorder.rs
@@ -0,0 +1,2 @@
+/// Expose cfg as constant to be able to typecheck both versions.
+pub(crate) const LITTLE_ENDIAN: bool = cfg!(target_endian = "little");
diff --git a/src/cached_size.rs b/src/cached_size.rs
index 350ddac..3919b99 100644
--- a/src/cached_size.rs
+++ b/src/cached_size.rs
@@ -1,15 +1,27 @@
+use std::hash::Hash;
+use std::hash::Hasher;
 use std::sync::atomic::AtomicUsize;
 use std::sync::atomic::Ordering;
 
 /// Cached size field used in generated code.
+///
 /// It is always equal to itself to simplify generated code.
 /// (Generated code can use `#[derive(Eq)]`).
+///
+/// This type should rarely be used directly.
 #[derive(Debug, Default)]
 pub struct CachedSize {
     size: AtomicUsize,
 }
 
 impl CachedSize {
+    /// Create a new `CachedSize` object.
+    pub const fn new() -> CachedSize {
+        CachedSize {
+            size: AtomicUsize::new(0),
+        }
+    }
+
     /// Get cached size
     pub fn get(&self) -> u32 {
         self.size.load(Ordering::Relaxed) as u32
@@ -36,3 +48,9 @@
 }
 
 impl Eq for CachedSize {}
+
+impl Hash for CachedSize {
+    fn hash<H: Hasher>(&self, _state: &mut H) {
+        // ignore cached size in cache computation
+    }
+}
diff --git a/src/chars.rs b/src/chars.rs
index 49c02d7..9a2109e 100644
--- a/src/chars.rs
+++ b/src/chars.rs
@@ -1,13 +1,12 @@
 #![cfg(feature = "bytes")]
 
+use std::borrow::Borrow;
 use std::fmt;
 use std::ops::Deref;
 use std::str;
 
 use bytes::Bytes;
 
-use crate::clear::Clear;
-
 /// Thin wrapper around `Bytes` which guarantees that bytes are valid UTF-8 string.
 /// Should be API-compatible to `String`.
 #[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
@@ -15,10 +14,15 @@
 
 impl Chars {
     /// New empty object.
-    pub fn new() -> Chars {
+    pub const fn new() -> Chars {
         Chars(Bytes::new())
     }
 
+    /// Clear the buffer.
+    pub fn clear(&mut self) {
+        self.0.clear();
+    }
+
     /// Try convert from `Bytes`
     pub fn from_bytes(bytes: Bytes) -> Result<Chars, str::Utf8Error> {
         str::from_utf8(&bytes)?;
@@ -71,9 +75,9 @@
     }
 }
 
-impl Clear for Chars {
-    fn clear(&mut self) {
-        self.0.clear();
+impl Borrow<str> for Chars {
+    fn borrow(&self) -> &str {
+        &*self
     }
 }
 
@@ -96,6 +100,7 @@
     use super::Chars;
 
     #[test]
+    #[cfg_attr(miri, ignore)] // bytes violates SB, see https://github.com/tokio-rs/bytes/issues/522
     fn test_display_and_debug() {
         let s = "test";
         let string: String = s.into();
diff --git a/src/clear.rs b/src/clear.rs
deleted file mode 100644
index 712c492..0000000
--- a/src/clear.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-#[cfg(feature = "bytes")]
-use bytes::Bytes;
-
-/// anything that can be cleared
-pub trait Clear {
-    /// Clear this make, make it equivalent to newly created object.
-    fn clear(&mut self);
-}
-
-impl<T> Clear for Option<T> {
-    fn clear(&mut self) {
-        self.take();
-    }
-}
-
-impl Clear for String {
-    fn clear(&mut self) {
-        String::clear(self);
-    }
-}
-
-impl<T> Clear for Vec<T> {
-    fn clear(&mut self) {
-        Vec::clear(self);
-    }
-}
-
-#[cfg(feature = "bytes")]
-impl Clear for Bytes {
-    fn clear(&mut self) {
-        Bytes::clear(self);
-    }
-}
diff --git a/src/coded_input_stream.rs b/src/coded_input_stream.rs
deleted file mode 100644
index a49563c..0000000
--- a/src/coded_input_stream.rs
+++ /dev/null
@@ -1,976 +0,0 @@
-#![doc(hidden)]
-
-//! `CodedInputStream` and `CodedOutputStream` implementations
-
-use std::io;
-use std::io::BufRead;
-use std::io::Read;
-use std::mem;
-use std::mem::MaybeUninit;
-use std::slice;
-
-#[cfg(feature = "bytes")]
-use bytes::Bytes;
-
-use crate::buf_read_iter::BufReadIter;
-#[cfg(feature = "bytes")]
-use crate::chars::Chars;
-use crate::enums::ProtobufEnum;
-use crate::error::ProtobufError;
-use crate::error::ProtobufResult;
-use crate::error::WireError;
-use crate::message::Message;
-use crate::misc::maybe_ununit_array_assume_init;
-use crate::unknown::UnknownValue;
-use crate::wire_format;
-use crate::zigzag::decode_zig_zag_32;
-use crate::zigzag::decode_zig_zag_64;
-
-/// Default recursion level limit. 100 is the default value of C++'s implementation.
-const DEFAULT_RECURSION_LIMIT: u32 = 100;
-
-/// Max allocated vec when reading length-delimited from unknown input stream
-pub(crate) const READ_RAW_BYTES_MAX_ALLOC: usize = 10_000_000;
-
-/// Buffered read with handy utilities.
-pub struct CodedInputStream<'a> {
-    source: BufReadIter<'a>,
-    recursion_level: u32,
-    recursion_limit: u32,
-}
-
-impl<'a> CodedInputStream<'a> {
-    /// Wrap a `Read`.
-    ///
-    /// Note resulting `CodedInputStream` is buffered even if `Read` is not.
-    pub fn new(read: &'a mut dyn Read) -> CodedInputStream<'a> {
-        CodedInputStream::from_buf_read_iter(BufReadIter::from_read(read))
-    }
-
-    /// Create from `BufRead`.
-    ///
-    /// `CodedInputStream` will utilize `BufRead` buffer.
-    pub fn from_buffered_reader(buf_read: &'a mut dyn BufRead) -> CodedInputStream<'a> {
-        CodedInputStream::from_buf_read_iter(BufReadIter::from_buf_read(buf_read))
-    }
-
-    /// Read from byte slice
-    pub fn from_bytes(bytes: &'a [u8]) -> CodedInputStream<'a> {
-        CodedInputStream::from_buf_read_iter(BufReadIter::from_byte_slice(bytes))
-    }
-
-    /// Read from `Bytes`.
-    ///
-    /// `CodedInputStream` operations like
-    /// [`read_carllerche_bytes`](crate::CodedInputStream::read_carllerche_bytes)
-    /// will return a shared copy of this bytes object.
-    #[cfg(feature = "bytes")]
-    pub fn from_carllerche_bytes(bytes: &'a Bytes) -> CodedInputStream<'a> {
-        CodedInputStream::from_buf_read_iter(BufReadIter::from_bytes(bytes))
-    }
-
-    fn from_buf_read_iter(source: BufReadIter<'a>) -> CodedInputStream<'a> {
-        CodedInputStream {
-            source: source,
-            recursion_level: 0,
-            recursion_limit: DEFAULT_RECURSION_LIMIT,
-        }
-    }
-
-    /// Set the recursion limit.
-    pub fn set_recursion_limit(&mut self, limit: u32) {
-        self.recursion_limit = limit;
-    }
-
-    #[inline]
-    pub(crate) fn incr_recursion(&mut self) -> ProtobufResult<()> {
-        if self.recursion_level >= self.recursion_limit {
-            return Err(ProtobufError::WireError(WireError::OverRecursionLimit));
-        }
-        self.recursion_level += 1;
-        Ok(())
-    }
-
-    #[inline]
-    pub(crate) fn decr_recursion(&mut self) {
-        self.recursion_level -= 1;
-    }
-
-    /// How many bytes processed
-    pub fn pos(&self) -> u64 {
-        self.source.pos()
-    }
-
-    /// How many bytes until current limit
-    pub fn bytes_until_limit(&self) -> u64 {
-        self.source.bytes_until_limit()
-    }
-
-    /// Read bytes into given `buf`.
-    #[inline]
-    fn read_exact_uninit(&mut self, buf: &mut [MaybeUninit<u8>]) -> ProtobufResult<()> {
-        self.source.read_exact(buf)
-    }
-
-    /// Read bytes into given `buf`.
-    ///
-    /// Return `0` on EOF.
-    // TODO: overload with `Read::read`
-    pub fn read(&mut self, buf: &mut [u8]) -> ProtobufResult<()> {
-        // SAFETY: same layout
-        let buf = unsafe {
-            slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
-        };
-        self.read_exact_uninit(buf)
-    }
-
-    /// Read exact number of bytes as `Bytes` object.
-    ///
-    /// This operation returns a shared view if `CodedInputStream` is
-    /// constructed with `Bytes` parameter.
-    #[cfg(feature = "bytes")]
-    fn read_raw_callerche_bytes(&mut self, count: usize) -> ProtobufResult<Bytes> {
-        self.source.read_exact_bytes(count)
-    }
-
-    /// Read one byte
-    #[inline(always)]
-    pub fn read_raw_byte(&mut self) -> ProtobufResult<u8> {
-        self.source.read_byte()
-    }
-
-    /// Push new limit, return previous limit.
-    pub fn push_limit(&mut self, limit: u64) -> ProtobufResult<u64> {
-        self.source.push_limit(limit)
-    }
-
-    /// Restore previous limit.
-    pub fn pop_limit(&mut self, old_limit: u64) {
-        self.source.pop_limit(old_limit);
-    }
-
-    /// Are we at EOF?
-    #[inline(always)]
-    pub fn eof(&mut self) -> ProtobufResult<bool> {
-        self.source.eof()
-    }
-
-    /// Check we are at EOF.
-    ///
-    /// Return error if we are not at EOF.
-    pub fn check_eof(&mut self) -> ProtobufResult<()> {
-        let eof = self.eof()?;
-        if !eof {
-            return Err(ProtobufError::WireError(WireError::UnexpectedEof));
-        }
-        Ok(())
-    }
-
-    fn read_raw_varint64_slow(&mut self) -> ProtobufResult<u64> {
-        let mut r: u64 = 0;
-        let mut i = 0;
-        loop {
-            if i == 10 {
-                return Err(ProtobufError::WireError(WireError::IncorrectVarint));
-            }
-            let b = self.read_raw_byte()?;
-            // TODO: may overflow if i == 9
-            r = r | (((b & 0x7f) as u64) << (i * 7));
-            i += 1;
-            if b < 0x80 {
-                return Ok(r);
-            }
-        }
-    }
-
-    /// Read varint
-    #[inline(always)]
-    pub fn read_raw_varint64(&mut self) -> ProtobufResult<u64> {
-        'slow: loop {
-            let ret;
-            let consume;
-
-            loop {
-                let rem = self.source.remaining_in_buf();
-
-                if rem.len() >= 1 {
-                    // most varints are in practice fit in 1 byte
-                    if rem[0] < 0x80 {
-                        ret = rem[0] as u64;
-                        consume = 1;
-                    } else {
-                        // handle case of two bytes too
-                        if rem.len() >= 2 && rem[1] < 0x80 {
-                            ret = (rem[0] & 0x7f) as u64 | (rem[1] as u64) << 7;
-                            consume = 2;
-                        } else if rem.len() >= 10 {
-                            // Read from array when buf at at least 10 bytes,
-                            // max len for varint.
-                            let mut r: u64 = 0;
-                            let mut i: usize = 0;
-                            {
-                                let rem = rem;
-                                loop {
-                                    if i == 10 {
-                                        return Err(ProtobufError::WireError(
-                                            WireError::IncorrectVarint,
-                                        ));
-                                    }
-
-                                    let b = if true {
-                                        // skip range check
-                                        unsafe { *rem.get_unchecked(i) }
-                                    } else {
-                                        rem[i]
-                                    };
-
-                                    // TODO: may overflow if i == 9
-                                    r = r | (((b & 0x7f) as u64) << (i * 7));
-                                    i += 1;
-                                    if b < 0x80 {
-                                        break;
-                                    }
-                                }
-                            }
-                            consume = i;
-                            ret = r;
-                        } else {
-                            break 'slow;
-                        }
-                    }
-                } else {
-                    break 'slow;
-                }
-                break;
-            }
-
-            self.source.consume(consume);
-            return Ok(ret);
-        }
-
-        self.read_raw_varint64_slow()
-    }
-
-    /// Read varint
-    #[inline(always)]
-    pub fn read_raw_varint32(&mut self) -> ProtobufResult<u32> {
-        self.read_raw_varint64().map(|v| v as u32)
-    }
-
-    /// Read little-endian 32-bit integer
-    pub fn read_raw_little_endian32(&mut self) -> ProtobufResult<u32> {
-        let mut bytes = [MaybeUninit::uninit(); 4];
-        self.read_exact_uninit(&mut bytes)?;
-        // SAFETY: `read_exact` guarantees that the buffer is filled.
-        let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
-        Ok(u32::from_le_bytes(bytes))
-    }
-
-    /// Read little-endian 64-bit integer
-    pub fn read_raw_little_endian64(&mut self) -> ProtobufResult<u64> {
-        let mut bytes = [MaybeUninit::uninit(); 8];
-        self.read_exact_uninit(&mut bytes)?;
-        // SAFETY: `read_exact` guarantees that the buffer is filled.
-        let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
-        Ok(u64::from_le_bytes(bytes))
-    }
-
-    /// Read tag
-    #[inline]
-    pub fn read_tag(&mut self) -> ProtobufResult<wire_format::Tag> {
-        let v = self.read_raw_varint32()?;
-        match wire_format::Tag::new(v) {
-            Some(tag) => Ok(tag),
-            None => Err(ProtobufError::WireError(WireError::IncorrectTag(v))),
-        }
-    }
-
-    /// Read tag, return it is pair (field number, wire type)
-    #[inline]
-    pub fn read_tag_unpack(&mut self) -> ProtobufResult<(u32, wire_format::WireType)> {
-        self.read_tag().map(|t| t.unpack())
-    }
-
-    /// Read `double`
-    pub fn read_double(&mut self) -> ProtobufResult<f64> {
-        let bits = self.read_raw_little_endian64()?;
-        unsafe { Ok(mem::transmute::<u64, f64>(bits)) }
-    }
-
-    /// Read `float`
-    pub fn read_float(&mut self) -> ProtobufResult<f32> {
-        let bits = self.read_raw_little_endian32()?;
-        unsafe { Ok(mem::transmute::<u32, f32>(bits)) }
-    }
-
-    /// Read `int64`
-    pub fn read_int64(&mut self) -> ProtobufResult<i64> {
-        self.read_raw_varint64().map(|v| v as i64)
-    }
-
-    /// Read `int32`
-    pub fn read_int32(&mut self) -> ProtobufResult<i32> {
-        self.read_raw_varint32().map(|v| v as i32)
-    }
-
-    /// Read `uint64`
-    pub fn read_uint64(&mut self) -> ProtobufResult<u64> {
-        self.read_raw_varint64()
-    }
-
-    /// Read `uint32`
-    pub fn read_uint32(&mut self) -> ProtobufResult<u32> {
-        self.read_raw_varint32()
-    }
-
-    /// Read `sint64`
-    pub fn read_sint64(&mut self) -> ProtobufResult<i64> {
-        self.read_uint64().map(decode_zig_zag_64)
-    }
-
-    /// Read `sint32`
-    pub fn read_sint32(&mut self) -> ProtobufResult<i32> {
-        self.read_uint32().map(decode_zig_zag_32)
-    }
-
-    /// Read `fixed64`
-    pub fn read_fixed64(&mut self) -> ProtobufResult<u64> {
-        self.read_raw_little_endian64()
-    }
-
-    /// Read `fixed32`
-    pub fn read_fixed32(&mut self) -> ProtobufResult<u32> {
-        self.read_raw_little_endian32()
-    }
-
-    /// Read `sfixed64`
-    pub fn read_sfixed64(&mut self) -> ProtobufResult<i64> {
-        self.read_raw_little_endian64().map(|v| v as i64)
-    }
-
-    /// Read `sfixed32`
-    pub fn read_sfixed32(&mut self) -> ProtobufResult<i32> {
-        self.read_raw_little_endian32().map(|v| v as i32)
-    }
-
-    /// Read `bool`
-    pub fn read_bool(&mut self) -> ProtobufResult<bool> {
-        self.read_raw_varint32().map(|v| v != 0)
-    }
-
-    /// Read `enum` as `ProtobufEnum`
-    pub fn read_enum<E: ProtobufEnum>(&mut self) -> ProtobufResult<E> {
-        let i = self.read_int32()?;
-        match ProtobufEnum::from_i32(i) {
-            Some(e) => Ok(e),
-            None => Err(ProtobufError::WireError(WireError::InvalidEnumValue(i))),
-        }
-    }
-
-    /// Read `repeated` packed `double`
-    pub fn read_repeated_packed_double_into(
-        &mut self,
-        target: &mut Vec<f64>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        target.reserve((len / 4) as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_double()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read `repeated` packed `float`
-    pub fn read_repeated_packed_float_into(&mut self, target: &mut Vec<f32>) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        target.reserve((len / 4) as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_float()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read `repeated` packed `int64`
-    pub fn read_repeated_packed_int64_into(&mut self, target: &mut Vec<i64>) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len as u64)?;
-        while !self.eof()? {
-            target.push(self.read_int64()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `int32`
-    pub fn read_repeated_packed_int32_into(&mut self, target: &mut Vec<i32>) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_int32()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `uint64`
-    pub fn read_repeated_packed_uint64_into(
-        &mut self,
-        target: &mut Vec<u64>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_uint64()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `uint32`
-    pub fn read_repeated_packed_uint32_into(
-        &mut self,
-        target: &mut Vec<u32>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_uint32()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `sint64`
-    pub fn read_repeated_packed_sint64_into(
-        &mut self,
-        target: &mut Vec<i64>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_sint64()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `sint32`
-    pub fn read_repeated_packed_sint32_into(
-        &mut self,
-        target: &mut Vec<i32>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_sint32()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `fixed64`
-    pub fn read_repeated_packed_fixed64_into(
-        &mut self,
-        target: &mut Vec<u64>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        target.reserve((len / 8) as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_fixed64()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `fixed32`
-    pub fn read_repeated_packed_fixed32_into(
-        &mut self,
-        target: &mut Vec<u32>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        target.reserve((len / 4) as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_fixed32()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `sfixed64`
-    pub fn read_repeated_packed_sfixed64_into(
-        &mut self,
-        target: &mut Vec<i64>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        target.reserve((len / 8) as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_sfixed64()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `sfixed32`
-    pub fn read_repeated_packed_sfixed32_into(
-        &mut self,
-        target: &mut Vec<i32>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        target.reserve((len / 4) as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_sfixed32()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `bool`
-    pub fn read_repeated_packed_bool_into(&mut self, target: &mut Vec<bool>) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-
-        // regular bool value is 1-byte size
-        target.reserve(len as usize);
-
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_bool()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read repeated packed `enum` into `ProtobufEnum`
-    pub fn read_repeated_packed_enum_into<E: ProtobufEnum>(
-        &mut self,
-        target: &mut Vec<E>,
-    ) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        while !self.eof()? {
-            target.push(self.read_enum()?);
-        }
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read `UnknownValue`
-    pub fn read_unknown(
-        &mut self,
-        wire_type: wire_format::WireType,
-    ) -> ProtobufResult<UnknownValue> {
-        match wire_type {
-            wire_format::WireTypeVarint => {
-                self.read_raw_varint64().map(|v| UnknownValue::Varint(v))
-            }
-            wire_format::WireTypeFixed64 => self.read_fixed64().map(|v| UnknownValue::Fixed64(v)),
-            wire_format::WireTypeFixed32 => self.read_fixed32().map(|v| UnknownValue::Fixed32(v)),
-            wire_format::WireTypeLengthDelimited => {
-                let len = self.read_raw_varint32()?;
-                self.read_raw_bytes(len)
-                    .map(|v| UnknownValue::LengthDelimited(v))
-            }
-            _ => Err(ProtobufError::WireError(WireError::UnexpectedWireType(
-                wire_type,
-            ))),
-        }
-    }
-
-    /// Skip field
-    pub fn skip_field(&mut self, wire_type: wire_format::WireType) -> ProtobufResult<()> {
-        self.read_unknown(wire_type).map(|_| ())
-    }
-
-    /// Read raw bytes into the supplied vector.  The vector will be resized as needed and
-    /// overwritten.
-    pub fn read_raw_bytes_into(&mut self, count: u32, target: &mut Vec<u8>) -> ProtobufResult<()> {
-        self.source.read_exact_to_vec(count as usize, target)
-    }
-
-    /// Read exact number of bytes
-    pub fn read_raw_bytes(&mut self, count: u32) -> ProtobufResult<Vec<u8>> {
-        let mut r = Vec::new();
-        self.read_raw_bytes_into(count, &mut r)?;
-        Ok(r)
-    }
-
-    /// Skip exact number of bytes
-    pub fn skip_raw_bytes(&mut self, count: u32) -> ProtobufResult<()> {
-        // TODO: make it more efficient
-        self.read_raw_bytes(count).map(|_| ())
-    }
-
-    /// Read `bytes` field, length delimited
-    pub fn read_bytes(&mut self) -> ProtobufResult<Vec<u8>> {
-        let mut r = Vec::new();
-        self.read_bytes_into(&mut r)?;
-        Ok(r)
-    }
-
-    /// Read `bytes` field, length delimited
-    #[cfg(feature = "bytes")]
-    pub fn read_carllerche_bytes(&mut self) -> ProtobufResult<Bytes> {
-        let len = self.read_raw_varint32()?;
-        self.read_raw_callerche_bytes(len as usize)
-    }
-
-    /// Read `string` field, length delimited
-    #[cfg(feature = "bytes")]
-    pub fn read_carllerche_chars(&mut self) -> ProtobufResult<Chars> {
-        let bytes = self.read_carllerche_bytes()?;
-        Ok(Chars::from_bytes(bytes)?)
-    }
-
-    /// Read `bytes` field, length delimited
-    pub fn read_bytes_into(&mut self, target: &mut Vec<u8>) -> ProtobufResult<()> {
-        let len = self.read_raw_varint32()?;
-        self.read_raw_bytes_into(len, target)?;
-        Ok(())
-    }
-
-    /// Read `string` field, length delimited
-    pub fn read_string(&mut self) -> ProtobufResult<String> {
-        let mut r = String::new();
-        self.read_string_into(&mut r)?;
-        Ok(r)
-    }
-
-    /// Read `string` field, length delimited
-    pub fn read_string_into(&mut self, target: &mut String) -> ProtobufResult<()> {
-        target.clear();
-        // take target's buffer
-        let mut vec = mem::replace(target, String::new()).into_bytes();
-        self.read_bytes_into(&mut vec)?;
-
-        let s = match String::from_utf8(vec) {
-            Ok(t) => t,
-            Err(_) => return Err(ProtobufError::WireError(WireError::Utf8Error)),
-        };
-        *target = s;
-        Ok(())
-    }
-
-    /// Read message, do not check if message is initialized
-    pub fn merge_message<M: Message>(&mut self, message: &mut M) -> ProtobufResult<()> {
-        let len = self.read_raw_varint64()?;
-        let old_limit = self.push_limit(len)?;
-        message.merge_from(self)?;
-        self.pop_limit(old_limit);
-        Ok(())
-    }
-
-    /// Read message
-    pub fn read_message<M: Message>(&mut self) -> ProtobufResult<M> {
-        let mut r: M = Message::new();
-        self.merge_message(&mut r)?;
-        r.check_initialized()?;
-        Ok(r)
-    }
-}
-
-impl<'a> Read for CodedInputStream<'a> {
-    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
-        self.source.read(buf).map_err(Into::into)
-    }
-}
-
-impl<'a> BufRead for CodedInputStream<'a> {
-    fn fill_buf(&mut self) -> io::Result<&[u8]> {
-        self.source.fill_buf().map_err(Into::into)
-    }
-
-    fn consume(&mut self, amt: usize) {
-        self.source.consume(amt)
-    }
-}
-
-/// Helper internal utility, should not be used directly
-#[doc(hidden)]
-pub trait WithCodedInputStream {
-    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>;
-}
-
-impl<'a> WithCodedInputStream for &'a mut (dyn Read + 'a) {
-    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
-    {
-        let mut is = CodedInputStream::new(self);
-        let r = cb(&mut is)?;
-        is.check_eof()?;
-        Ok(r)
-    }
-}
-
-impl<'a> WithCodedInputStream for &'a mut (dyn BufRead + 'a) {
-    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
-    {
-        let mut is = CodedInputStream::from_buffered_reader(self);
-        let r = cb(&mut is)?;
-        is.check_eof()?;
-        Ok(r)
-    }
-}
-
-impl<'a> WithCodedInputStream for &'a [u8] {
-    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
-    {
-        let mut is = CodedInputStream::from_bytes(self);
-        let r = cb(&mut is)?;
-        is.check_eof()?;
-        Ok(r)
-    }
-}
-
-#[cfg(feature = "bytes")]
-impl<'a> WithCodedInputStream for &'a Bytes {
-    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
-    {
-        let mut is = CodedInputStream::from_carllerche_bytes(self);
-        let r = cb(&mut is)?;
-        is.check_eof()?;
-        Ok(r)
-    }
-}
-
-#[cfg(test)]
-mod test {
-
-    use std::fmt::Debug;
-    use std::io;
-    use std::io::BufRead;
-    use std::io::Read;
-
-    use super::CodedInputStream;
-    use super::READ_RAW_BYTES_MAX_ALLOC;
-    use crate::error::ProtobufError;
-    use crate::error::ProtobufResult;
-    use crate::hex::decode_hex;
-
-    fn test_read_partial<F>(hex: &str, mut callback: F)
-    where
-        F: FnMut(&mut CodedInputStream),
-    {
-        let d = decode_hex(hex);
-        let mut reader = io::Cursor::new(d);
-        let mut is = CodedInputStream::from_buffered_reader(&mut reader as &mut dyn BufRead);
-        assert_eq!(0, is.pos());
-        callback(&mut is);
-    }
-
-    fn test_read<F>(hex: &str, mut callback: F)
-    where
-        F: FnMut(&mut CodedInputStream),
-    {
-        let len = decode_hex(hex).len();
-        test_read_partial(hex, |reader| {
-            callback(reader);
-            assert!(reader.eof().expect("eof"));
-            assert_eq!(len as u64, reader.pos());
-        });
-    }
-
-    fn test_read_v<F, V>(hex: &str, v: V, mut callback: F)
-    where
-        F: FnMut(&mut CodedInputStream) -> ProtobufResult<V>,
-        V: PartialEq + Debug,
-    {
-        test_read(hex, |reader| {
-            assert_eq!(v, callback(reader).unwrap());
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_byte() {
-        test_read("17", |is| {
-            assert_eq!(23, is.read_raw_byte().unwrap());
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_varint() {
-        test_read_v("07", 7, |reader| reader.read_raw_varint32());
-        test_read_v("07", 7, |reader| reader.read_raw_varint64());
-
-        test_read_v("96 01", 150, |reader| reader.read_raw_varint32());
-        test_read_v("96 01", 150, |reader| reader.read_raw_varint64());
-
-        test_read_v(
-            "ff ff ff ff ff ff ff ff ff 01",
-            0xffffffffffffffff,
-            |reader| reader.read_raw_varint64(),
-        );
-
-        test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
-            reader.read_raw_varint32()
-        });
-        test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
-            reader.read_raw_varint64()
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_vaint_malformed() {
-        // varint cannot have length > 10
-        test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
-            let result = reader.read_raw_varint64();
-            match result {
-                // TODO: make an enum variant
-                Err(ProtobufError::WireError(..)) => (),
-                _ => panic!(),
-            }
-        });
-        test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
-            let result = reader.read_raw_varint32();
-            match result {
-                // TODO: make an enum variant
-                Err(ProtobufError::WireError(..)) => (),
-                _ => panic!(),
-            }
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_varint_unexpected_eof() {
-        test_read_partial("96 97", |reader| {
-            let result = reader.read_raw_varint32();
-            match result {
-                Err(ProtobufError::WireError(..)) => (),
-                _ => panic!(),
-            }
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_varint_pos() {
-        test_read_partial("95 01 98", |reader| {
-            assert_eq!(149, reader.read_raw_varint32().unwrap());
-            assert_eq!(2, reader.pos());
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_int32() {
-        test_read_v("02", 2, |reader| reader.read_int32());
-    }
-
-    #[test]
-    fn test_input_stream_read_float() {
-        test_read_v("95 73 13 61", 17e19, |is| is.read_float());
-    }
-
-    #[test]
-    fn test_input_stream_read_double() {
-        test_read_v("40 d5 ab 68 b3 07 3d 46", 23e29, |is| is.read_double());
-    }
-
-    #[test]
-    fn test_input_stream_skip_raw_bytes() {
-        test_read("", |reader| {
-            reader.skip_raw_bytes(0).unwrap();
-        });
-        test_read("aa bb", |reader| {
-            reader.skip_raw_bytes(2).unwrap();
-        });
-        test_read("aa bb cc dd ee ff", |reader| {
-            reader.skip_raw_bytes(6).unwrap();
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_bytes() {
-        test_read("", |reader| {
-            assert_eq!(
-                Vec::from(&b""[..]),
-                reader.read_raw_bytes(0).expect("read_raw_bytes")
-            );
-        })
-    }
-
-    #[test]
-    fn test_input_stream_limits() {
-        test_read("aa bb cc", |is| {
-            let old_limit = is.push_limit(1).unwrap();
-            assert_eq!(1, is.bytes_until_limit());
-            let r1 = is.read_raw_bytes(1).unwrap();
-            assert_eq!(&[0xaa as u8], &r1[..]);
-            is.pop_limit(old_limit);
-            let r2 = is.read_raw_bytes(2).unwrap();
-            assert_eq!(&[0xbb as u8, 0xcc], &r2[..]);
-        });
-    }
-
-    #[test]
-    fn test_input_stream_io_read() {
-        test_read("aa bb cc", |is| {
-            let mut buf = [0; 3];
-            assert_eq!(Read::read(is, &mut buf).expect("io::Read"), 3);
-            assert_eq!(buf, [0xaa, 0xbb, 0xcc]);
-        });
-    }
-
-    #[test]
-    fn test_input_stream_io_bufread() {
-        test_read("aa bb cc", |is| {
-            assert_eq!(
-                BufRead::fill_buf(is).expect("io::BufRead::fill_buf"),
-                &[0xaa, 0xbb, 0xcc]
-            );
-            BufRead::consume(is, 3);
-        });
-    }
-
-    #[test]
-    fn test_input_stream_read_raw_bytes_into_huge() {
-        let mut v = Vec::new();
-        for i in 0..READ_RAW_BYTES_MAX_ALLOC + 1000 {
-            v.push((i % 10) as u8);
-        }
-
-        let mut slice: &[u8] = v.as_slice();
-
-        let mut is = CodedInputStream::new(&mut slice);
-
-        let mut buf = Vec::new();
-
-        is.read_raw_bytes_into(READ_RAW_BYTES_MAX_ALLOC as u32 + 10, &mut buf)
-            .expect("read");
-
-        assert_eq!(READ_RAW_BYTES_MAX_ALLOC + 10, buf.len());
-
-        buf.clear();
-
-        is.read_raw_bytes_into(1000 - 10, &mut buf).expect("read");
-
-        assert_eq!(1000 - 10, buf.len());
-
-        assert!(is.eof().expect("eof"));
-    }
-}
diff --git a/src/buf_read_iter.rs b/src/coded_input_stream/buf_read_iter.rs
similarity index 60%
rename from src/buf_read_iter.rs
rename to src/coded_input_stream/buf_read_iter.rs
index ff1fce2..94109f2 100644
--- a/src/buf_read_iter.rs
+++ b/src/coded_input_stream/buf_read_iter.rs
@@ -4,7 +4,6 @@
 use std::io::Read;
 use std::mem;
 use std::mem::MaybeUninit;
-use std::u64;
 
 #[cfg(feature = "bytes")]
 use bytes::buf::UninitSlice;
@@ -15,30 +14,19 @@
 #[cfg(feature = "bytes")]
 use bytes::BytesMut;
 
-use crate::buf_read_or_reader::BufReadOrReader;
+use crate::coded_input_stream::buf_read_or_reader::BufReadOrReader;
+use crate::coded_input_stream::input_buf::InputBuf;
+use crate::coded_input_stream::input_source::InputSource;
 use crate::coded_input_stream::READ_RAW_BYTES_MAX_ALLOC;
+use crate::error::ProtobufError;
 use crate::error::WireError;
-use crate::misc::maybe_uninit_write_slice;
-use crate::misc::vec_spare_capacity_mut;
-use crate::ProtobufError;
-use crate::ProtobufResult;
 
 // If an input stream is constructed with a `Read`, we create a
 // `BufReader` with an internal buffer of this size.
 const INPUT_STREAM_BUFFER_SIZE: usize = 4096;
 
-const USE_UNSAFE_FOR_SPEED: bool = true;
-
 const NO_LIMIT: u64 = u64::MAX;
 
-/// Hold all possible combinations of input source
-enum InputSource<'a> {
-    Read(BufReadOrReader<'a>),
-    Slice(&'a [u8]),
-    #[cfg(feature = "bytes")]
-    Bytes(&'a Bytes),
-}
-
 /// Dangerous implementation of `BufRead`.
 ///
 /// Unsafe wrapper around BufRead which assumes that `BufRead` buf is
@@ -53,11 +41,10 @@
 /// It is important for `CodedInputStream` performance that small reads
 /// (e. g. 4 bytes reads) do not involve virtual calls or switches.
 /// This is achievable with `BufReadIter`.
+#[derive(Debug)]
 pub(crate) struct BufReadIter<'a> {
     input_source: InputSource<'a>,
-    buf: &'a [u8],
-    pos_within_buf: usize,
-    limit_within_buf: usize,
+    buf: InputBuf<'a>,
     pos_of_buf_start: u64,
     limit: u64,
 }
@@ -65,56 +52,48 @@
 impl<'a> Drop for BufReadIter<'a> {
     fn drop(&mut self) {
         match self.input_source {
-            InputSource::Read(ref mut buf_read) => buf_read.consume(self.pos_within_buf),
+            InputSource::Read(ref mut buf_read) => buf_read.consume(self.buf.pos_within_buf()),
             _ => {}
         }
     }
 }
 
-impl<'ignore> BufReadIter<'ignore> {
-    pub(crate) fn from_read<'a>(read: &'a mut dyn Read) -> BufReadIter<'a> {
+impl<'a> BufReadIter<'a> {
+    pub(crate) fn from_read(read: &'a mut dyn Read) -> BufReadIter<'a> {
         BufReadIter {
             input_source: InputSource::Read(BufReadOrReader::BufReader(BufReader::with_capacity(
                 INPUT_STREAM_BUFFER_SIZE,
                 read,
             ))),
-            buf: &[],
-            pos_within_buf: 0,
-            limit_within_buf: 0,
+            buf: InputBuf::empty(),
             pos_of_buf_start: 0,
             limit: NO_LIMIT,
         }
     }
 
-    pub(crate) fn from_buf_read<'a>(buf_read: &'a mut dyn BufRead) -> BufReadIter<'a> {
+    pub(crate) fn from_buf_read(buf_read: &'a mut dyn BufRead) -> BufReadIter<'a> {
         BufReadIter {
             input_source: InputSource::Read(BufReadOrReader::BufRead(buf_read)),
-            buf: &[],
-            pos_within_buf: 0,
-            limit_within_buf: 0,
+            buf: InputBuf::empty(),
             pos_of_buf_start: 0,
             limit: NO_LIMIT,
         }
     }
 
-    pub(crate) fn from_byte_slice<'a>(bytes: &'a [u8]) -> BufReadIter<'a> {
+    pub(crate) fn from_byte_slice(bytes: &'a [u8]) -> BufReadIter<'a> {
         BufReadIter {
             input_source: InputSource::Slice(bytes),
-            buf: bytes,
-            pos_within_buf: 0,
-            limit_within_buf: bytes.len(),
+            buf: InputBuf::from_bytes(bytes),
             pos_of_buf_start: 0,
             limit: NO_LIMIT,
         }
     }
 
     #[cfg(feature = "bytes")]
-    pub(crate) fn from_bytes<'a>(bytes: &'a Bytes) -> BufReadIter<'a> {
+    pub(crate) fn from_bytes(bytes: &'a Bytes) -> BufReadIter<'a> {
         BufReadIter {
             input_source: InputSource::Bytes(bytes),
-            buf: &bytes,
-            pos_within_buf: 0,
-            limit_within_buf: bytes.len(),
+            buf: InputBuf::from_bytes(&bytes),
             pos_of_buf_start: 0,
             limit: NO_LIMIT,
         }
@@ -122,36 +101,31 @@
 
     #[inline]
     fn assertions(&self) {
-        debug_assert!(self.pos_within_buf <= self.limit_within_buf);
-        debug_assert!(self.limit_within_buf <= self.buf.len());
-        debug_assert!(self.pos_of_buf_start + self.pos_within_buf as u64 <= self.limit);
+        debug_assert!(self.pos() <= self.limit);
+        self.buf.assertions();
     }
 
     #[inline(always)]
     pub(crate) fn pos(&self) -> u64 {
-        self.pos_of_buf_start + self.pos_within_buf as u64
+        self.pos_of_buf_start + self.buf.pos_within_buf() as u64
     }
 
     /// Recompute `limit_within_buf` after update of `limit`
     #[inline]
     fn update_limit_within_buf(&mut self) {
-        if self.pos_of_buf_start + (self.buf.len() as u64) <= self.limit {
-            self.limit_within_buf = self.buf.len();
-        } else {
-            self.limit_within_buf = (self.limit - self.pos_of_buf_start) as usize;
-        }
-
+        assert!(self.limit >= self.pos_of_buf_start);
+        self.buf.update_limit(self.limit - self.pos_of_buf_start);
         self.assertions();
     }
 
-    pub(crate) fn push_limit(&mut self, limit: u64) -> ProtobufResult<u64> {
+    pub(crate) fn push_limit(&mut self, limit: u64) -> crate::Result<u64> {
         let new_limit = match self.pos().checked_add(limit) {
             Some(new_limit) => new_limit,
-            None => return Err(ProtobufError::WireError(WireError::Other)),
+            None => return Err(ProtobufError::WireError(WireError::LimitOverflow).into()),
         };
 
         if new_limit > self.limit {
-            return Err(ProtobufError::WireError(WireError::Other));
+            return Err(ProtobufError::WireError(WireError::LimitIncrease).into());
         }
 
         let prev_limit = mem::replace(&mut self.limit, new_limit);
@@ -170,22 +144,19 @@
         self.update_limit_within_buf();
     }
 
-    #[inline]
+    #[inline(always)]
     pub(crate) fn remaining_in_buf(&self) -> &[u8] {
-        if USE_UNSAFE_FOR_SPEED {
-            unsafe {
-                &self
-                    .buf
-                    .get_unchecked(self.pos_within_buf..self.limit_within_buf)
-            }
-        } else {
-            &self.buf[self.pos_within_buf..self.limit_within_buf]
-        }
+        self.buf.remaining_in_buf()
+    }
+
+    #[inline]
+    pub(crate) fn consume(&mut self, amt: usize) {
+        self.buf.consume(amt);
     }
 
     #[inline(always)]
     pub(crate) fn remaining_in_buf_len(&self) -> usize {
-        self.limit_within_buf - self.pos_within_buf
+        self.remaining_in_buf().len()
     }
 
     #[inline(always)]
@@ -193,66 +164,48 @@
         if self.limit == NO_LIMIT {
             NO_LIMIT
         } else {
-            self.limit - (self.pos_of_buf_start + self.pos_within_buf as u64)
+            self.limit - self.pos()
         }
     }
 
     #[inline(always)]
-    pub(crate) fn eof(&mut self) -> ProtobufResult<bool> {
-        if self.pos_within_buf == self.limit_within_buf {
-            Ok(self.fill_buf()?.is_empty())
-        } else {
+    pub(crate) fn eof(&mut self) -> crate::Result<bool> {
+        if self.remaining_in_buf_len() != 0 {
             Ok(false)
+        } else {
+            Ok(self.fill_buf()?.is_empty())
         }
     }
 
+    fn read_byte_slow(&mut self) -> crate::Result<u8> {
+        self.fill_buf_slow()?;
+
+        if let Some(b) = self.buf.read_byte() {
+            return Ok(b);
+        }
+
+        Err(WireError::UnexpectedEof.into())
+    }
+
     #[inline(always)]
-    pub(crate) fn read_byte(&mut self) -> ProtobufResult<u8> {
-        if self.pos_within_buf == self.limit_within_buf {
-            self.do_fill_buf()?;
-            if self.remaining_in_buf_len() == 0 {
-                return Err(ProtobufError::WireError(WireError::UnexpectedEof));
-            }
+    pub(crate) fn read_byte(&mut self) -> crate::Result<u8> {
+        if let Some(b) = self.buf.read_byte() {
+            return Ok(b);
         }
 
-        let r = if USE_UNSAFE_FOR_SPEED {
-            unsafe { *self.buf.get_unchecked(self.pos_within_buf) }
-        } else {
-            self.buf[self.pos_within_buf]
-        };
-        self.pos_within_buf += 1;
-        Ok(r)
-    }
-
-    /// Read at most `max` bytes, append to `Vec`.
-    ///
-    /// Returns 0 when EOF or limit reached.
-    fn read_to_vec(&mut self, vec: &mut Vec<u8>, max: usize) -> ProtobufResult<usize> {
-        let len = {
-            let rem = self.fill_buf()?;
-
-            let len = cmp::min(rem.len(), max);
-            vec.extend_from_slice(&rem[..len]);
-            len
-        };
-        self.pos_within_buf += len;
-        Ok(len)
+        self.read_byte_slow()
     }
 
     #[cfg(feature = "bytes")]
-    pub(crate) fn read_exact_bytes(&mut self, len: usize) -> ProtobufResult<Bytes> {
+    pub(crate) fn read_exact_bytes(&mut self, len: usize) -> crate::Result<Bytes> {
         if let InputSource::Bytes(bytes) = self.input_source {
-            let end = match self.pos_within_buf.checked_add(len) {
-                Some(end) => end,
-                None => return Err(ProtobufError::WireError(WireError::UnexpectedEof)),
-            };
-
-            if end > self.limit_within_buf {
-                return Err(ProtobufError::WireError(WireError::UnexpectedEof));
+            if len > self.remaining_in_buf_len() {
+                return Err(ProtobufError::WireError(WireError::UnexpectedEof).into());
             }
+            let end = self.buf.pos_within_buf() + len;
 
-            let r = bytes.slice(self.pos_within_buf..end);
-            self.pos_within_buf += len;
+            let r = bytes.slice(self.buf.pos_within_buf()..end);
+            self.buf.consume(len);
             Ok(r)
         } else {
             if len >= READ_RAW_BYTES_MAX_ALLOC {
@@ -280,67 +233,78 @@
     }
 
     /// Returns 0 when EOF or limit reached.
-    pub(crate) fn read(&mut self, buf: &mut [u8]) -> ProtobufResult<usize> {
-        self.fill_buf()?;
-
-        let rem = &self.buf[self.pos_within_buf..self.limit_within_buf];
+    pub(crate) fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
+        let rem = self.fill_buf()?;
 
         let len = cmp::min(rem.len(), buf.len());
         buf[..len].copy_from_slice(&rem[..len]);
-        self.pos_within_buf += len;
+        self.buf.consume(len);
         Ok(len)
     }
 
-    fn read_exact_slow(&mut self, buf: &mut [MaybeUninit<u8>]) -> ProtobufResult<()> {
+    fn consume_buf(&mut self) -> crate::Result<()> {
+        match &mut self.input_source {
+            InputSource::Read(read) => {
+                read.consume(self.buf.pos_within_buf());
+                self.pos_of_buf_start += self.buf.pos_within_buf() as u64;
+                self.buf = InputBuf::empty();
+                self.assertions();
+                Ok(())
+            }
+            _ => Err(WireError::UnexpectedEof.into()),
+        }
+    }
+
+    /// Read at most `max` bytes.
+    ///
+    /// Returns 0 when EOF or limit reached.
+    fn read_to_vec(&mut self, vec: &mut Vec<u8>, max: usize) -> crate::Result<usize> {
+        let rem = self.fill_buf()?;
+
+        let len = cmp::min(rem.len(), max);
+        vec.extend_from_slice(&rem[..len]);
+        self.buf.consume(len);
+        Ok(len)
+    }
+
+    fn read_exact_slow(&mut self, buf: &mut [MaybeUninit<u8>]) -> crate::Result<()> {
         if self.bytes_until_limit() < buf.len() as u64 {
-            return Err(ProtobufError::WireError(WireError::UnexpectedEof));
+            return Err(ProtobufError::WireError(WireError::UnexpectedEof).into());
         }
 
-        let consume = self.pos_within_buf;
-        self.pos_of_buf_start += self.pos_within_buf as u64;
-        self.pos_within_buf = 0;
-        self.buf = &[];
-        self.limit_within_buf = 0;
+        self.consume_buf()?;
 
-        match self.input_source {
-            InputSource::Read(ref mut buf_read) => {
-                buf_read.consume(consume);
+        match &mut self.input_source {
+            InputSource::Read(buf_read) => {
                 buf_read.read_exact_uninit(buf)?;
+                self.pos_of_buf_start += buf.len() as u64;
+                self.assertions();
+                Ok(())
             }
-            _ => {
-                return Err(ProtobufError::WireError(WireError::UnexpectedEof));
-            }
+            _ => unreachable!(),
         }
-
-        self.pos_of_buf_start += buf.len() as u64;
-
-        self.assertions();
-
-        Ok(())
     }
 
     #[inline]
-    pub(crate) fn read_exact(&mut self, buf: &mut [MaybeUninit<u8>]) -> ProtobufResult<()> {
+    pub(crate) fn read_exact(&mut self, buf: &mut [MaybeUninit<u8>]) -> crate::Result<()> {
         if self.remaining_in_buf_len() >= buf.len() {
-            let buf_len = buf.len();
-            maybe_uninit_write_slice(
-                buf,
-                &self.buf[self.pos_within_buf..self.pos_within_buf + buf_len],
-            );
-            self.pos_within_buf += buf_len;
+            self.buf.read_bytes(buf);
             return Ok(());
         }
 
         self.read_exact_slow(buf)
     }
 
-    /// Read exact number of bytes into `Vec`.
-    ///
-    /// `Vec` is cleared in the beginning.
-    pub fn read_exact_to_vec(&mut self, count: usize, target: &mut Vec<u8>) -> ProtobufResult<()> {
+    /// Read raw bytes into the supplied vector.  The vector will be resized as needed and
+    /// overwritten.
+    pub(crate) fn read_exact_to_vec(
+        &mut self,
+        count: usize,
+        target: &mut Vec<u8>,
+    ) -> crate::Result<()> {
         // TODO: also do some limits when reading from unlimited source
         if count as u64 > self.bytes_until_limit() {
-            return Err(ProtobufError::WireError(WireError::TruncatedMessage));
+            return Err(ProtobufError::WireError(WireError::TruncatedMessage).into());
         }
 
         target.clear();
@@ -351,24 +315,23 @@
             target.reserve(READ_RAW_BYTES_MAX_ALLOC);
 
             while target.len() < count {
-                let need_to_read = count - target.len();
-                if need_to_read <= target.len() {
-                    target.reserve_exact(need_to_read);
+                if count - target.len() <= target.len() {
+                    target.reserve_exact(count - target.len());
                 } else {
                     target.reserve(1);
                 }
 
-                let max = cmp::min(target.capacity() - target.len(), need_to_read);
+                let max = cmp::min(target.capacity() - target.len(), count - target.len());
                 let read = self.read_to_vec(target, max)?;
                 if read == 0 {
-                    return Err(ProtobufError::WireError(WireError::TruncatedMessage));
+                    return Err(ProtobufError::WireError(WireError::TruncatedMessage).into());
                 }
             }
         } else {
             target.reserve_exact(count);
 
             unsafe {
-                self.read_exact(&mut vec_spare_capacity_mut(target)[..count])?;
+                self.read_exact(&mut target.spare_capacity_mut()[..count])?;
                 target.set_len(count);
             }
         }
@@ -378,56 +341,68 @@
         Ok(())
     }
 
-    fn do_fill_buf(&mut self) -> ProtobufResult<()> {
-        debug_assert!(self.pos_within_buf == self.limit_within_buf);
+    pub(crate) fn skip_bytes(&mut self, count: u32) -> crate::Result<()> {
+        if count as usize <= self.remaining_in_buf_len() {
+            self.buf.consume(count as usize);
+            return Ok(());
+        }
 
-        // Limit is reached, do not fill buf, because otherwise
-        // synchronous read from `CodedInputStream` may block.
+        if count as u64 > self.bytes_until_limit() {
+            return Err(WireError::TruncatedMessage.into());
+        }
+
+        self.consume_buf()?;
+
+        match &mut self.input_source {
+            InputSource::Read(read) => {
+                read.skip_bytes(count as usize)?;
+                self.pos_of_buf_start += count as u64;
+                self.assertions();
+                Ok(())
+            }
+            _ => unreachable!(),
+        }
+    }
+
+    fn fill_buf_slow(&mut self) -> crate::Result<()> {
+        self.assertions();
         if self.limit == self.pos() {
             return Ok(());
         }
 
-        let consume = self.buf.len();
-        self.pos_of_buf_start += self.buf.len() as u64;
-        self.buf = &[];
-        self.pos_within_buf = 0;
-        self.limit_within_buf = 0;
+        match self.input_source {
+            InputSource::Read(..) => {}
+            _ => return Ok(()),
+        }
+
+        self.consume_buf()?;
 
         match self.input_source {
             InputSource::Read(ref mut buf_read) => {
-                buf_read.consume(consume);
-                self.buf = unsafe { mem::transmute(buf_read.fill_buf()?) };
+                self.buf = unsafe { InputBuf::from_bytes_ignore_lifetime(buf_read.fill_buf()?) };
+                self.update_limit_within_buf();
+                Ok(())
             }
             _ => {
-                return Ok(());
+                unreachable!();
             }
         }
-
-        self.update_limit_within_buf();
-
-        Ok(())
     }
 
     #[inline(always)]
-    pub(crate) fn fill_buf(&mut self) -> ProtobufResult<&[u8]> {
-        if self.pos_within_buf == self.limit_within_buf {
-            self.do_fill_buf()?;
+    pub(crate) fn fill_buf(&mut self) -> crate::Result<&[u8]> {
+        let rem = self.buf.remaining_in_buf();
+        if !rem.is_empty() {
+            return Ok(rem);
         }
 
-        Ok(if USE_UNSAFE_FOR_SPEED {
-            unsafe {
-                self.buf
-                    .get_unchecked(self.pos_within_buf..self.limit_within_buf)
-            }
-        } else {
-            &self.buf[self.pos_within_buf..self.limit_within_buf]
-        })
-    }
+        if self.limit == self.pos() {
+            return Ok(&[]);
+        }
 
-    #[inline(always)]
-    pub(crate) fn consume(&mut self, amt: usize) {
-        assert!(amt <= self.limit_within_buf - self.pos_within_buf);
-        self.pos_within_buf += amt;
+        self.fill_buf_slow()?;
+
+        Ok(self.buf.remaining_in_buf())
     }
 }
 
@@ -448,6 +423,7 @@
     }
 
     #[test]
+    #[cfg_attr(miri, ignore)] // bytes violates SB, see https://github.com/tokio-rs/bytes/issues/522
     fn read_exact_bytes_from_slice() {
         let bytes = make_long_string(100);
         let mut bri = BufReadIter::from_byte_slice(&bytes[..]);
@@ -456,6 +432,7 @@
     }
 
     #[test]
+    #[cfg_attr(miri, ignore)] // bytes violates SB, see https://github.com/tokio-rs/bytes/issues/522
     fn read_exact_bytes_from_bytes() {
         let bytes = Bytes::from(make_long_string(100));
         let mut bri = BufReadIter::from_bytes(&bytes);
diff --git a/src/buf_read_or_reader.rs b/src/coded_input_stream/buf_read_or_reader.rs
similarity index 75%
rename from src/buf_read_or_reader.rs
rename to src/coded_input_stream/buf_read_or_reader.rs
index 6a47c76..d27d6ed 100644
--- a/src/buf_read_or_reader.rs
+++ b/src/coded_input_stream/buf_read_or_reader.rs
@@ -1,6 +1,7 @@
 //! `BufRead` pointer or `BufReader` owned.
 
 use std::cmp;
+use std::fmt;
 use std::io;
 use std::io::BufRead;
 use std::io::BufReader;
@@ -15,6 +16,15 @@
     BufRead(&'a mut dyn BufRead),
 }
 
+impl<'a> fmt::Debug for BufReadOrReader<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            BufReadOrReader::BufReader(..) => write!(f, "BufReader(...)"),
+            BufReadOrReader::BufRead(..) => write!(f, "BufRead(...)"),
+        }
+    }
+}
+
 impl<'a> Read for BufReadOrReader<'a> {
     fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
         match self {
@@ -66,6 +76,23 @@
         }
         Ok(())
     }
+
+    pub(crate) fn skip_bytes(&mut self, count: usize) -> Result<(), io::Error> {
+        let mut rem = count;
+        while rem != 0 {
+            let buf = self.fill_buf()?;
+            if buf.is_empty() {
+                return Err(io::Error::new(
+                    io::ErrorKind::UnexpectedEof,
+                    "Unexpected end of file",
+                ));
+            }
+            let consume = cmp::min(buf.len(), rem);
+            self.consume(consume);
+            rem -= consume;
+        }
+        Ok(())
+    }
 }
 
 impl<'a> BufRead for BufReadOrReader<'a> {
diff --git a/src/coded_input_stream/input_buf.rs b/src/coded_input_stream/input_buf.rs
new file mode 100644
index 0000000..d5d6252
--- /dev/null
+++ b/src/coded_input_stream/input_buf.rs
@@ -0,0 +1,82 @@
+use std::cmp;
+use std::mem::MaybeUninit;
+
+use crate::misc::maybe_uninit_write_slice;
+
+#[derive(Debug)]
+pub(crate) struct InputBuf<'a> {
+    // Invariants: `0 <= pos_within_buf <= limit_within_buf <= buf.len()`.
+    buf: &'a [u8],
+    pos_within_buf: usize,
+    limit_within_buf: usize,
+}
+
+impl<'a> InputBuf<'a> {
+    #[inline]
+    pub(crate) fn assertions(&self) {
+        debug_assert!(self.pos_within_buf <= self.limit_within_buf);
+        debug_assert!(self.limit_within_buf <= self.buf.len());
+    }
+
+    pub(crate) fn empty() -> InputBuf<'a> {
+        InputBuf {
+            buf: &[],
+            pos_within_buf: 0,
+            limit_within_buf: 0,
+        }
+    }
+
+    pub(crate) fn from_bytes(buf: &'a [u8]) -> InputBuf<'a> {
+        InputBuf {
+            buf,
+            pos_within_buf: 0,
+            limit_within_buf: buf.len(),
+        }
+    }
+
+    pub(crate) unsafe fn from_bytes_ignore_lifetime(buf: &[u8]) -> InputBuf<'a> {
+        let buf = &*(buf as *const [u8]);
+        Self::from_bytes(buf)
+    }
+
+    pub(crate) fn update_limit(&mut self, limit: u64) {
+        let limit_within_buf = cmp::min(self.buf.len() as u64, limit);
+        assert!(limit_within_buf >= self.pos_within_buf as u64);
+        self.limit_within_buf = limit_within_buf as usize;
+    }
+
+    pub(crate) fn pos_within_buf(&self) -> usize {
+        self.pos_within_buf
+    }
+
+    #[inline(always)]
+    pub(crate) fn remaining_in_buf(&self) -> &'a [u8] {
+        // SAFETY: Invariants.
+        unsafe {
+            self.buf
+                .get_unchecked(self.pos_within_buf..self.limit_within_buf)
+        }
+    }
+
+    #[inline(always)]
+    pub(crate) fn consume(&mut self, amt: usize) {
+        assert!(amt <= self.remaining_in_buf().len());
+        self.pos_within_buf += amt;
+    }
+
+    #[inline(always)]
+    pub(crate) fn read_byte(&mut self) -> Option<u8> {
+        let r = self.remaining_in_buf().first().copied();
+        if let Some(..) = r {
+            self.pos_within_buf += 1;
+        }
+        r
+    }
+
+    pub(crate) fn read_bytes<'b>(&mut self, dest: &'b mut [MaybeUninit<u8>]) -> &'b mut [u8] {
+        // This panics if this has not enough data.
+        let r = maybe_uninit_write_slice(dest, &self.remaining_in_buf()[..dest.len()]);
+        self.pos_within_buf += r.len();
+        r
+    }
+}
diff --git a/src/coded_input_stream/input_source.rs b/src/coded_input_stream/input_source.rs
new file mode 100644
index 0000000..5f36475
--- /dev/null
+++ b/src/coded_input_stream/input_source.rs
@@ -0,0 +1,13 @@
+#[cfg(feature = "bytes")]
+use bytes::Bytes;
+
+use crate::coded_input_stream::buf_read_or_reader::BufReadOrReader;
+
+/// Hold all possible combinations of input source
+#[derive(Debug)]
+pub(crate) enum InputSource<'a> {
+    Read(BufReadOrReader<'a>),
+    Slice(&'a [u8]),
+    #[cfg(feature = "bytes")]
+    Bytes(&'a Bytes),
+}
diff --git a/src/coded_input_stream/mod.rs b/src/coded_input_stream/mod.rs
new file mode 100644
index 0000000..a979df1
--- /dev/null
+++ b/src/coded_input_stream/mod.rs
@@ -0,0 +1,985 @@
+mod buf_read_iter;
+mod buf_read_or_reader;
+mod input_buf;
+mod input_source;
+
+use std::io;
+use std::io::BufRead;
+use std::io::Read;
+use std::mem;
+use std::mem::MaybeUninit;
+
+#[cfg(feature = "bytes")]
+use ::bytes::Bytes;
+
+#[cfg(feature = "bytes")]
+use crate::chars::Chars;
+use crate::coded_input_stream::buf_read_iter::BufReadIter;
+use crate::enums::Enum;
+use crate::error::ProtobufError;
+use crate::error::WireError;
+use crate::misc::maybe_ununit_array_assume_init;
+use crate::reflect::types::ProtobufTypeBool;
+use crate::reflect::types::ProtobufTypeDouble;
+use crate::reflect::types::ProtobufTypeFixed;
+use crate::reflect::types::ProtobufTypeFixed32;
+use crate::reflect::types::ProtobufTypeFixed64;
+use crate::reflect::types::ProtobufTypeFloat;
+use crate::reflect::types::ProtobufTypeInt32;
+use crate::reflect::types::ProtobufTypeInt64;
+use crate::reflect::types::ProtobufTypeSfixed32;
+use crate::reflect::types::ProtobufTypeSfixed64;
+use crate::reflect::types::ProtobufTypeSint32;
+use crate::reflect::types::ProtobufTypeSint64;
+use crate::reflect::types::ProtobufTypeTrait;
+use crate::reflect::types::ProtobufTypeUint32;
+use crate::reflect::types::ProtobufTypeUint64;
+use crate::reflect::MessageDescriptor;
+use crate::unknown::UnknownValue;
+use crate::varint::decode::decode_varint32;
+use crate::varint::decode::decode_varint64;
+use crate::varint::MAX_VARINT_ENCODED_LEN;
+use crate::wire_format;
+use crate::wire_format::WireType;
+use crate::zigzag::decode_zig_zag_32;
+use crate::zigzag::decode_zig_zag_64;
+use crate::EnumOrUnknown;
+use crate::Message;
+use crate::MessageDyn;
+
+// Default recursion level limit. 100 is the default value of C++'s implementation.
+const DEFAULT_RECURSION_LIMIT: u32 = 100;
+
+// Max allocated vec when reading length-delimited from unknown input stream
+pub(crate) const READ_RAW_BYTES_MAX_ALLOC: usize = 10_000_000;
+
+/// Buffered read with handy utilities.
+#[derive(Debug)]
+pub struct CodedInputStream<'a> {
+    source: BufReadIter<'a>,
+    recursion_level: u32,
+    recursion_limit: u32,
+}
+
+impl<'a> CodedInputStream<'a> {
+    /// Wrap a `Read`.
+    ///
+    /// Note resulting `CodedInputStream` is buffered.
+    ///
+    /// If `Read` is buffered, the resulting stream will be double buffered,
+    /// consider using [`from_buf_read`](Self::from_buf_read) instead.
+    pub fn new(read: &'a mut dyn Read) -> CodedInputStream<'a> {
+        CodedInputStream::from_buf_read_iter(BufReadIter::from_read(read))
+    }
+
+    /// Create from `BufRead`.
+    ///
+    /// `CodedInputStream` will utilize `BufRead` buffer.
+    pub fn from_buf_read(buf_read: &'a mut dyn BufRead) -> CodedInputStream<'a> {
+        CodedInputStream::from_buf_read_iter(BufReadIter::from_buf_read(buf_read))
+    }
+
+    /// Read from byte slice
+    pub fn from_bytes(bytes: &'a [u8]) -> CodedInputStream<'a> {
+        CodedInputStream::from_buf_read_iter(BufReadIter::from_byte_slice(bytes))
+    }
+
+    /// Read from `Bytes`.
+    ///
+    /// `CodedInputStream` operations like
+    /// [`read_tokio_bytes`](crate::CodedInputStream::read_tokio_bytes)
+    /// will return a shared copy of this bytes object.
+    #[cfg(feature = "bytes")]
+    pub fn from_tokio_bytes(bytes: &'a Bytes) -> CodedInputStream<'a> {
+        CodedInputStream::from_buf_read_iter(BufReadIter::from_bytes(bytes))
+    }
+
+    fn from_buf_read_iter(source: BufReadIter<'a>) -> CodedInputStream<'a> {
+        CodedInputStream {
+            source,
+            recursion_level: 0,
+            recursion_limit: DEFAULT_RECURSION_LIMIT,
+        }
+    }
+
+    /// Set the recursion limit.
+    pub fn set_recursion_limit(&mut self, limit: u32) {
+        self.recursion_limit = limit;
+    }
+
+    #[inline]
+    pub(crate) fn incr_recursion(&mut self) -> crate::Result<()> {
+        if self.recursion_level >= self.recursion_limit {
+            return Err(ProtobufError::WireError(WireError::OverRecursionLimit).into());
+        }
+        self.recursion_level += 1;
+        Ok(())
+    }
+
+    #[inline]
+    pub(crate) fn decr_recursion(&mut self) {
+        self.recursion_level -= 1;
+    }
+
+    /// How many bytes processed
+    pub fn pos(&self) -> u64 {
+        self.source.pos()
+    }
+
+    /// How many bytes until current limit
+    pub fn bytes_until_limit(&self) -> u64 {
+        self.source.bytes_until_limit()
+    }
+
+    /// Read bytes into given `buf`.
+    #[inline]
+    pub fn read_exact(&mut self, buf: &mut [MaybeUninit<u8>]) -> crate::Result<()> {
+        self.source.read_exact(buf)
+    }
+
+    /// Read exact number of bytes as `Bytes` object.
+    ///
+    /// This operation returns a shared view if `CodedInputStream` is
+    /// constructed with `Bytes` parameter.
+    #[cfg(feature = "bytes")]
+    fn read_raw_tokio_bytes(&mut self, count: usize) -> crate::Result<Bytes> {
+        self.source.read_exact_bytes(count)
+    }
+
+    /// Read one byte
+    #[inline(always)]
+    pub fn read_raw_byte(&mut self) -> crate::Result<u8> {
+        self.source.read_byte()
+    }
+
+    /// Push new limit, return previous limit.
+    pub fn push_limit(&mut self, limit: u64) -> crate::Result<u64> {
+        self.source.push_limit(limit)
+    }
+
+    /// Restore previous limit.
+    pub fn pop_limit(&mut self, old_limit: u64) {
+        self.source.pop_limit(old_limit);
+    }
+
+    /// Are we at EOF?
+    #[inline(always)]
+    pub fn eof(&mut self) -> crate::Result<bool> {
+        self.source.eof()
+    }
+
+    /// Check we are at EOF.
+    ///
+    /// Return error if we are not at EOF.
+    pub fn check_eof(&mut self) -> crate::Result<()> {
+        let eof = self.eof()?;
+        if !eof {
+            return Err(ProtobufError::WireError(WireError::UnexpectedEof).into());
+        }
+        Ok(())
+    }
+
+    fn read_raw_varint64_slow(&mut self) -> crate::Result<u64> {
+        let mut r: u64 = 0;
+        let mut i = 0;
+        loop {
+            if i == MAX_VARINT_ENCODED_LEN {
+                return Err(ProtobufError::WireError(WireError::IncorrectVarint).into());
+            }
+            let b = self.read_raw_byte()?;
+            if i == 9 && (b & 0x7f) > 1 {
+                return Err(ProtobufError::WireError(WireError::IncorrectVarint).into());
+            }
+            r = r | (((b & 0x7f) as u64) << (i * 7));
+            i += 1;
+            if b < 0x80 {
+                return Ok(r);
+            }
+        }
+    }
+
+    fn read_raw_varint32_slow(&mut self) -> crate::Result<u32> {
+        let v = self.read_raw_varint64_slow()?;
+        if v > u32::MAX as u64 {
+            return Err(ProtobufError::WireError(WireError::U32Overflow(v)).into());
+        }
+        Ok(v as u32)
+    }
+
+    /// Read varint
+    #[inline]
+    pub fn read_raw_varint64(&mut self) -> crate::Result<u64> {
+        let rem = self.source.remaining_in_buf();
+
+        match decode_varint64(rem)? {
+            Some((r, c)) => {
+                self.source.consume(c);
+                Ok(r)
+            }
+            None => self.read_raw_varint64_slow(),
+        }
+    }
+
+    /// Read varint
+    #[inline]
+    pub fn read_raw_varint32(&mut self) -> crate::Result<u32> {
+        let rem = self.source.remaining_in_buf();
+
+        match decode_varint32(rem)? {
+            Some((r, c)) => {
+                self.source.consume(c);
+                Ok(r)
+            }
+            None => self.read_raw_varint32_slow(),
+        }
+    }
+
+    #[inline]
+    fn read_raw_varint32_or_eof(&mut self) -> crate::Result<Option<u32>> {
+        let rem = self.source.remaining_in_buf();
+        let v = decode_varint32(rem)?;
+        match v {
+            Some((r, c)) => {
+                self.source.consume(c);
+                Ok(Some(r))
+            }
+            None => {
+                if self.eof()? {
+                    Ok(None)
+                } else {
+                    let v = self.read_raw_varint32_slow()?;
+                    Ok(Some(v))
+                }
+            }
+        }
+    }
+
+    /// Read little-endian 32-bit integer
+    pub fn read_raw_little_endian32(&mut self) -> crate::Result<u32> {
+        let mut bytes = [MaybeUninit::uninit(); 4];
+        self.read_exact(&mut bytes)?;
+        // SAFETY: `read_exact` guarantees that the buffer is filled.
+        let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
+        Ok(u32::from_le_bytes(bytes))
+    }
+
+    /// Read little-endian 64-bit integer
+    pub fn read_raw_little_endian64(&mut self) -> crate::Result<u64> {
+        let mut bytes = [MaybeUninit::uninit(); 8];
+        self.read_exact(&mut bytes)?;
+        // SAFETY: `read_exact` guarantees that the buffer is filled.
+        let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
+        Ok(u64::from_le_bytes(bytes))
+    }
+
+    /// Read tag number as `u32` or None if EOF is reached.
+    #[inline]
+    pub fn read_raw_tag_or_eof(&mut self) -> crate::Result<Option<u32>> {
+        self.read_raw_varint32_or_eof()
+    }
+
+    /// Read tag
+    #[inline]
+    pub(crate) fn read_tag(&mut self) -> crate::Result<wire_format::Tag> {
+        let v = self.read_raw_varint32()?;
+        wire_format::Tag::new(v)
+    }
+
+    /// Read tag, return it is pair (field number, wire type)
+    #[inline]
+    pub(crate) fn read_tag_unpack(&mut self) -> crate::Result<(u32, WireType)> {
+        self.read_tag().map(|t| t.unpack())
+    }
+
+    /// Read `double`
+    pub fn read_double(&mut self) -> crate::Result<f64> {
+        let bits = self.read_raw_little_endian64()?;
+        Ok(f64::from_bits(bits))
+    }
+
+    /// Read `float`
+    pub fn read_float(&mut self) -> crate::Result<f32> {
+        let bits = self.read_raw_little_endian32()?;
+        Ok(f32::from_bits(bits))
+    }
+
+    /// Read `int64`
+    pub fn read_int64(&mut self) -> crate::Result<i64> {
+        self.read_raw_varint64().map(|v| v as i64)
+    }
+
+    /// Read `int32`
+    pub fn read_int32(&mut self) -> crate::Result<i32> {
+        let v = self.read_int64()?;
+        i32::try_from(v).map_err(|_| WireError::I32Overflow(v).into())
+    }
+
+    /// Read `uint64`
+    pub fn read_uint64(&mut self) -> crate::Result<u64> {
+        self.read_raw_varint64()
+    }
+
+    /// Read `uint32`
+    pub fn read_uint32(&mut self) -> crate::Result<u32> {
+        self.read_raw_varint32()
+    }
+
+    /// Read `sint64`
+    pub fn read_sint64(&mut self) -> crate::Result<i64> {
+        self.read_uint64().map(decode_zig_zag_64)
+    }
+
+    /// Read `sint32`
+    pub fn read_sint32(&mut self) -> crate::Result<i32> {
+        self.read_uint32().map(decode_zig_zag_32)
+    }
+
+    /// Read `fixed64`
+    pub fn read_fixed64(&mut self) -> crate::Result<u64> {
+        self.read_raw_little_endian64()
+    }
+
+    /// Read `fixed32`
+    pub fn read_fixed32(&mut self) -> crate::Result<u32> {
+        self.read_raw_little_endian32()
+    }
+
+    /// Read `sfixed64`
+    pub fn read_sfixed64(&mut self) -> crate::Result<i64> {
+        self.read_raw_little_endian64().map(|v| v as i64)
+    }
+
+    /// Read `sfixed32`
+    pub fn read_sfixed32(&mut self) -> crate::Result<i32> {
+        self.read_raw_little_endian32().map(|v| v as i32)
+    }
+
+    /// Read `bool`
+    pub fn read_bool(&mut self) -> crate::Result<bool> {
+        self.read_raw_varint64().map(|v| v != 0)
+    }
+
+    pub(crate) fn read_enum_value(&mut self) -> crate::Result<i32> {
+        self.read_int32()
+    }
+
+    /// Read `enum` as `ProtobufEnum`
+    pub fn read_enum<E: Enum>(&mut self) -> crate::Result<E> {
+        let i = self.read_enum_value()?;
+        match Enum::from_i32(i) {
+            Some(e) => Ok(e),
+            None => Err(ProtobufError::WireError(WireError::InvalidEnumValue(E::NAME, i)).into()),
+        }
+    }
+
+    /// Read `enum` as `ProtobufEnumOrUnknown`
+    pub fn read_enum_or_unknown<E: Enum>(&mut self) -> crate::Result<EnumOrUnknown<E>> {
+        Ok(EnumOrUnknown::from_i32(self.read_int32()?))
+    }
+
+    fn read_repeated_packed_fixed_into<T: ProtobufTypeFixed>(
+        &mut self,
+        target: &mut Vec<T::ProtobufValue>,
+    ) -> crate::Result<()> {
+        let len_bytes = self.read_raw_varint64()?;
+
+        let reserve = if len_bytes <= READ_RAW_BYTES_MAX_ALLOC as u64 {
+            (len_bytes as usize) / (T::ENCODED_SIZE as usize)
+        } else {
+            // prevent OOM on malformed input
+            // probably should truncate
+            READ_RAW_BYTES_MAX_ALLOC / (T::ENCODED_SIZE as usize)
+        };
+
+        target.reserve(reserve);
+
+        let old_limit = self.push_limit(len_bytes)?;
+        while !self.eof()? {
+            target.push(T::read(self)?);
+        }
+        self.pop_limit(old_limit);
+        Ok(())
+    }
+
+    fn read_repeated_packed_into<T: ProtobufTypeTrait>(
+        &mut self,
+        target: &mut Vec<T::ProtobufValue>,
+    ) -> crate::Result<()> {
+        let len_bytes = self.read_raw_varint64()?;
+
+        // value is at least 1 bytes, so this is lower bound of element count
+        let reserve = if len_bytes <= READ_RAW_BYTES_MAX_ALLOC as u64 {
+            len_bytes as usize
+        } else {
+            // prevent OOM on malformed input
+            READ_RAW_BYTES_MAX_ALLOC
+        };
+
+        target.reserve(reserve);
+
+        let old_limit = self.push_limit(len_bytes)?;
+        while !self.eof()? {
+            target.push(T::read(self)?);
+        }
+        self.pop_limit(old_limit);
+        Ok(())
+    }
+
+    /// Read repeated packed `double`
+    pub fn read_repeated_packed_double_into(&mut self, target: &mut Vec<f64>) -> crate::Result<()> {
+        self.read_repeated_packed_fixed_into::<ProtobufTypeDouble>(target)
+    }
+
+    /// Read repeated packed `float`
+    pub fn read_repeated_packed_float_into(&mut self, target: &mut Vec<f32>) -> crate::Result<()> {
+        self.read_repeated_packed_fixed_into::<ProtobufTypeFloat>(target)
+    }
+
+    /// Read repeated packed `int64`
+    pub fn read_repeated_packed_int64_into(&mut self, target: &mut Vec<i64>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeInt64>(target)
+    }
+
+    /// Read repeated packed `int32`
+    pub fn read_repeated_packed_int32_into(&mut self, target: &mut Vec<i32>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeInt32>(target)
+    }
+
+    /// Read repeated packed `uint64`
+    pub fn read_repeated_packed_uint64_into(&mut self, target: &mut Vec<u64>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeUint64>(target)
+    }
+
+    /// Read repeated packed `uint32`
+    pub fn read_repeated_packed_uint32_into(&mut self, target: &mut Vec<u32>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeUint32>(target)
+    }
+
+    /// Read repeated packed `sint64`
+    pub fn read_repeated_packed_sint64_into(&mut self, target: &mut Vec<i64>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeSint64>(target)
+    }
+
+    /// Read repeated packed `sint32`
+    pub fn read_repeated_packed_sint32_into(&mut self, target: &mut Vec<i32>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeSint32>(target)
+    }
+
+    /// Read repeated packed `fixed64`
+    pub fn read_repeated_packed_fixed64_into(
+        &mut self,
+        target: &mut Vec<u64>,
+    ) -> crate::Result<()> {
+        self.read_repeated_packed_fixed_into::<ProtobufTypeFixed64>(target)
+    }
+
+    /// Read repeated packed `fixed32`
+    pub fn read_repeated_packed_fixed32_into(
+        &mut self,
+        target: &mut Vec<u32>,
+    ) -> crate::Result<()> {
+        self.read_repeated_packed_fixed_into::<ProtobufTypeFixed32>(target)
+    }
+
+    /// Read repeated packed `sfixed64`
+    pub fn read_repeated_packed_sfixed64_into(
+        &mut self,
+        target: &mut Vec<i64>,
+    ) -> crate::Result<()> {
+        self.read_repeated_packed_fixed_into::<ProtobufTypeSfixed64>(target)
+    }
+
+    /// Read repeated packed `sfixed32`
+    pub fn read_repeated_packed_sfixed32_into(
+        &mut self,
+        target: &mut Vec<i32>,
+    ) -> crate::Result<()> {
+        self.read_repeated_packed_fixed_into::<ProtobufTypeSfixed32>(target)
+    }
+
+    /// Read repeated packed `bool`
+    pub fn read_repeated_packed_bool_into(&mut self, target: &mut Vec<bool>) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeBool>(target)
+    }
+
+    /// Read repeated packed enum values into the vector.
+    pub(crate) fn read_repeated_packed_enum_values_into(
+        &mut self,
+        target: &mut Vec<i32>,
+    ) -> crate::Result<()> {
+        self.read_repeated_packed_into::<ProtobufTypeInt32>(target)
+    }
+
+    fn skip_group(&mut self) -> crate::Result<()> {
+        while !self.eof()? {
+            let wire_type = self.read_tag_unpack()?.1;
+            if wire_type == WireType::EndGroup {
+                break;
+            }
+            self.skip_field(wire_type)?;
+        }
+        Ok(())
+    }
+
+    /// Read `UnknownValue`
+    pub fn read_unknown(&mut self, wire_type: WireType) -> crate::Result<UnknownValue> {
+        match wire_type {
+            WireType::Varint => self.read_raw_varint64().map(|v| UnknownValue::Varint(v)),
+            WireType::Fixed64 => self.read_fixed64().map(|v| UnknownValue::Fixed64(v)),
+            WireType::Fixed32 => self.read_fixed32().map(|v| UnknownValue::Fixed32(v)),
+            WireType::LengthDelimited => {
+                let len = self.read_raw_varint32()?;
+                self.read_raw_bytes(len)
+                    .map(|v| UnknownValue::LengthDelimited(v))
+            }
+            WireType::StartGroup => {
+                self.skip_group()?;
+                // We do not support groups, so just return something.
+                Ok(UnknownValue::LengthDelimited(Vec::new()))
+            }
+            WireType::EndGroup => {
+                Err(ProtobufError::WireError(WireError::UnexpectedWireType(wire_type)).into())
+            }
+        }
+    }
+
+    /// Skip field.
+    pub fn skip_field(&mut self, wire_type: WireType) -> crate::Result<()> {
+        match wire_type {
+            WireType::Varint => self.read_raw_varint64().map(|_| ()),
+            WireType::Fixed64 => self.read_fixed64().map(|_| ()),
+            WireType::Fixed32 => self.read_fixed32().map(|_| ()),
+            WireType::LengthDelimited => {
+                let len = self.read_raw_varint32()?;
+                self.skip_raw_bytes(len)
+            }
+            WireType::StartGroup => self.skip_group(),
+            WireType::EndGroup => {
+                Err(ProtobufError::WireError(WireError::UnexpectedWireType(wire_type)).into())
+            }
+        }
+    }
+
+    /// Read raw bytes into the supplied vector.  The vector will be resized as needed and
+    /// overwritten.
+    pub fn read_raw_bytes_into(&mut self, count: u32, target: &mut Vec<u8>) -> crate::Result<()> {
+        self.source.read_exact_to_vec(count as usize, target)
+    }
+
+    /// Read exact number of bytes
+    pub fn read_raw_bytes(&mut self, count: u32) -> crate::Result<Vec<u8>> {
+        let mut r = Vec::new();
+        self.read_raw_bytes_into(count, &mut r)?;
+        Ok(r)
+    }
+
+    /// Skip exact number of bytes
+    pub fn skip_raw_bytes(&mut self, count: u32) -> crate::Result<()> {
+        self.source.skip_bytes(count)
+    }
+
+    /// Read `bytes` field, length delimited
+    pub fn read_bytes(&mut self) -> crate::Result<Vec<u8>> {
+        let mut r = Vec::new();
+        self.read_bytes_into(&mut r)?;
+        Ok(r)
+    }
+
+    /// Read `bytes` field, length delimited
+    #[cfg(feature = "bytes")]
+    pub fn read_tokio_bytes(&mut self) -> crate::Result<Bytes> {
+        let len = self.read_raw_varint32()?;
+        self.read_raw_tokio_bytes(len as usize)
+    }
+
+    /// Read `string` field, length delimited
+    #[cfg(feature = "bytes")]
+    pub fn read_tokio_chars(&mut self) -> crate::Result<Chars> {
+        let bytes = self.read_tokio_bytes()?;
+        Ok(Chars::from_bytes(bytes).map_err(ProtobufError::Utf8)?)
+    }
+
+    /// Read `bytes` field, length delimited
+    pub fn read_bytes_into(&mut self, target: &mut Vec<u8>) -> crate::Result<()> {
+        let len = self.read_raw_varint32()?;
+        self.read_raw_bytes_into(len, target)?;
+        Ok(())
+    }
+
+    /// Read `string` field, length delimited
+    pub fn read_string(&mut self) -> crate::Result<String> {
+        let mut r = String::new();
+        self.read_string_into(&mut r)?;
+        Ok(r)
+    }
+
+    /// Read `string` field, length delimited
+    pub fn read_string_into(&mut self, target: &mut String) -> crate::Result<()> {
+        target.clear();
+        // take target's buffer
+        let mut vec = mem::replace(target, String::new()).into_bytes();
+        self.read_bytes_into(&mut vec)?;
+
+        let s = match String::from_utf8(vec) {
+            Ok(t) => t,
+            Err(_) => return Err(ProtobufError::WireError(WireError::Utf8Error).into()),
+        };
+        *target = s;
+        Ok(())
+    }
+
+    /// Read message, do not check if message is initialized
+    pub fn merge_message<M: Message>(&mut self, message: &mut M) -> crate::Result<()> {
+        self.incr_recursion()?;
+        struct DecrRecursion<'a, 'b>(&'a mut CodedInputStream<'b>);
+        impl<'a, 'b> Drop for DecrRecursion<'a, 'b> {
+            fn drop(&mut self) {
+                self.0.decr_recursion();
+            }
+        }
+
+        let mut decr = DecrRecursion(self);
+
+        let len = decr.0.read_raw_varint64()?;
+        let old_limit = decr.0.push_limit(len)?;
+        message.merge_from(&mut decr.0)?;
+        decr.0.pop_limit(old_limit);
+        Ok(())
+    }
+
+    /// Like `merge_message`, but for dynamic messages.
+    pub fn merge_message_dyn(&mut self, message: &mut dyn MessageDyn) -> crate::Result<()> {
+        let len = self.read_raw_varint64()?;
+        let old_limit = self.push_limit(len)?;
+        message.merge_from_dyn(self)?;
+        self.pop_limit(old_limit);
+        Ok(())
+    }
+
+    /// Read message
+    pub fn read_message<M: Message>(&mut self) -> crate::Result<M> {
+        let mut r: M = Message::new();
+        self.merge_message(&mut r)?;
+        r.check_initialized()?;
+        Ok(r)
+    }
+
+    /// Read message.
+    pub fn read_message_dyn(
+        &mut self,
+        descriptor: &MessageDescriptor,
+    ) -> crate::Result<Box<dyn MessageDyn>> {
+        let mut r = descriptor.new_instance();
+        self.merge_message_dyn(&mut *r)?;
+        r.check_initialized_dyn()?;
+        Ok(r)
+    }
+}
+
+impl<'a> Read for CodedInputStream<'a> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.source.read(buf).map_err(Into::into)
+    }
+}
+
+impl<'a> BufRead for CodedInputStream<'a> {
+    fn fill_buf(&mut self) -> io::Result<&[u8]> {
+        self.source.fill_buf().map_err(Into::into)
+    }
+
+    fn consume(&mut self, amt: usize) {
+        self.source.consume(amt)
+    }
+}
+
+#[cfg(test)]
+mod test {
+
+    use std::fmt::Debug;
+    use std::io;
+    use std::io::BufRead;
+    use std::io::Read;
+
+    use super::CodedInputStream;
+    use super::READ_RAW_BYTES_MAX_ALLOC;
+    use crate::error::ProtobufError;
+    use crate::hex::decode_hex;
+    use crate::wire_format::Tag;
+    use crate::wire_format::WireType;
+    use crate::CodedOutputStream;
+
+    fn test_read_partial<F>(hex: &str, mut callback: F)
+    where
+        F: FnMut(&mut CodedInputStream),
+    {
+        let d = decode_hex(hex);
+        // Test with buffered reader.
+        {
+            let mut reader = io::Cursor::new(&d);
+            let mut is = CodedInputStream::from_buf_read(&mut reader as &mut dyn BufRead);
+            assert_eq!(0, is.pos());
+            callback(&mut is);
+        }
+        // Test from bytes.
+        {
+            let mut is = CodedInputStream::from_bytes(&d);
+            assert_eq!(0, is.pos());
+            callback(&mut is);
+        }
+    }
+
+    fn test_read<F>(hex: &str, mut callback: F)
+    where
+        F: FnMut(&mut CodedInputStream),
+    {
+        let len = decode_hex(hex).len();
+        test_read_partial(hex, |reader| {
+            callback(reader);
+            assert!(reader.eof().expect("eof"));
+            assert_eq!(len as u64, reader.pos());
+        });
+    }
+
+    fn test_read_v<F, V>(hex: &str, v: V, mut callback: F)
+    where
+        F: FnMut(&mut CodedInputStream) -> crate::Result<V>,
+        V: PartialEq + Debug,
+    {
+        test_read(hex, |reader| {
+            assert_eq!(v, callback(reader).unwrap());
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_byte() {
+        test_read("17", |is| {
+            assert_eq!(23, is.read_raw_byte().unwrap());
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_varint() {
+        test_read_v("07", 7, |reader| reader.read_raw_varint32());
+        test_read_v("07", 7, |reader| reader.read_raw_varint64());
+
+        test_read_v("96 01", 150, |reader| reader.read_raw_varint32());
+        test_read_v("96 01", 150, |reader| reader.read_raw_varint64());
+
+        test_read_v(
+            "ff ff ff ff ff ff ff ff ff 01",
+            0xffffffffffffffff,
+            |reader| reader.read_raw_varint64(),
+        );
+
+        test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
+            reader.read_raw_varint32()
+        });
+        test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
+            reader.read_raw_varint64()
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_varint_out_of_range() {
+        test_read_partial("ff ff ff ff ff ff ff ff ff 02", |is| {
+            assert!(is.read_raw_varint64().is_err());
+        });
+        test_read_partial("ff ff ff ff ff ff ff ff ff 02", |is| {
+            assert!(is.read_raw_varint32().is_err());
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_varint_too_long() {
+        // varint cannot have length > 10
+        test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
+            let error = reader.read_raw_varint64().unwrap_err().0;
+            match *error {
+                ProtobufError::WireError(..) => (),
+                _ => panic!(),
+            }
+        });
+        test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
+            let error = reader.read_raw_varint32().unwrap_err().0;
+            match *error {
+                ProtobufError::WireError(..) => (),
+                _ => panic!(),
+            }
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_varint_unexpected_eof() {
+        test_read_partial("96 97", |reader| {
+            let error = reader.read_raw_varint32().unwrap_err().0;
+            match *error {
+                ProtobufError::WireError(..) => (),
+                _ => panic!(),
+            }
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_varint_pos() {
+        test_read_partial("95 01 98", |reader| {
+            assert_eq!(149, reader.read_raw_varint32().unwrap());
+            assert_eq!(2, reader.pos());
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_int32() {
+        test_read_v("02", 2, |reader| reader.read_int32());
+    }
+
+    #[test]
+    fn test_input_stream_read_float() {
+        test_read_v("95 73 13 61", 17e19, |is| is.read_float());
+    }
+
+    #[test]
+    fn test_input_stream_read_double() {
+        test_read_v("40 d5 ab 68 b3 07 3d 46", 23e29, |is| is.read_double());
+    }
+
+    #[test]
+    fn test_input_stream_skip_raw_bytes() {
+        test_read("", |reader| {
+            reader.skip_raw_bytes(0).unwrap();
+        });
+        test_read("aa bb", |reader| {
+            reader.skip_raw_bytes(2).unwrap();
+        });
+        test_read("aa bb cc dd ee ff", |reader| {
+            reader.skip_raw_bytes(6).unwrap();
+        });
+    }
+
+    #[test]
+    fn test_input_stream_read_raw_bytes() {
+        test_read("", |reader| {
+            assert_eq!(
+                Vec::from(&b""[..]),
+                reader.read_raw_bytes(0).expect("read_raw_bytes")
+            );
+        })
+    }
+
+    #[test]
+    fn test_input_stream_limits() {
+        test_read("aa bb cc", |is| {
+            let old_limit = is.push_limit(1).unwrap();
+            assert_eq!(1, is.bytes_until_limit());
+            let r1 = is.read_raw_bytes(1).unwrap();
+            assert_eq!(&[0xaa as u8], &r1[..]);
+            is.pop_limit(old_limit);
+            let r2 = is.read_raw_bytes(2).unwrap();
+            assert_eq!(&[0xbb as u8, 0xcc], &r2[..]);
+        });
+    }
+
+    #[test]
+    fn test_input_stream_io_read() {
+        test_read("aa bb cc", |is| {
+            let mut buf = [0; 3];
+            assert_eq!(Read::read(is, &mut buf).expect("io::Read"), 3);
+            assert_eq!(buf, [0xaa, 0xbb, 0xcc]);
+        });
+    }
+
+    #[test]
+    fn test_input_stream_io_bufread() {
+        test_read("aa bb cc", |is| {
+            assert_eq!(
+                BufRead::fill_buf(is).expect("io::BufRead::fill_buf"),
+                &[0xaa, 0xbb, 0xcc]
+            );
+            BufRead::consume(is, 3);
+        });
+    }
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Miri is too slow for this test.
+    fn test_input_stream_read_raw_bytes_into_huge() {
+        let mut v = Vec::new();
+        for i in 0..READ_RAW_BYTES_MAX_ALLOC + 1000 {
+            v.push((i % 10) as u8);
+        }
+
+        let mut slice: &[u8] = v.as_slice();
+
+        let mut is = CodedInputStream::new(&mut slice);
+
+        let mut buf = Vec::new();
+
+        is.read_raw_bytes_into(READ_RAW_BYTES_MAX_ALLOC as u32 + 10, &mut buf)
+            .expect("read");
+
+        assert_eq!(READ_RAW_BYTES_MAX_ALLOC + 10, buf.len());
+
+        buf.clear();
+
+        is.read_raw_bytes_into(1000 - 10, &mut buf).expect("read");
+
+        assert_eq!(1000 - 10, buf.len());
+
+        assert!(is.eof().expect("eof"));
+    }
+
+    // Copy of this test: https://tinyurl.com/34hfavtz
+    #[test]
+    fn test_skip_group() {
+        // Create an output stream with a group in:
+        // Field 1: string "field 1"
+        // Field 2: group containing:
+        //   Field 1: fixed int32 value 100
+        //   Field 2: string "ignore me"
+        //   Field 3: nested group containing
+        //      Field 1: fixed int64 value 1000
+        // Field 3: string "field 3"
+
+        let mut vec = Vec::new();
+        let mut os = CodedOutputStream::new(&mut vec);
+        os.write_tag(1, WireType::LengthDelimited).unwrap();
+        os.write_string_no_tag("field 1").unwrap();
+
+        // The outer group...
+        os.write_tag(2, WireType::StartGroup).unwrap();
+        os.write_tag(1, WireType::Fixed32).unwrap();
+        os.write_fixed32_no_tag(100).unwrap();
+        os.write_tag(3, WireType::LengthDelimited).unwrap();
+        os.write_string_no_tag("ignore me").unwrap();
+        // The nested group...
+        os.write_tag(3, WireType::StartGroup).unwrap();
+        os.write_tag(1, WireType::Fixed64).unwrap();
+        os.write_fixed64_no_tag(1000).unwrap();
+        // Note: Not sure the field number is relevant for end group...
+        os.write_tag(3, WireType::EndGroup).unwrap();
+
+        // End the outer group
+        os.write_tag(2, WireType::EndGroup).unwrap();
+
+        os.write_tag(3, WireType::LengthDelimited).unwrap();
+        os.write_string_no_tag("field 3").unwrap();
+        os.flush().unwrap();
+        drop(os);
+
+        let mut input = CodedInputStream::from_bytes(&vec);
+        // Now act like a generated client
+        assert_eq!(
+            Tag::make(1, WireType::LengthDelimited),
+            input.read_tag().unwrap()
+        );
+        assert_eq!("field 1", &input.read_string().unwrap());
+        assert_eq!(
+            Tag::make(2, WireType::StartGroup),
+            input.read_tag().unwrap()
+        );
+        input.skip_field(WireType::StartGroup).unwrap();
+        assert_eq!(
+            Tag::make(3, WireType::LengthDelimited),
+            input.read_tag().unwrap()
+        );
+        assert_eq!("field 3", input.read_string().unwrap());
+    }
+}
diff --git a/src/coded_output_stream.rs b/src/coded_output_stream.rs
deleted file mode 100644
index 2bbe0a3..0000000
--- a/src/coded_output_stream.rs
+++ /dev/null
@@ -1,756 +0,0 @@
-use std::io;
-use std::io::Write;
-use std::mem;
-use std::mem::MaybeUninit;
-use std::ptr;
-use std::slice;
-
-use crate::misc::maybe_uninit_write;
-use crate::misc::maybe_uninit_write_slice;
-use crate::misc::vec_spare_capacity_mut;
-use crate::varint;
-use crate::wire_format;
-use crate::zigzag::encode_zig_zag_32;
-use crate::zigzag::encode_zig_zag_64;
-use crate::Message;
-use crate::ProtobufEnum;
-use crate::ProtobufError;
-use crate::ProtobufResult;
-use crate::UnknownFields;
-use crate::UnknownValueRef;
-
-/// Equal to the default buffer size of `BufWriter`, so when
-/// `CodedOutputStream` wraps `BufWriter`, it often skips double buffering.
-const OUTPUT_STREAM_BUFFER_SIZE: usize = 8 * 1024;
-
-#[doc(hidden)]
-pub trait WithCodedOutputStream {
-    fn with_coded_output_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedOutputStream) -> ProtobufResult<T>;
-}
-
-impl<'a> WithCodedOutputStream for &'a mut (dyn Write + 'a) {
-    fn with_coded_output_stream<T, F>(self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedOutputStream) -> ProtobufResult<T>,
-    {
-        let mut os = CodedOutputStream::new(self);
-        let r = cb(&mut os)?;
-        os.flush()?;
-        Ok(r)
-    }
-}
-
-impl<'a> WithCodedOutputStream for &'a mut Vec<u8> {
-    fn with_coded_output_stream<T, F>(mut self, cb: F) -> ProtobufResult<T>
-    where
-        F: FnOnce(&mut CodedOutputStream) -> ProtobufResult<T>,
-    {
-        let mut os = CodedOutputStream::vec(&mut self);
-        let r = cb(&mut os)?;
-        os.flush()?;
-        Ok(r)
-    }
-}
-
-#[doc(hidden)]
-pub fn with_coded_output_stream_to_bytes<F>(cb: F) -> ProtobufResult<Vec<u8>>
-where
-    F: FnOnce(&mut CodedOutputStream) -> ProtobufResult<()>,
-{
-    let mut v = Vec::new();
-    v.with_coded_output_stream(cb)?;
-    Ok(v)
-}
-
-/// Output buffer/writer for `CodedOutputStream`.
-enum OutputTarget<'a> {
-    Write(&'a mut dyn Write, Vec<u8>),
-    Vec(&'a mut Vec<u8>),
-    /// The buffer is passed as `&[u8]` to `CodedOutputStream` constructor
-    /// and immediately converted to `buffer` field of `CodedOutputStream`,
-    /// it is not needed to be stored here.
-    /// Lifetime parameter of `CodedOutputStream` guarantees the buffer is valid
-    /// during the lifetime of `CodedOutputStream`.
-    Bytes,
-}
-
-/// Buffered write with handy utilities
-pub struct CodedOutputStream<'a> {
-    target: OutputTarget<'a>,
-    // Actual buffer is owned by `OutputTarget`,
-    // and here we alias the buffer so access to the buffer is branchless:
-    // access does not require switch by actual target type: `&[], `Vec`, `Write` etc.
-    // We don't access the actual buffer in `OutputTarget` except when
-    // we initialize `buffer` field here.
-    buffer: *mut [MaybeUninit<u8>],
-    // within buffer
-    position: usize,
-}
-
-impl<'a> CodedOutputStream<'a> {
-    /// Construct from given `Write`.
-    ///
-    /// `CodedOutputStream` is buffered even if `Write` is not
-    pub fn new(writer: &'a mut dyn Write) -> CodedOutputStream<'a> {
-        let buffer_len = OUTPUT_STREAM_BUFFER_SIZE;
-
-        let mut buffer_storage = Vec::with_capacity(buffer_len);
-
-        // SAFETY: we are not using the `buffer_storage`
-        // except for initializing the `buffer` field.
-        // See `buffer` field documentation.
-        let buffer = vec_spare_capacity_mut(&mut buffer_storage);
-        let buffer: *mut [MaybeUninit<u8>] = buffer;
-
-        CodedOutputStream {
-            target: OutputTarget::Write(writer, buffer_storage),
-            buffer,
-            position: 0,
-        }
-    }
-
-    /// `CodedOutputStream` which writes directly to bytes.
-    ///
-    /// Attempt to write more than bytes capacity results in error.
-    pub fn bytes(bytes: &'a mut [u8]) -> CodedOutputStream<'a> {
-        // SAFETY: it is safe to cast from &mut [u8] to &mut [MaybeUninit<u8>].
-        let buffer =
-            ptr::slice_from_raw_parts_mut(bytes.as_mut_ptr() as *mut MaybeUninit<u8>, bytes.len());
-        CodedOutputStream {
-            target: OutputTarget::Bytes,
-            buffer,
-            position: 0,
-        }
-    }
-
-    /// `CodedOutputStream` which writes directly to `Vec<u8>`.
-    ///
-    /// Caller should call `flush` at the end to guarantee vec contains
-    /// all written data.
-    pub fn vec(vec: &'a mut Vec<u8>) -> CodedOutputStream<'a> {
-        let buffer: *mut [MaybeUninit<u8>] = &mut [];
-        CodedOutputStream {
-            target: OutputTarget::Vec(vec),
-            buffer,
-            position: 0,
-        }
-    }
-
-    /// Check if EOF is reached.
-    ///
-    /// # Panics
-    ///
-    /// If underlying write has no EOF
-    pub fn check_eof(&self) {
-        match self.target {
-            OutputTarget::Bytes => {
-                assert_eq!(self.buffer().len() as u64, self.position as u64);
-            }
-            OutputTarget::Write(..) | OutputTarget::Vec(..) => {
-                panic!("must not be called with Writer or Vec");
-            }
-        }
-    }
-
-    #[inline(always)]
-    fn buffer(&self) -> &[MaybeUninit<u8>] {
-        // SAFETY: see the `buffer` field documentation about invariants.
-        unsafe { &*(self.buffer as *mut [MaybeUninit<u8>]) }
-    }
-
-    #[inline(always)]
-    fn filled_buffer_impl<'s>(buffer: *mut [MaybeUninit<u8>], position: usize) -> &'s [u8] {
-        // SAFETY: this function is safe assuming `buffer` and `position`
-        //   are `self.buffer` and `safe.position`:
-        //   * `CodedOutputStream` has invariant that `position <= buffer.len()`.
-        //   * `buffer` is filled up to `position`.
-        unsafe { slice::from_raw_parts_mut(buffer as *mut u8, position) }
-    }
-
-    fn refresh_buffer(&mut self) -> ProtobufResult<()> {
-        match self.target {
-            OutputTarget::Write(ref mut write, _) => {
-                write.write_all(Self::filled_buffer_impl(self.buffer, self.position))?;
-                self.position = 0;
-            }
-            OutputTarget::Vec(ref mut vec) => unsafe {
-                let vec_len = vec.len();
-                assert!(vec_len + self.position <= vec.capacity());
-                vec.set_len(vec_len + self.position);
-                vec.reserve(1);
-                self.buffer = vec_spare_capacity_mut(vec);
-                self.position = 0;
-            },
-            OutputTarget::Bytes => {
-                return Err(ProtobufError::IoError(io::Error::new(
-                    io::ErrorKind::Other,
-                    "given slice is too small to serialize the message",
-                )));
-            }
-        }
-        Ok(())
-    }
-
-    /// Flush the buffer to underlying write
-    pub fn flush(&mut self) -> ProtobufResult<()> {
-        match self.target {
-            OutputTarget::Bytes => Ok(()),
-            OutputTarget::Write(..) | OutputTarget::Vec(..) => {
-                // TODO: must not reserve additional in Vec
-                self.refresh_buffer()
-            }
-        }
-    }
-
-    /// Write a byte
-    pub fn write_raw_byte(&mut self, byte: u8) -> ProtobufResult<()> {
-        if self.position as usize == self.buffer().len() {
-            self.refresh_buffer()?;
-        }
-        unsafe { maybe_uninit_write(&mut (&mut *self.buffer)[self.position as usize], byte) };
-        self.position += 1;
-        Ok(())
-    }
-
-    /// Write bytes
-    pub fn write_raw_bytes(&mut self, bytes: &[u8]) -> ProtobufResult<()> {
-        if bytes.len() <= self.buffer().len() - self.position {
-            let bottom = self.position as usize;
-            let top = bottom + (bytes.len() as usize);
-            // SAFETY: see the `buffer` field documentation about invariants.
-            let buffer = unsafe { &mut (&mut *self.buffer)[bottom..top] };
-            maybe_uninit_write_slice(buffer, bytes);
-            self.position += bytes.len();
-            return Ok(());
-        }
-
-        self.refresh_buffer()?;
-
-        assert!(self.position == 0);
-
-        if self.position + bytes.len() < self.buffer().len() {
-            // SAFETY: see the `buffer` field documentation about invariants.
-            let buffer =
-                unsafe { &mut (&mut *self.buffer)[self.position..self.position + bytes.len()] };
-            maybe_uninit_write_slice(buffer, bytes);
-            self.position += bytes.len();
-            return Ok(());
-        }
-
-        match self.target {
-            OutputTarget::Bytes => {
-                unreachable!();
-            }
-            OutputTarget::Write(ref mut write, _) => {
-                write.write_all(bytes)?;
-            }
-            OutputTarget::Vec(ref mut vec) => {
-                vec.extend(bytes);
-                self.buffer = vec_spare_capacity_mut(vec)
-            }
-        }
-        Ok(())
-    }
-
-    /// Write a tag
-    pub fn write_tag(
-        &mut self,
-        field_number: u32,
-        wire_type: wire_format::WireType,
-    ) -> ProtobufResult<()> {
-        self.write_raw_varint32(wire_format::Tag::make(field_number, wire_type).value())
-    }
-
-    /// Write varint
-    pub fn write_raw_varint32(&mut self, value: u32) -> ProtobufResult<()> {
-        if self.buffer().len() - self.position >= 5 {
-            // fast path
-            let len = unsafe {
-                varint::encode_varint32(value, &mut (&mut *self.buffer)[self.position..])
-            };
-            self.position += len;
-            Ok(())
-        } else {
-            // slow path
-            let buf = &mut [0u8; 5];
-            let len = varint::encode_varint32(value, unsafe {
-                slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
-            });
-            self.write_raw_bytes(&buf[..len])
-        }
-    }
-
-    /// Write varint
-    pub fn write_raw_varint64(&mut self, value: u64) -> ProtobufResult<()> {
-        if self.buffer().len() - self.position >= 10 {
-            // fast path
-            let len = unsafe {
-                varint::encode_varint64(value, &mut (&mut *self.buffer)[self.position..])
-            };
-            self.position += len;
-            Ok(())
-        } else {
-            // slow path
-            let buf = &mut [0u8; 10];
-            let len = varint::encode_varint64(value, unsafe {
-                slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
-            });
-            self.write_raw_bytes(&buf[..len])
-        }
-    }
-
-    /// Write 32-bit integer little endian
-    pub fn write_raw_little_endian32(&mut self, value: u32) -> ProtobufResult<()> {
-        let bytes = unsafe { mem::transmute::<_, [u8; 4]>(value.to_le()) };
-        self.write_raw_bytes(&bytes)
-    }
-
-    /// Write 64-bit integer little endian
-    pub fn write_raw_little_endian64(&mut self, value: u64) -> ProtobufResult<()> {
-        let bytes = unsafe { mem::transmute::<_, [u8; 8]>(value.to_le()) };
-        self.write_raw_bytes(&bytes)
-    }
-
-    /// Write `float`
-    pub fn write_float_no_tag(&mut self, value: f32) -> ProtobufResult<()> {
-        let bits = unsafe { mem::transmute::<f32, u32>(value) };
-        self.write_raw_little_endian32(bits)
-    }
-
-    /// Write `double`
-    pub fn write_double_no_tag(&mut self, value: f64) -> ProtobufResult<()> {
-        let bits = unsafe { mem::transmute::<f64, u64>(value) };
-        self.write_raw_little_endian64(bits)
-    }
-
-    /// Write `float` field
-    pub fn write_float(&mut self, field_number: u32, value: f32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeFixed32)?;
-        self.write_float_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `double` field
-    pub fn write_double(&mut self, field_number: u32, value: f64) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeFixed64)?;
-        self.write_double_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write varint
-    pub fn write_uint64_no_tag(&mut self, value: u64) -> ProtobufResult<()> {
-        self.write_raw_varint64(value)
-    }
-
-    /// Write varint
-    pub fn write_uint32_no_tag(&mut self, value: u32) -> ProtobufResult<()> {
-        self.write_raw_varint32(value)
-    }
-
-    /// Write varint
-    pub fn write_int64_no_tag(&mut self, value: i64) -> ProtobufResult<()> {
-        self.write_raw_varint64(value as u64)
-    }
-
-    /// Write varint
-    pub fn write_int32_no_tag(&mut self, value: i32) -> ProtobufResult<()> {
-        self.write_raw_varint64(value as u64)
-    }
-
-    /// Write zigzag varint
-    pub fn write_sint64_no_tag(&mut self, value: i64) -> ProtobufResult<()> {
-        self.write_uint64_no_tag(encode_zig_zag_64(value))
-    }
-
-    /// Write zigzag varint
-    pub fn write_sint32_no_tag(&mut self, value: i32) -> ProtobufResult<()> {
-        self.write_uint32_no_tag(encode_zig_zag_32(value))
-    }
-
-    /// Write `fixed64`
-    pub fn write_fixed64_no_tag(&mut self, value: u64) -> ProtobufResult<()> {
-        self.write_raw_little_endian64(value)
-    }
-
-    /// Write `fixed32`
-    pub fn write_fixed32_no_tag(&mut self, value: u32) -> ProtobufResult<()> {
-        self.write_raw_little_endian32(value)
-    }
-
-    /// Write `sfixed64`
-    pub fn write_sfixed64_no_tag(&mut self, value: i64) -> ProtobufResult<()> {
-        self.write_raw_little_endian64(value as u64)
-    }
-
-    /// Write `sfixed32`
-    pub fn write_sfixed32_no_tag(&mut self, value: i32) -> ProtobufResult<()> {
-        self.write_raw_little_endian32(value as u32)
-    }
-
-    /// Write `bool`
-    pub fn write_bool_no_tag(&mut self, value: bool) -> ProtobufResult<()> {
-        self.write_raw_varint32(if value { 1 } else { 0 })
-    }
-
-    /// Write `enum`
-    pub fn write_enum_no_tag(&mut self, value: i32) -> ProtobufResult<()> {
-        self.write_int32_no_tag(value)
-    }
-
-    /// Write `enum`
-    pub fn write_enum_obj_no_tag<E>(&mut self, value: E) -> ProtobufResult<()>
-    where
-        E: ProtobufEnum,
-    {
-        self.write_enum_no_tag(value.value())
-    }
-
-    /// Write unknown value
-    pub fn write_unknown_no_tag(&mut self, unknown: UnknownValueRef) -> ProtobufResult<()> {
-        match unknown {
-            UnknownValueRef::Fixed64(fixed64) => self.write_raw_little_endian64(fixed64),
-            UnknownValueRef::Fixed32(fixed32) => self.write_raw_little_endian32(fixed32),
-            UnknownValueRef::Varint(varint) => self.write_raw_varint64(varint),
-            UnknownValueRef::LengthDelimited(bytes) => self.write_bytes_no_tag(bytes),
-        }
-    }
-
-    /// Write `uint64` field
-    pub fn write_uint64(&mut self, field_number: u32, value: u64) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_uint64_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `uint32` field
-    pub fn write_uint32(&mut self, field_number: u32, value: u32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_uint32_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `int64` field
-    pub fn write_int64(&mut self, field_number: u32, value: i64) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_int64_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `int32` field
-    pub fn write_int32(&mut self, field_number: u32, value: i32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_int32_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `sint64` field
-    pub fn write_sint64(&mut self, field_number: u32, value: i64) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_sint64_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `sint32` field
-    pub fn write_sint32(&mut self, field_number: u32, value: i32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_sint32_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `fixed64` field
-    pub fn write_fixed64(&mut self, field_number: u32, value: u64) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeFixed64)?;
-        self.write_fixed64_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `fixed32` field
-    pub fn write_fixed32(&mut self, field_number: u32, value: u32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeFixed32)?;
-        self.write_fixed32_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `sfixed64` field
-    pub fn write_sfixed64(&mut self, field_number: u32, value: i64) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeFixed64)?;
-        self.write_sfixed64_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `sfixed32` field
-    pub fn write_sfixed32(&mut self, field_number: u32, value: i32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeFixed32)?;
-        self.write_sfixed32_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `bool` field
-    pub fn write_bool(&mut self, field_number: u32, value: bool) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_bool_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `enum` field
-    pub fn write_enum(&mut self, field_number: u32, value: i32) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeVarint)?;
-        self.write_enum_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write `enum` field
-    pub fn write_enum_obj<E>(&mut self, field_number: u32, value: E) -> ProtobufResult<()>
-    where
-        E: ProtobufEnum,
-    {
-        self.write_enum(field_number, value.value())
-    }
-
-    /// Write unknown field
-    pub fn write_unknown(
-        &mut self,
-        field_number: u32,
-        value: UnknownValueRef,
-    ) -> ProtobufResult<()> {
-        self.write_tag(field_number, value.wire_type())?;
-        self.write_unknown_no_tag(value)?;
-        Ok(())
-    }
-
-    /// Write unknown fields
-    pub fn write_unknown_fields(&mut self, fields: &UnknownFields) -> ProtobufResult<()> {
-        for (number, values) in fields {
-            for value in values {
-                self.write_unknown(number, value)?;
-            }
-        }
-        Ok(())
-    }
-
-    /// Write bytes
-    pub fn write_bytes_no_tag(&mut self, bytes: &[u8]) -> ProtobufResult<()> {
-        self.write_raw_varint32(bytes.len() as u32)?;
-        self.write_raw_bytes(bytes)?;
-        Ok(())
-    }
-
-    /// Write string
-    pub fn write_string_no_tag(&mut self, s: &str) -> ProtobufResult<()> {
-        self.write_bytes_no_tag(s.as_bytes())
-    }
-
-    /// Write message
-    pub fn write_message_no_tag<M: Message>(&mut self, msg: &M) -> ProtobufResult<()> {
-        msg.write_length_delimited_to(self)
-    }
-
-    /// Write `bytes` field
-    pub fn write_bytes(&mut self, field_number: u32, bytes: &[u8]) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeLengthDelimited)?;
-        self.write_bytes_no_tag(bytes)?;
-        Ok(())
-    }
-
-    /// Write `string` field
-    pub fn write_string(&mut self, field_number: u32, s: &str) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeLengthDelimited)?;
-        self.write_string_no_tag(s)?;
-        Ok(())
-    }
-
-    /// Write `message` field
-    pub fn write_message<M: Message>(&mut self, field_number: u32, msg: &M) -> ProtobufResult<()> {
-        self.write_tag(field_number, wire_format::WireTypeLengthDelimited)?;
-        self.write_message_no_tag(msg)?;
-        Ok(())
-    }
-}
-
-impl<'a> Write for CodedOutputStream<'a> {
-    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
-        self.write_raw_bytes(buf)?;
-        Ok(buf.len())
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        CodedOutputStream::flush(self).map_err(Into::into)
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use std::io::Write;
-    use std::iter;
-
-    use crate::coded_output_stream::CodedOutputStream;
-    use crate::hex::decode_hex;
-    use crate::hex::encode_hex;
-    use crate::wire_format;
-    use crate::ProtobufResult;
-
-    fn test_write<F>(expected: &str, mut gen: F)
-    where
-        F: FnMut(&mut CodedOutputStream) -> ProtobufResult<()>,
-    {
-        let expected_bytes = decode_hex(expected);
-
-        // write to Write
-        {
-            let mut v = Vec::new();
-            {
-                let mut os = CodedOutputStream::new(&mut v as &mut dyn Write);
-                gen(&mut os).unwrap();
-                os.flush().unwrap();
-            }
-            assert_eq!(encode_hex(&expected_bytes), encode_hex(&v));
-        }
-
-        // write to &[u8]
-        {
-            let mut r = Vec::with_capacity(expected_bytes.len());
-            r.resize(expected_bytes.len(), 0);
-            {
-                let mut os = CodedOutputStream::bytes(&mut r);
-                gen(&mut os).unwrap();
-                os.check_eof();
-            }
-            assert_eq!(encode_hex(&expected_bytes), encode_hex(&r));
-        }
-
-        // write to Vec<u8>
-        {
-            let mut r = Vec::new();
-            r.extend(&[11, 22, 33, 44, 55, 66, 77]);
-            {
-                let mut os = CodedOutputStream::vec(&mut r);
-                gen(&mut os).unwrap();
-                os.flush().unwrap();
-            }
-
-            r.drain(..7);
-            assert_eq!(encode_hex(&expected_bytes), encode_hex(&r));
-        }
-    }
-
-    #[test]
-    fn test_output_stream_write_raw_byte() {
-        test_write("a1", |os| os.write_raw_byte(0xa1));
-    }
-
-    #[test]
-    fn test_output_stream_write_tag() {
-        test_write("08", |os| os.write_tag(1, wire_format::WireTypeVarint));
-    }
-
-    #[test]
-    fn test_output_stream_write_raw_bytes() {
-        test_write("00 ab", |os| os.write_raw_bytes(&[0x00, 0xab]));
-
-        let expected = iter::repeat("01 02 03 04")
-            .take(2048)
-            .collect::<Vec<_>>()
-            .join(" ");
-        test_write(&expected, |os| {
-            for _ in 0..2048 {
-                os.write_raw_bytes(&[0x01, 0x02, 0x03, 0x04])?;
-            }
-
-            Ok(())
-        });
-    }
-
-    #[test]
-    fn test_output_stream_write_raw_varint32() {
-        test_write("96 01", |os| os.write_raw_varint32(150));
-        test_write("ff ff ff ff 0f", |os| os.write_raw_varint32(0xffffffff));
-    }
-
-    #[test]
-    fn test_output_stream_write_raw_varint64() {
-        test_write("96 01", |os| os.write_raw_varint64(150));
-        test_write("ff ff ff ff ff ff ff ff ff 01", |os| {
-            os.write_raw_varint64(0xffffffffffffffff)
-        });
-    }
-
-    #[test]
-    fn test_output_stream_write_int32_no_tag() {
-        test_write("ff ff ff ff ff ff ff ff ff 01", |os| {
-            os.write_int32_no_tag(-1)
-        });
-    }
-
-    #[test]
-    fn test_output_stream_write_int64_no_tag() {
-        test_write("ff ff ff ff ff ff ff ff ff 01", |os| {
-            os.write_int64_no_tag(-1)
-        });
-    }
-
-    #[test]
-    fn test_output_stream_write_raw_little_endian32() {
-        test_write("f1 e2 d3 c4", |os| os.write_raw_little_endian32(0xc4d3e2f1));
-    }
-
-    #[test]
-    fn test_output_stream_write_float_no_tag() {
-        test_write("95 73 13 61", |os| os.write_float_no_tag(17e19));
-    }
-
-    #[test]
-    fn test_output_stream_write_double_no_tag() {
-        test_write("40 d5 ab 68 b3 07 3d 46", |os| {
-            os.write_double_no_tag(23e29)
-        });
-    }
-
-    #[test]
-    fn test_output_stream_write_raw_little_endian64() {
-        test_write("f1 e2 d3 c4 b5 a6 07 f8", |os| {
-            os.write_raw_little_endian64(0xf807a6b5c4d3e2f1)
-        });
-    }
-
-    #[test]
-    fn test_output_stream_io_write() {
-        let expected = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77];
-
-        // write to Write
-        {
-            let mut v = Vec::new();
-            {
-                let mut os = CodedOutputStream::new(&mut v as &mut dyn Write);
-                Write::write(&mut os, &expected).expect("io::Write::write");
-                Write::flush(&mut os).expect("io::Write::flush");
-            }
-            assert_eq!(expected, *v);
-        }
-
-        // write to &[u8]
-        {
-            let mut v = Vec::with_capacity(expected.len());
-            v.resize(expected.len(), 0);
-            {
-                let mut os = CodedOutputStream::bytes(&mut v);
-                Write::write(&mut os, &expected).expect("io::Write::write");
-                Write::flush(&mut os).expect("io::Write::flush");
-                os.check_eof();
-            }
-            assert_eq!(expected, *v);
-        }
-
-        // write to Vec<u8>
-        {
-            let mut v = Vec::new();
-            {
-                let mut os = CodedOutputStream::vec(&mut v);
-                Write::write(&mut os, &expected).expect("io::Write::write");
-                Write::flush(&mut os).expect("io::Write::flush");
-            }
-            assert_eq!(expected, *v);
-        }
-    }
-}
diff --git a/src/coded_output_stream/buffer.rs b/src/coded_output_stream/buffer.rs
new file mode 100644
index 0000000..ec4c62f
--- /dev/null
+++ b/src/coded_output_stream/buffer.rs
@@ -0,0 +1,110 @@
+use std::fmt;
+use std::fmt::Formatter;
+use std::mem::MaybeUninit;
+use std::slice;
+
+use crate::misc::maybe_uninit_write_slice;
+
+pub(crate) struct OutputBuffer {
+    // Actual buffer is owned by `OutputTarget`,
+    // and here we alias the buffer so access to the buffer is branchless:
+    // access does not require switch by actual target type: `&[], `Vec`, `Write` etc.
+    // We don't access the actual buffer in `OutputTarget` except when
+    // we initialize `buffer` field here.
+    buffer: *mut [MaybeUninit<u8>],
+    /// Position within the buffer.
+    /// Always correct.
+    pos_within_buf: usize,
+}
+
+impl fmt::Debug for OutputBuffer {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        f.debug_struct("OutputBuffer")
+            .field("buffer.len", &self.buffer().len())
+            .field("pos_within_buf", &self.pos_within_buf)
+            .finish()
+    }
+}
+
+impl OutputBuffer {
+    #[inline]
+    pub(crate) fn new(buffer: *mut [MaybeUninit<u8>]) -> OutputBuffer {
+        Self {
+            buffer,
+            pos_within_buf: 0,
+        }
+    }
+
+    /// Whole buffer: written data + unwritten data.
+    #[inline]
+    pub(crate) fn buffer(&self) -> &[MaybeUninit<u8>] {
+        unsafe { &*self.buffer }
+    }
+
+    #[inline]
+    fn buffer_mut(&mut self) -> &mut [MaybeUninit<u8>] {
+        unsafe { &mut *self.buffer }
+    }
+
+    #[inline]
+    pub(crate) fn pos_within_buf(&self) -> usize {
+        self.pos_within_buf
+    }
+
+    #[inline]
+    pub(crate) fn filled(&self) -> &[u8] {
+        // SAFETY: This type invariant is data is filled up to `pos_within_buf`.
+        unsafe { slice::from_raw_parts_mut(self.buffer as *mut u8, self.pos_within_buf) }
+    }
+
+    #[inline]
+    pub(crate) fn unfilled(&mut self) -> &mut [MaybeUninit<u8>] {
+        // SAFETY: This type invariant is `pos_within_buf` is smaller than buffer length.
+        let pos_within_buf = self.pos_within_buf;
+        unsafe { self.buffer_mut().get_unchecked_mut(pos_within_buf..) }
+    }
+
+    #[inline]
+    pub(crate) fn unfilled_len(&self) -> usize {
+        self.buffer().len() - self.pos_within_buf
+    }
+
+    #[inline]
+    pub(crate) unsafe fn advance(&mut self, n: usize) {
+        debug_assert!(n <= self.unfilled_len());
+        self.pos_within_buf += n;
+    }
+
+    #[inline]
+    pub(crate) fn rewind(&mut self) {
+        self.pos_within_buf = 0;
+    }
+
+    #[inline]
+    pub(crate) fn replace_buffer_keep_pos(&mut self, buffer: *mut [MaybeUninit<u8>]) {
+        unsafe {
+            assert!(self.pos_within_buf <= (&*buffer).len());
+        }
+        self.buffer = buffer;
+    }
+
+    #[inline]
+    pub(crate) unsafe fn write_byte(&mut self, b: u8) {
+        debug_assert!(self.unfilled_len() >= 1);
+        // SAFETY: caller is responsible for ensuring that byte fits in the buffer.
+        let pos_within_buf = self.pos_within_buf;
+        self.buffer_mut().get_unchecked_mut(pos_within_buf).write(b);
+        self.pos_within_buf += 1;
+    }
+
+    #[inline]
+    pub(crate) unsafe fn write_bytes(&mut self, bytes: &[u8]) {
+        debug_assert!(self.unfilled_len() >= bytes.len());
+        let bottom = self.pos_within_buf as usize;
+        let top = bottom + (bytes.len() as usize);
+        // SAFETY: caller is responsible for ensuring that `bytes` fits in the buffer.
+        let buffer = self.buffer_mut().get_unchecked_mut(bottom..top);
+        maybe_uninit_write_slice(buffer, bytes);
+        self.pos_within_buf += bytes.len();
+    }
+}
diff --git a/src/coded_output_stream/mod.rs b/src/coded_output_stream/mod.rs
new file mode 100644
index 0000000..5010df9
--- /dev/null
+++ b/src/coded_output_stream/mod.rs
@@ -0,0 +1,1225 @@
+mod buffer;
+mod output_target;
+pub(crate) mod with;
+
+use std::io;
+use std::io::Write;
+use std::mem::MaybeUninit;
+use std::ptr;
+use std::slice;
+
+use crate::byteorder::LITTLE_ENDIAN;
+use crate::coded_output_stream::buffer::OutputBuffer;
+use crate::coded_output_stream::output_target::OutputTarget;
+use crate::error::ProtobufError;
+use crate::rt::packed::vec_packed_enum_or_unknown_data_size;
+use crate::rt::packed::vec_packed_fixed_data_size;
+use crate::rt::packed::vec_packed_varint_data_size;
+use crate::rt::packed::vec_packed_varint_zigzag_data_size;
+use crate::varint::encode::encode_varint32;
+use crate::varint::encode::encode_varint64;
+use crate::varint::encode::encoded_varint64_len;
+use crate::varint::MAX_VARINT_ENCODED_LEN;
+use crate::wire_format;
+use crate::wire_format::check_message_size;
+use crate::wire_format::WireType;
+use crate::wire_format::MAX_MESSAGE_SIZE;
+use crate::zigzag::encode_zig_zag_32;
+use crate::zigzag::encode_zig_zag_64;
+use crate::Enum;
+use crate::EnumOrUnknown;
+use crate::Message;
+use crate::MessageDyn;
+use crate::MessageFull;
+use crate::UnknownFields;
+use crate::UnknownValueRef;
+
+// Equal to the default buffer size of `BufWriter`, so when
+// `CodedOutputStream` wraps `BufWriter`, it often skips double buffering.
+const OUTPUT_STREAM_BUFFER_SIZE: usize = 8 * 1024;
+
+/// Buffered write with handy utilities
+#[derive(Debug)]
+pub struct CodedOutputStream<'a> {
+    target: OutputTarget<'a>,
+    buffer: OutputBuffer,
+    /// Absolute position of the buffer start.
+    pos_of_buffer_start: u64,
+}
+
+impl<'a> CodedOutputStream<'a> {
+    /// Construct from given `Write`.
+    ///
+    /// `CodedOutputStream` is buffered even if `Write` is not
+    pub fn new(writer: &'a mut dyn Write) -> CodedOutputStream<'a> {
+        let buffer_len = OUTPUT_STREAM_BUFFER_SIZE;
+
+        let mut buffer_storage = Vec::with_capacity(buffer_len);
+
+        // SAFETY: we are not using the `buffer_storage`
+        // except for initializing the `buffer` field.
+        // See `buffer` field documentation.
+        let buffer = OutputBuffer::new(buffer_storage.spare_capacity_mut());
+
+        CodedOutputStream {
+            target: OutputTarget::Write(writer, buffer_storage),
+            buffer,
+            pos_of_buffer_start: 0,
+        }
+    }
+
+    /// `CodedOutputStream` which writes directly to bytes.
+    ///
+    /// Attempt to write more than bytes capacity results in error.
+    pub fn bytes(bytes: &'a mut [u8]) -> CodedOutputStream<'a> {
+        // SAFETY: it is safe to cast from &mut [u8] to &mut [MaybeUninit<u8>].
+        let buffer =
+            ptr::slice_from_raw_parts_mut(bytes.as_mut_ptr() as *mut MaybeUninit<u8>, bytes.len());
+        let buffer = OutputBuffer::new(buffer);
+        CodedOutputStream {
+            target: OutputTarget::Bytes,
+            buffer,
+            pos_of_buffer_start: 0,
+        }
+    }
+
+    /// `CodedOutputStream` which writes directly to `Vec<u8>`.
+    pub fn vec(vec: &'a mut Vec<u8>) -> CodedOutputStream<'a> {
+        let buffer = OutputBuffer::new(vec.spare_capacity_mut());
+        CodedOutputStream {
+            target: OutputTarget::Vec(vec),
+            buffer,
+            pos_of_buffer_start: 0,
+        }
+    }
+
+    pub(crate) fn reserve_additional(
+        &mut self,
+        additional: u32,
+        message: &str,
+    ) -> crate::Result<()> {
+        if additional as usize <= self.buffer.unfilled_len() {
+            return Ok(());
+        }
+        match &mut self.target {
+            OutputTarget::Write(..) => Ok(()),
+            OutputTarget::Vec(v) => {
+                let reserve = (additional as usize)
+                    .checked_add(self.buffer.pos_within_buf())
+                    .unwrap();
+                v.reserve(reserve);
+                // `pos_within_buf` remains unchanged.
+                self.buffer.replace_buffer_keep_pos(v.spare_capacity_mut());
+                Ok(())
+            }
+            OutputTarget::Bytes => {
+                Err(ProtobufError::BufferHasNotEnoughCapacity(message.to_owned()).into())
+            }
+        }
+    }
+
+    pub(crate) fn reserve_additional_for_length_delimited(
+        &mut self,
+        size: u32,
+        message: &str,
+    ) -> crate::Result<()> {
+        debug_assert!(
+            size <= MAX_MESSAGE_SIZE as u32,
+            "Caller of this function is responsible to guarantee \
+            that message size does not exceed; size: {}, MAX_MESSAGE_SIZE: {}",
+            size,
+            MAX_MESSAGE_SIZE,
+        );
+        let reserve = size + encoded_varint64_len(size as u64) as u32;
+        self.reserve_additional(reserve, message)
+    }
+
+    /// Total number of bytes written to this stream.
+    ///
+    /// This number may be larger than the actual number of bytes written to the underlying stream,
+    /// if the buffer was not flushed.
+    ///
+    /// The number may be inaccurate if there was an error during the write.
+    pub fn total_bytes_written(&self) -> u64 {
+        self.pos_of_buffer_start + self.buffer.pos_within_buf() as u64
+    }
+
+    /// Check if EOF is reached.
+    ///
+    /// # Panics
+    ///
+    /// If underlying write has no EOF
+    pub fn check_eof(&self) {
+        match self.target {
+            OutputTarget::Bytes => {
+                assert_eq!(
+                    self.buffer.buffer().len() as u64,
+                    self.buffer.pos_within_buf() as u64
+                );
+            }
+            OutputTarget::Write(..) | OutputTarget::Vec(..) => {
+                panic!("must not be called with Writer or Vec");
+            }
+        }
+    }
+
+    fn refresh_buffer(&mut self) -> crate::Result<()> {
+        match self.target {
+            OutputTarget::Write(ref mut write, _) => {
+                write.write_all(self.buffer.filled())?;
+                self.pos_of_buffer_start += self.buffer.pos_within_buf() as u64;
+                self.buffer.rewind();
+            }
+            OutputTarget::Vec(ref mut vec) => unsafe {
+                let vec_len = vec.len();
+                assert!(vec_len + self.buffer.pos_within_buf() <= vec.capacity());
+                vec.set_len(vec_len + self.buffer.pos_within_buf());
+                vec.reserve(1);
+                self.pos_of_buffer_start += self.buffer.pos_within_buf() as u64;
+                self.buffer = OutputBuffer::new(vec.spare_capacity_mut());
+            },
+            OutputTarget::Bytes => {
+                return Err(ProtobufError::IoError(io::Error::new(
+                    io::ErrorKind::Other,
+                    "given slice is too small to serialize the message",
+                ))
+                .into());
+            }
+        }
+        Ok(())
+    }
+
+    /// Flush to buffer to the underlying buffer.
+    /// Note that `CodedOutputStream` does `flush` in the destructor,
+    /// however, if `flush` in destructor fails, then destructor panics
+    /// and program terminates. So it's advisable to explicitly call flush
+    /// before destructor.
+    pub fn flush(&mut self) -> crate::Result<()> {
+        match &mut self.target {
+            OutputTarget::Bytes => Ok(()),
+            OutputTarget::Vec(vec) => {
+                let vec_len = vec.len();
+                assert!(vec_len + self.buffer.pos_within_buf() <= vec.capacity());
+                unsafe {
+                    vec.set_len(vec_len + self.buffer.pos_within_buf());
+                }
+                self.pos_of_buffer_start += self.buffer.pos_within_buf() as u64;
+                self.buffer = OutputBuffer::new(vec.spare_capacity_mut());
+                Ok(())
+            }
+            OutputTarget::Write(..) => self.refresh_buffer(),
+        }
+    }
+
+    /// Write a byte
+    pub fn write_raw_byte(&mut self, byte: u8) -> crate::Result<()> {
+        if self.buffer.unfilled_len() == 0 {
+            self.refresh_buffer()?;
+        }
+        unsafe { self.buffer.write_byte(byte) };
+        Ok(())
+    }
+
+    /// Write bytes
+    pub fn write_raw_bytes(&mut self, bytes: &[u8]) -> crate::Result<()> {
+        if bytes.len() <= self.buffer.unfilled_len() {
+            // SAFETY: we've just checked that there's enough space in the buffer.
+            unsafe { self.buffer.write_bytes(bytes) };
+            return Ok(());
+        }
+
+        self.refresh_buffer()?;
+
+        assert!(self.buffer.pos_within_buf() == 0);
+
+        if bytes.len() <= self.buffer.unfilled_len() {
+            // SAFETY: we've just checked that there's enough space in the buffer.
+            unsafe { self.buffer.write_bytes(bytes) };
+            return Ok(());
+        }
+
+        match self.target {
+            OutputTarget::Bytes => {
+                unreachable!();
+            }
+            OutputTarget::Write(ref mut write, _) => {
+                write.write_all(bytes)?;
+            }
+            OutputTarget::Vec(ref mut vec) => {
+                assert!(self.buffer.pos_within_buf() == 0);
+                vec.extend(bytes);
+                self.buffer = OutputBuffer::new(vec.spare_capacity_mut());
+                self.pos_of_buffer_start += bytes.len() as u64;
+            }
+        }
+        Ok(())
+    }
+
+    /// Write a tag
+    pub fn write_tag(&mut self, field_number: u32, wire_type: WireType) -> crate::Result<()> {
+        self.write_raw_varint32(wire_format::Tag::make(field_number, wire_type).value())
+    }
+
+    /// Write varint
+    pub fn write_raw_varint32(&mut self, value: u32) -> crate::Result<()> {
+        if self.buffer.unfilled_len() >= 5 {
+            // fast path
+            unsafe {
+                let len = encode_varint32(value, self.buffer.unfilled());
+                self.buffer.advance(len);
+            };
+            Ok(())
+        } else {
+            // slow path
+            let buf = &mut [0u8; 5];
+            let len = encode_varint32(value, unsafe {
+                slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
+            });
+            self.write_raw_bytes(&buf[..len])
+        }
+    }
+
+    /// Write varint
+    pub fn write_raw_varint64(&mut self, value: u64) -> crate::Result<()> {
+        if self.buffer.unfilled_len() >= MAX_VARINT_ENCODED_LEN {
+            // fast path
+            unsafe {
+                let len = encode_varint64(value, self.buffer.unfilled());
+                self.buffer.advance(len);
+            };
+            Ok(())
+        } else {
+            // slow path
+            let buf = &mut [0u8; MAX_VARINT_ENCODED_LEN];
+            let len = encode_varint64(value, unsafe {
+                slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
+            });
+            self.write_raw_bytes(&buf[..len])
+        }
+    }
+
+    /// Write 32-bit integer little endian
+    pub fn write_raw_little_endian32(&mut self, value: u32) -> crate::Result<()> {
+        self.write_raw_bytes(&value.to_le_bytes())
+    }
+
+    /// Write 64-bit integer little endian
+    pub fn write_raw_little_endian64(&mut self, value: u64) -> crate::Result<()> {
+        self.write_raw_bytes(&value.to_le_bytes())
+    }
+
+    /// Write `float`
+    pub fn write_float_no_tag(&mut self, value: f32) -> crate::Result<()> {
+        self.write_raw_little_endian32(value.to_bits())
+    }
+
+    /// Write `double`
+    pub fn write_double_no_tag(&mut self, value: f64) -> crate::Result<()> {
+        self.write_raw_little_endian64(value.to_bits())
+    }
+
+    /// Write `float` field
+    pub fn write_float(&mut self, field_number: u32, value: f32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Fixed32)?;
+        self.write_float_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `double` field
+    pub fn write_double(&mut self, field_number: u32, value: f64) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Fixed64)?;
+        self.write_double_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write varint
+    pub fn write_uint64_no_tag(&mut self, value: u64) -> crate::Result<()> {
+        self.write_raw_varint64(value)
+    }
+
+    /// Write varint
+    pub fn write_uint32_no_tag(&mut self, value: u32) -> crate::Result<()> {
+        self.write_raw_varint32(value)
+    }
+
+    /// Write varint
+    pub fn write_int64_no_tag(&mut self, value: i64) -> crate::Result<()> {
+        self.write_raw_varint64(value as u64)
+    }
+
+    /// Write varint
+    pub fn write_int32_no_tag(&mut self, value: i32) -> crate::Result<()> {
+        self.write_raw_varint64(value as u64)
+    }
+
+    /// Write zigzag varint
+    pub fn write_sint64_no_tag(&mut self, value: i64) -> crate::Result<()> {
+        self.write_uint64_no_tag(encode_zig_zag_64(value))
+    }
+
+    /// Write zigzag varint
+    pub fn write_sint32_no_tag(&mut self, value: i32) -> crate::Result<()> {
+        self.write_uint32_no_tag(encode_zig_zag_32(value))
+    }
+
+    /// Write `fixed64`
+    pub fn write_fixed64_no_tag(&mut self, value: u64) -> crate::Result<()> {
+        self.write_raw_little_endian64(value)
+    }
+
+    /// Write `fixed32`
+    pub fn write_fixed32_no_tag(&mut self, value: u32) -> crate::Result<()> {
+        self.write_raw_little_endian32(value)
+    }
+
+    /// Write `sfixed64`
+    pub fn write_sfixed64_no_tag(&mut self, value: i64) -> crate::Result<()> {
+        self.write_raw_little_endian64(value as u64)
+    }
+
+    /// Write `sfixed32`
+    pub fn write_sfixed32_no_tag(&mut self, value: i32) -> crate::Result<()> {
+        self.write_raw_little_endian32(value as u32)
+    }
+
+    /// Write `bool`
+    pub fn write_bool_no_tag(&mut self, value: bool) -> crate::Result<()> {
+        self.write_raw_varint32(if value { 1 } else { 0 })
+    }
+
+    /// Write `enum`
+    pub fn write_enum_no_tag(&mut self, value: i32) -> crate::Result<()> {
+        self.write_int32_no_tag(value)
+    }
+
+    /// Write `enum`
+    pub fn write_enum_obj_no_tag<E>(&mut self, value: E) -> crate::Result<()>
+    where
+        E: Enum,
+    {
+        self.write_enum_no_tag(value.value())
+    }
+
+    /// Write `enum`
+    pub fn write_enum_or_unknown_no_tag<E>(&mut self, value: EnumOrUnknown<E>) -> crate::Result<()>
+    where
+        E: Enum,
+    {
+        self.write_enum_no_tag(value.value())
+    }
+
+    /// Write unknown value
+    pub fn write_unknown_no_tag(&mut self, unknown: UnknownValueRef) -> crate::Result<()> {
+        match unknown {
+            UnknownValueRef::Fixed64(fixed64) => self.write_raw_little_endian64(fixed64),
+            UnknownValueRef::Fixed32(fixed32) => self.write_raw_little_endian32(fixed32),
+            UnknownValueRef::Varint(varint) => self.write_raw_varint64(varint),
+            UnknownValueRef::LengthDelimited(bytes) => self.write_bytes_no_tag(bytes),
+        }
+    }
+
+    /// Write `uint64` field
+    pub fn write_uint64(&mut self, field_number: u32, value: u64) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_uint64_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `uint32` field
+    pub fn write_uint32(&mut self, field_number: u32, value: u32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_uint32_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `int64` field
+    pub fn write_int64(&mut self, field_number: u32, value: i64) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_int64_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `int32` field
+    pub fn write_int32(&mut self, field_number: u32, value: i32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_int32_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `sint64` field
+    pub fn write_sint64(&mut self, field_number: u32, value: i64) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_sint64_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `sint32` field
+    pub fn write_sint32(&mut self, field_number: u32, value: i32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_sint32_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `fixed64` field
+    pub fn write_fixed64(&mut self, field_number: u32, value: u64) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Fixed64)?;
+        self.write_fixed64_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `fixed32` field
+    pub fn write_fixed32(&mut self, field_number: u32, value: u32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Fixed32)?;
+        self.write_fixed32_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `sfixed64` field
+    pub fn write_sfixed64(&mut self, field_number: u32, value: i64) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Fixed64)?;
+        self.write_sfixed64_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `sfixed32` field
+    pub fn write_sfixed32(&mut self, field_number: u32, value: i32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Fixed32)?;
+        self.write_sfixed32_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `bool` field
+    pub fn write_bool(&mut self, field_number: u32, value: bool) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_bool_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `enum` field
+    pub fn write_enum(&mut self, field_number: u32, value: i32) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::Varint)?;
+        self.write_enum_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write `enum` field
+    pub fn write_enum_obj<E>(&mut self, field_number: u32, value: E) -> crate::Result<()>
+    where
+        E: Enum,
+    {
+        self.write_enum(field_number, value.value())
+    }
+
+    /// Write `enum` field
+    pub fn write_enum_or_unknown<E>(
+        &mut self,
+        field_number: u32,
+        value: EnumOrUnknown<E>,
+    ) -> crate::Result<()>
+    where
+        E: Enum,
+    {
+        self.write_enum(field_number, value.value())
+    }
+
+    /// Write unknown field
+    pub fn write_unknown(
+        &mut self,
+        field_number: u32,
+        value: UnknownValueRef,
+    ) -> crate::Result<()> {
+        self.write_tag(field_number, value.wire_type())?;
+        self.write_unknown_no_tag(value)?;
+        Ok(())
+    }
+
+    /// Write unknown fields
+    pub fn write_unknown_fields(&mut self, fields: &UnknownFields) -> crate::Result<()> {
+        for (number, value) in fields {
+            self.write_unknown(number, value)?;
+        }
+        Ok(())
+    }
+
+    /// Write unknown fields sorting them by name
+    // TODO: make unknown fields deterministic and remove this.
+    pub(crate) fn write_unknown_fields_sorted(
+        &mut self,
+        fields: &UnknownFields,
+    ) -> crate::Result<()> {
+        let mut fields: Vec<_> = fields.iter().collect();
+        fields.sort_by_key(|(n, _)| *n);
+        for (number, value) in fields {
+            self.write_unknown(number, value)?;
+        }
+        Ok(())
+    }
+
+    /// Write bytes
+    pub fn write_bytes_no_tag(&mut self, bytes: &[u8]) -> crate::Result<()> {
+        self.write_raw_varint32(bytes.len() as u32)?;
+        self.write_raw_bytes(bytes)?;
+        Ok(())
+    }
+
+    /// Write string
+    pub fn write_string_no_tag(&mut self, s: &str) -> crate::Result<()> {
+        self.write_bytes_no_tag(s.as_bytes())
+    }
+
+    /// Write message
+    pub fn write_message_no_tag<M: Message>(&mut self, msg: &M) -> crate::Result<()> {
+        msg.write_length_delimited_to(self)
+    }
+
+    /// Write dynamic message
+    pub fn write_message_no_tag_dyn(&mut self, msg: &dyn MessageDyn) -> crate::Result<()> {
+        let size = msg.compute_size_dyn();
+        let size = check_message_size(size)?;
+        self.write_raw_varint32(size)?;
+        msg.write_to_dyn(self)?;
+        Ok(())
+    }
+
+    /// Write `bytes` field
+    pub fn write_bytes(&mut self, field_number: u32, bytes: &[u8]) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        self.write_bytes_no_tag(bytes)?;
+        Ok(())
+    }
+
+    /// Write `string` field
+    pub fn write_string(&mut self, field_number: u32, s: &str) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        self.write_string_no_tag(s)?;
+        Ok(())
+    }
+
+    /// Write repeated packed float values.
+    pub fn write_repeated_packed_float_no_tag(&mut self, values: &[f32]) -> crate::Result<()> {
+        if LITTLE_ENDIAN {
+            // SAFETY: it is safe to transmute floats to bytes.
+            let bytes =
+                unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 4) };
+            self.write_raw_bytes(bytes)
+        } else {
+            for v in values {
+                self.write_float_no_tag(*v)?;
+            }
+            Ok(())
+        }
+    }
+
+    /// Write field header and data for repeated packed float.
+    pub fn write_repeated_packed_float(
+        &mut self,
+        field_number: u32,
+        values: &[f32],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_float_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed double values.
+    pub fn write_repeated_packed_double_no_tag(&mut self, values: &[f64]) -> crate::Result<()> {
+        if LITTLE_ENDIAN {
+            // SAFETY: it is safe to transmute doubles to bytes.
+            let bytes =
+                unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 8) };
+            self.write_raw_bytes(bytes)
+        } else {
+            for v in values {
+                self.write_double_no_tag(*v)?;
+            }
+            Ok(())
+        }
+    }
+
+    /// Write field header and data for repeated packed double.
+    pub fn write_repeated_packed_double(
+        &mut self,
+        field_number: u32,
+        values: &[f64],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_double_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed fixed32 values.
+    pub fn write_repeated_packed_fixed32_no_tag(&mut self, values: &[u32]) -> crate::Result<()> {
+        if LITTLE_ENDIAN {
+            // SAFETY: it is safe to transmute integer to bytes.
+            let bytes =
+                unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 4) };
+            self.write_raw_bytes(bytes)?;
+        } else {
+            for v in values {
+                self.write_fixed32_no_tag(*v)?;
+            }
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed fixed32.
+    pub fn write_repeated_packed_fixed32(
+        &mut self,
+        field_number: u32,
+        values: &[u32],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_fixed32_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed fixed64 values.
+    pub fn write_repeated_packed_fixed64_no_tag(&mut self, values: &[u64]) -> crate::Result<()> {
+        if LITTLE_ENDIAN {
+            // SAFETY: it is safe to transmute integer to bytes.
+            let bytes =
+                unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 8) };
+            self.write_raw_bytes(bytes)?;
+        } else {
+            for v in values {
+                self.write_fixed64_no_tag(*v)?;
+            }
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed fixed64.
+    pub fn write_repeated_packed_fixed64(
+        &mut self,
+        field_number: u32,
+        values: &[u64],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_fixed64_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed sfixed32 values.
+    pub fn write_repeated_packed_sfixed32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> {
+        if LITTLE_ENDIAN {
+            // SAFETY: it is safe to transmute integer to bytes.
+            let bytes =
+                unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 4) };
+            self.write_raw_bytes(bytes)?;
+        } else {
+            for v in values {
+                self.write_sfixed32_no_tag(*v)?;
+            }
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed sfixed32.
+    pub fn write_repeated_packed_sfixed32(
+        &mut self,
+        field_number: u32,
+        values: &[i32],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_sfixed32_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed sfixed64 values.
+    pub fn write_repeated_packed_sfixed64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> {
+        if LITTLE_ENDIAN {
+            // SAFETY: it is safe to transmute integer to bytes.
+            let bytes =
+                unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 8) };
+            self.write_raw_bytes(bytes)?;
+        } else {
+            for v in values {
+                self.write_sfixed64_no_tag(*v)?;
+            }
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed sfixed64.
+    pub fn write_repeated_packed_sfixed64(
+        &mut self,
+        field_number: u32,
+        values: &[i64],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_sfixed64_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed int32 values.
+    pub fn write_repeated_packed_int32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> {
+        for v in values {
+            self.write_int32_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed int32.
+    pub fn write_repeated_packed_int32(
+        &mut self,
+        field_number: u32,
+        values: &[i32],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_varint_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_int32_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed int64 values.
+    pub fn write_repeated_packed_int64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> {
+        for v in values {
+            self.write_int64_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed int64.
+    pub fn write_repeated_packed_int64(
+        &mut self,
+        field_number: u32,
+        values: &[i64],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_varint_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_int64_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed uint32 values.
+    pub fn write_repeated_packed_uint32_no_tag(&mut self, values: &[u32]) -> crate::Result<()> {
+        for v in values {
+            self.write_uint32_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed uint32.
+    pub fn write_repeated_packed_uint32(
+        &mut self,
+        field_number: u32,
+        values: &[u32],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_varint_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_uint32_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed uint64 values.
+    pub fn write_repeated_packed_uint64_no_tag(&mut self, values: &[u64]) -> crate::Result<()> {
+        for v in values {
+            self.write_uint64_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed uint64.
+    pub fn write_repeated_packed_uint64(
+        &mut self,
+        field_number: u32,
+        values: &[u64],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_varint_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_uint64_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed sint32 values.
+    pub fn write_repeated_packed_sint32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> {
+        for v in values {
+            self.write_sint32_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed sint32.
+    pub fn write_repeated_packed_sint32(
+        &mut self,
+        field_number: u32,
+        values: &[i32],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_varint_zigzag_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_sint32_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed sint64 values.
+    pub fn write_repeated_packed_sint64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> {
+        for v in values {
+            self.write_sint64_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed sint64.
+    pub fn write_repeated_packed_sint64(
+        &mut self,
+        field_number: u32,
+        values: &[i64],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_varint_zigzag_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_sint64_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed bool values.
+    pub fn write_repeated_packed_bool_no_tag(&mut self, values: &[bool]) -> crate::Result<()> {
+        for v in values {
+            self.write_bool_no_tag(*v)?;
+        }
+        Ok(())
+    }
+
+    /// Write field header and data for repeated packed bool.
+    pub fn write_repeated_packed_bool(
+        &mut self,
+        field_number: u32,
+        values: &[bool],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_fixed_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_bool_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write repeated packed enum values.
+    #[inline]
+    pub fn write_repeated_packed_enum_or_unknown_no_tag<E: Enum>(
+        &mut self,
+        values: &[EnumOrUnknown<E>],
+    ) -> crate::Result<()> {
+        self.write_repeated_packed_int32_no_tag(EnumOrUnknown::cast_to_values(values))
+    }
+
+    /// Write field header and data for repeated packed enum.
+    pub fn write_repeated_packed_enum_or_unknown<E: Enum>(
+        &mut self,
+        field_number: u32,
+        values: &[EnumOrUnknown<E>],
+    ) -> crate::Result<()> {
+        if values.is_empty() {
+            return Ok(());
+        }
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        let data_size = vec_packed_enum_or_unknown_data_size(values);
+        self.write_raw_varint32(data_size as u32)?;
+        self.write_repeated_packed_enum_or_unknown_no_tag(values)?;
+        Ok(())
+    }
+
+    /// Write `message` field
+    pub fn write_message<M: MessageFull>(
+        &mut self,
+        field_number: u32,
+        msg: &M,
+    ) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        self.write_message_no_tag(msg)?;
+        Ok(())
+    }
+
+    /// Write dynamic `message` field
+    pub fn write_message_dyn(
+        &mut self,
+        field_number: u32,
+        msg: &dyn MessageDyn,
+    ) -> crate::Result<()> {
+        self.write_tag(field_number, WireType::LengthDelimited)?;
+        self.write_message_no_tag_dyn(msg)?;
+        Ok(())
+    }
+}
+
+impl<'a> Write for CodedOutputStream<'a> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.write_raw_bytes(buf)?;
+        Ok(buf.len())
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        CodedOutputStream::flush(self).map_err(Into::into)
+    }
+}
+
+impl<'a> Drop for CodedOutputStream<'a> {
+    fn drop(&mut self) {
+        // This may panic
+        CodedOutputStream::flush(self).expect("failed to flush");
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::iter;
+
+    use super::*;
+    use crate::hex::decode_hex;
+    use crate::hex::encode_hex;
+
+    fn test_write<F>(expected: &str, mut gen: F)
+    where
+        F: FnMut(&mut CodedOutputStream) -> crate::Result<()>,
+    {
+        let expected_bytes = decode_hex(expected);
+
+        // write to Write
+        {
+            let mut v = Vec::new();
+            {
+                let mut os = CodedOutputStream::new(&mut v as &mut dyn Write);
+                gen(&mut os).unwrap();
+                os.flush().unwrap();
+            }
+            assert_eq!(encode_hex(&expected_bytes), encode_hex(&v));
+        }
+
+        // write to &[u8]
+        {
+            let mut r = Vec::with_capacity(expected_bytes.len());
+            r.resize(expected_bytes.len(), 0);
+            {
+                let mut os = CodedOutputStream::bytes(&mut r);
+                gen(&mut os).unwrap();
+                os.check_eof();
+            }
+            assert_eq!(encode_hex(&expected_bytes), encode_hex(&r));
+        }
+
+        // write to Vec<u8>
+        {
+            let mut r = Vec::new();
+            r.extend(&[11, 22, 33, 44, 55, 66, 77]);
+            {
+                let mut os = CodedOutputStream::vec(&mut r);
+                gen(&mut os).unwrap();
+                os.flush().unwrap();
+            }
+
+            r.drain(..7);
+            assert_eq!(encode_hex(&expected_bytes), encode_hex(&r));
+        }
+    }
+
+    #[test]
+    fn test_output_stream_write_raw_byte() {
+        test_write("a1", |os| os.write_raw_byte(0xa1));
+    }
+
+    #[test]
+    fn test_output_stream_write_tag() {
+        test_write("08", |os| os.write_tag(1, WireType::Varint));
+    }
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Miri is too slow for this test.
+    fn test_output_stream_write_raw_bytes() {
+        test_write("00 ab", |os| os.write_raw_bytes(&[0x00, 0xab]));
+
+        let expected = iter::repeat("01 02 03 04")
+            .take(2048)
+            .collect::<Vec<_>>()
+            .join(" ");
+        test_write(&expected, |os| {
+            for _ in 0..2048 {
+                os.write_raw_bytes(&[0x01, 0x02, 0x03, 0x04])?;
+            }
+
+            Ok(())
+        });
+    }
+
+    #[test]
+    fn test_output_stream_write_raw_varint32() {
+        test_write("96 01", |os| os.write_raw_varint32(150));
+        test_write("ff ff ff ff 0f", |os| os.write_raw_varint32(0xffffffff));
+    }
+
+    #[test]
+    fn test_output_stream_write_raw_varint64() {
+        test_write("96 01", |os| os.write_raw_varint64(150));
+        test_write("ff ff ff ff ff ff ff ff ff 01", |os| {
+            os.write_raw_varint64(0xffffffffffffffff)
+        });
+    }
+
+    #[test]
+    fn test_output_stream_write_int32_no_tag() {
+        test_write("ff ff ff ff ff ff ff ff ff 01", |os| {
+            os.write_int32_no_tag(-1)
+        });
+    }
+
+    #[test]
+    fn test_output_stream_write_int64_no_tag() {
+        test_write("ff ff ff ff ff ff ff ff ff 01", |os| {
+            os.write_int64_no_tag(-1)
+        });
+    }
+
+    #[test]
+    fn test_output_stream_write_raw_little_endian32() {
+        test_write("f1 e2 d3 c4", |os| os.write_raw_little_endian32(0xc4d3e2f1));
+    }
+
+    #[test]
+    fn test_output_stream_write_float_no_tag() {
+        test_write("95 73 13 61", |os| os.write_float_no_tag(17e19));
+    }
+
+    #[test]
+    fn test_output_stream_write_double_no_tag() {
+        test_write("40 d5 ab 68 b3 07 3d 46", |os| {
+            os.write_double_no_tag(23e29)
+        });
+    }
+
+    #[test]
+    fn test_output_stream_write_raw_little_endian64() {
+        test_write("f1 e2 d3 c4 b5 a6 07 f8", |os| {
+            os.write_raw_little_endian64(0xf807a6b5c4d3e2f1)
+        });
+    }
+
+    #[test]
+    fn test_output_stream_io_write() {
+        let expected = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77];
+
+        // write to Write
+        {
+            let mut v = Vec::new();
+            {
+                let mut os = CodedOutputStream::new(&mut v as &mut dyn Write);
+                Write::write(&mut os, &expected).expect("io::Write::write");
+                Write::flush(&mut os).expect("io::Write::flush");
+            }
+            assert_eq!(expected, *v);
+        }
+
+        // write to &[u8]
+        {
+            let mut v = Vec::with_capacity(expected.len());
+            v.resize(expected.len(), 0);
+            {
+                let mut os = CodedOutputStream::bytes(&mut v);
+                Write::write(&mut os, &expected).expect("io::Write::write");
+                Write::flush(&mut os).expect("io::Write::flush");
+                os.check_eof();
+            }
+            assert_eq!(expected, *v);
+        }
+
+        // write to Vec<u8>
+        {
+            let mut v = Vec::new();
+            {
+                let mut os = CodedOutputStream::vec(&mut v);
+                Write::write(&mut os, &expected).expect("io::Write::write");
+                Write::flush(&mut os).expect("io::Write::flush");
+            }
+            assert_eq!(expected, *v);
+        }
+    }
+
+    #[test]
+    fn flush_for_vec_does_not_allocate_more() {
+        let mut v = Vec::with_capacity(10);
+        {
+            let mut os = CodedOutputStream::vec(&mut v);
+            for i in 0..10 {
+                os.write_raw_byte(i as u8).unwrap();
+            }
+            os.flush().unwrap();
+        }
+        assert_eq!(10, v.len());
+        // Previously, this allocated more data in buf.
+        assert_eq!(10, v.capacity());
+    }
+
+    #[test]
+    fn total_bytes_written_to_bytes() {
+        let mut buf = vec![0; 10];
+        let mut stream = CodedOutputStream::bytes(&mut buf);
+        assert_eq!(0, stream.total_bytes_written());
+        stream.write_raw_bytes(&[11, 22]).unwrap();
+        assert_eq!(2, stream.total_bytes_written());
+        stream.write_raw_bytes(&[33, 44, 55]).unwrap();
+        assert_eq!(5, stream.total_bytes_written());
+    }
+
+    #[test]
+    fn total_bytes_written_to_vec() {
+        let mut buf = Vec::new();
+        let mut stream = CodedOutputStream::vec(&mut buf);
+        for i in 0..100 {
+            stream.write_raw_bytes(&[0, 1, 2]).unwrap();
+            assert_eq!((i + 1) * 3, stream.total_bytes_written());
+        }
+    }
+}
diff --git a/src/coded_output_stream/output_target.rs b/src/coded_output_stream/output_target.rs
new file mode 100644
index 0000000..c60c1aa
--- /dev/null
+++ b/src/coded_output_stream/output_target.rs
@@ -0,0 +1,32 @@
+use std::fmt;
+use std::io::Write;
+
+/// Output buffer/writer for `CodedOutputStream`.
+pub(crate) enum OutputTarget<'a> {
+    Write(&'a mut dyn Write, Vec<u8>),
+    Vec(&'a mut Vec<u8>),
+    /// The buffer is passed as `&[u8]` to `CodedOutputStream` constructor
+    /// and immediately converted to `buffer` field of `CodedOutputStream`,
+    /// it is not needed to be stored here.
+    /// Lifetime parameter of `CodedOutputStream` guarantees the buffer is valid
+    /// during the lifetime of `CodedOutputStream`.
+    Bytes,
+}
+
+impl<'a> fmt::Debug for OutputTarget<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            OutputTarget::Write(_w, vec) => f
+                .debug_struct("Write")
+                .field("buf_len", &vec.len())
+                .field("buf_cap", &vec.capacity())
+                .finish_non_exhaustive(),
+            OutputTarget::Vec(vec) => f
+                .debug_struct("Vec")
+                .field("len", &vec.len())
+                .field("cap", &vec.capacity())
+                .finish_non_exhaustive(),
+            OutputTarget::Bytes => f.debug_tuple("Bytes").finish(),
+        }
+    }
+}
diff --git a/src/coded_output_stream/with.rs b/src/coded_output_stream/with.rs
new file mode 100644
index 0000000..b41d71a
--- /dev/null
+++ b/src/coded_output_stream/with.rs
@@ -0,0 +1,33 @@
+use std::io::Write;
+
+use crate::CodedOutputStream;
+
+pub(crate) trait WithCodedOutputStream {
+    fn with_coded_output_stream<T, F>(self, cb: F) -> crate::Result<T>
+    where
+        F: FnOnce(&mut CodedOutputStream) -> crate::Result<T>;
+}
+
+impl<'a> WithCodedOutputStream for &'a mut (dyn Write + 'a) {
+    fn with_coded_output_stream<T, F>(self, cb: F) -> crate::Result<T>
+    where
+        F: FnOnce(&mut CodedOutputStream) -> crate::Result<T>,
+    {
+        let mut os = CodedOutputStream::new(self);
+        let r = cb(&mut os)?;
+        os.flush()?;
+        Ok(r)
+    }
+}
+
+impl<'a> WithCodedOutputStream for &'a mut Vec<u8> {
+    fn with_coded_output_stream<T, F>(mut self, cb: F) -> crate::Result<T>
+    where
+        F: FnOnce(&mut CodedOutputStream) -> crate::Result<T>,
+    {
+        let mut os = CodedOutputStream::vec(&mut self);
+        let r = cb(&mut os)?;
+        os.flush()?;
+        Ok(r)
+    }
+}
diff --git a/src/compiler_plugin.rs b/src/compiler_plugin.rs
deleted file mode 100644
index 122eeb3..0000000
--- a/src/compiler_plugin.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-// TODO: move into separate crate
-#![doc(hidden)]
-
-use std::io::stdin;
-use std::io::stdout;
-use std::str;
-
-use crate::descriptor::FileDescriptorProto;
-use crate::plugin::*;
-use crate::Message;
-
-pub struct GenRequest<'a> {
-    pub file_descriptors: &'a [FileDescriptorProto],
-    pub files_to_generate: &'a [String],
-    pub parameter: &'a str,
-}
-
-pub struct GenResult {
-    pub name: String,
-    pub content: Vec<u8>,
-}
-
-pub fn plugin_main<F>(gen: F)
-where
-    F: Fn(&[FileDescriptorProto], &[String]) -> Vec<GenResult>,
-{
-    plugin_main_2(|r| gen(r.file_descriptors, r.files_to_generate))
-}
-
-pub fn plugin_main_2<F>(gen: F)
-where
-    F: Fn(&GenRequest) -> Vec<GenResult>,
-{
-    let req = CodeGeneratorRequest::parse_from_reader(&mut stdin()).unwrap();
-    let result = gen(&GenRequest {
-        file_descriptors: &req.get_proto_file(),
-        files_to_generate: &req.get_file_to_generate(),
-        parameter: req.get_parameter(),
-    });
-    let mut resp = CodeGeneratorResponse::new();
-    resp.set_file(
-        result
-            .iter()
-            .map(|file| {
-                let mut r = CodeGeneratorResponse_File::new();
-                r.set_name(file.name.to_string());
-                r.set_content(str::from_utf8(file.content.as_ref()).unwrap().to_string());
-                r
-            })
-            .collect(),
-    );
-    resp.write_to_writer(&mut stdout()).unwrap();
-}
diff --git a/src/descriptor.rs b/src/descriptor.rs
index 7ca155d..9179a17 100644
--- a/src/descriptor.rs
+++ b/src/descriptor.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,20 +16,22 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/descriptor.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  The protocol compiler can output a FileDescriptorSet containing the .proto
+///  files it parses.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FileDescriptorSet)
 pub struct FileDescriptorSet {
     // message fields
-    pub file: crate::RepeatedField<FileDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorSet.file)
+    pub file: ::std::vec::Vec<FileDescriptorProto>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FileDescriptorSet.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FileDescriptorSet {
@@ -42,33 +45,25 @@
         ::std::default::Default::default()
     }
 
-    // repeated .google.protobuf.FileDescriptorProto file = 1;
-
-
-    pub fn get_file(&self) -> &[FileDescriptorProto] {
-        &self.file
-    }
-    pub fn clear_file(&mut self) {
-        self.file.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_file(&mut self, v: crate::RepeatedField<FileDescriptorProto>) {
-        self.file = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_file(&mut self) -> &mut crate::RepeatedField<FileDescriptorProto> {
-        &mut self.file
-    }
-
-    // Take field
-    pub fn take_file(&mut self) -> crate::RepeatedField<FileDescriptorProto> {
-        ::std::mem::replace(&mut self.file, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "file",
+            |m: &FileDescriptorSet| { &m.file },
+            |m: &mut FileDescriptorSet| { &mut m.file },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FileDescriptorSet>(
+            "FileDescriptorSet",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for FileDescriptorSet {
+    const NAME: &'static str = "FileDescriptorSet";
+
     fn is_initialized(&self) -> bool {
         for v in &self.file {
             if !v.is_initialized() {
@@ -78,15 +73,14 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.file)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.file.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -95,120 +89,111 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.file {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.file {
-            os.write_tag(1, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(1, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FileDescriptorSet {
         FileDescriptorSet::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<FileDescriptorProto>>(
-                "file",
-                |m: &FileDescriptorSet| { &m.file },
-                |m: &mut FileDescriptorSet| { &mut m.file },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FileDescriptorSet>(
-                "FileDescriptorSet",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.file.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static FileDescriptorSet {
-        static instance: crate::rt::LazyV2<FileDescriptorSet> = crate::rt::LazyV2::INIT;
-        instance.get(FileDescriptorSet::new)
+        static instance: FileDescriptorSet = FileDescriptorSet {
+            file: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for FileDescriptorSet {
-    fn clear(&mut self) {
-        self.file.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for FileDescriptorSet {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FileDescriptorSet").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for FileDescriptorSet {
+impl ::std::fmt::Display for FileDescriptorSet {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FileDescriptorSet {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a complete .proto file.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FileDescriptorProto)
 pub struct FileDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    package: crate::SingularField<::std::string::String>,
-    pub dependency: crate::RepeatedField<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.package)
+    pub package: ::std::option::Option<::std::string::String>,
+    ///  Names of files imported by this file.
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.dependency)
+    pub dependency: ::std::vec::Vec<::std::string::String>,
+    ///  Indexes of the public imported files in the dependency list above.
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.public_dependency)
     pub public_dependency: ::std::vec::Vec<i32>,
+    ///  Indexes of the weak imported files in the dependency list.
+    ///  For Google-internal migration only. Do not use.
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.weak_dependency)
     pub weak_dependency: ::std::vec::Vec<i32>,
-    pub message_type: crate::RepeatedField<DescriptorProto>,
-    pub enum_type: crate::RepeatedField<EnumDescriptorProto>,
-    pub service: crate::RepeatedField<ServiceDescriptorProto>,
-    pub extension: crate::RepeatedField<FieldDescriptorProto>,
-    pub options: crate::SingularPtrField<FileOptions>,
-    pub source_code_info: crate::SingularPtrField<SourceCodeInfo>,
-    syntax: crate::SingularField<::std::string::String>,
+    ///  All top-level definitions in this file.
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.message_type)
+    pub message_type: ::std::vec::Vec<DescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.enum_type)
+    pub enum_type: ::std::vec::Vec<EnumDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.service)
+    pub service: ::std::vec::Vec<ServiceDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.extension)
+    pub extension: ::std::vec::Vec<FieldDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.options)
+    pub options: crate::MessageField<FileOptions>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.source_code_info)
+    pub source_code_info: crate::MessageField<SourceCodeInfo>,
+    ///  The syntax of the proto file.
+    ///  The supported values are "proto2" and "proto3".
+    // @@protoc_insertion_point(field:google.protobuf.FileDescriptorProto.syntax)
+    pub syntax: ::std::option::Option<::std::string::String>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FileDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FileDescriptorProto {
@@ -224,15 +209,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -241,14 +226,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -260,15 +245,15 @@
 
     // optional string package = 2;
 
-
-    pub fn get_package(&self) -> &str {
+    pub fn package(&self) -> &str {
         match self.package.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_package(&mut self) {
-        self.package.clear();
+        self.package = ::std::option::Option::None;
     }
 
     pub fn has_package(&self) -> bool {
@@ -277,14 +262,14 @@
 
     // Param is passed by value, moved
     pub fn set_package(&mut self, v: ::std::string::String) {
-        self.package = crate::SingularField::some(v);
+        self.package = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_package(&mut self) -> &mut ::std::string::String {
         if self.package.is_none() {
-            self.package.set_default();
+            self.package = ::std::option::Option::Some(::std::string::String::new());
         }
         self.package.as_mut().unwrap()
     }
@@ -294,258 +279,17 @@
         self.package.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // repeated string dependency = 3;
-
-
-    pub fn get_dependency(&self) -> &[::std::string::String] {
-        &self.dependency
-    }
-    pub fn clear_dependency(&mut self) {
-        self.dependency.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_dependency(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.dependency = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_dependency(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.dependency
-    }
-
-    // Take field
-    pub fn take_dependency(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.dependency, crate::RepeatedField::new())
-    }
-
-    // repeated int32 public_dependency = 10;
-
-
-    pub fn get_public_dependency(&self) -> &[i32] {
-        &self.public_dependency
-    }
-    pub fn clear_public_dependency(&mut self) {
-        self.public_dependency.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_public_dependency(&mut self, v: ::std::vec::Vec<i32>) {
-        self.public_dependency = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_public_dependency(&mut self) -> &mut ::std::vec::Vec<i32> {
-        &mut self.public_dependency
-    }
-
-    // Take field
-    pub fn take_public_dependency(&mut self) -> ::std::vec::Vec<i32> {
-        ::std::mem::replace(&mut self.public_dependency, ::std::vec::Vec::new())
-    }
-
-    // repeated int32 weak_dependency = 11;
-
-
-    pub fn get_weak_dependency(&self) -> &[i32] {
-        &self.weak_dependency
-    }
-    pub fn clear_weak_dependency(&mut self) {
-        self.weak_dependency.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_weak_dependency(&mut self, v: ::std::vec::Vec<i32>) {
-        self.weak_dependency = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_weak_dependency(&mut self) -> &mut ::std::vec::Vec<i32> {
-        &mut self.weak_dependency
-    }
-
-    // Take field
-    pub fn take_weak_dependency(&mut self) -> ::std::vec::Vec<i32> {
-        ::std::mem::replace(&mut self.weak_dependency, ::std::vec::Vec::new())
-    }
-
-    // repeated .google.protobuf.DescriptorProto message_type = 4;
-
-
-    pub fn get_message_type(&self) -> &[DescriptorProto] {
-        &self.message_type
-    }
-    pub fn clear_message_type(&mut self) {
-        self.message_type.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_message_type(&mut self, v: crate::RepeatedField<DescriptorProto>) {
-        self.message_type = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_message_type(&mut self) -> &mut crate::RepeatedField<DescriptorProto> {
-        &mut self.message_type
-    }
-
-    // Take field
-    pub fn take_message_type(&mut self) -> crate::RepeatedField<DescriptorProto> {
-        ::std::mem::replace(&mut self.message_type, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
-
-
-    pub fn get_enum_type(&self) -> &[EnumDescriptorProto] {
-        &self.enum_type
-    }
-    pub fn clear_enum_type(&mut self) {
-        self.enum_type.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_enum_type(&mut self, v: crate::RepeatedField<EnumDescriptorProto>) {
-        self.enum_type = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_enum_type(&mut self) -> &mut crate::RepeatedField<EnumDescriptorProto> {
-        &mut self.enum_type
-    }
-
-    // Take field
-    pub fn take_enum_type(&mut self) -> crate::RepeatedField<EnumDescriptorProto> {
-        ::std::mem::replace(&mut self.enum_type, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.ServiceDescriptorProto service = 6;
-
-
-    pub fn get_service(&self) -> &[ServiceDescriptorProto] {
-        &self.service
-    }
-    pub fn clear_service(&mut self) {
-        self.service.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_service(&mut self, v: crate::RepeatedField<ServiceDescriptorProto>) {
-        self.service = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_service(&mut self) -> &mut crate::RepeatedField<ServiceDescriptorProto> {
-        &mut self.service
-    }
-
-    // Take field
-    pub fn take_service(&mut self) -> crate::RepeatedField<ServiceDescriptorProto> {
-        ::std::mem::replace(&mut self.service, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.FieldDescriptorProto extension = 7;
-
-
-    pub fn get_extension(&self) -> &[FieldDescriptorProto] {
-        &self.extension
-    }
-    pub fn clear_extension(&mut self) {
-        self.extension.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_extension(&mut self, v: crate::RepeatedField<FieldDescriptorProto>) {
-        self.extension = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_extension(&mut self) -> &mut crate::RepeatedField<FieldDescriptorProto> {
-        &mut self.extension
-    }
-
-    // Take field
-    pub fn take_extension(&mut self) -> crate::RepeatedField<FieldDescriptorProto> {
-        ::std::mem::replace(&mut self.extension, crate::RepeatedField::new())
-    }
-
-    // optional .google.protobuf.FileOptions options = 8;
-
-
-    pub fn get_options(&self) -> &FileOptions {
-        self.options.as_ref().unwrap_or_else(|| <FileOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: FileOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut FileOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> FileOptions {
-        self.options.take().unwrap_or_else(|| FileOptions::new())
-    }
-
-    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
-
-
-    pub fn get_source_code_info(&self) -> &SourceCodeInfo {
-        self.source_code_info.as_ref().unwrap_or_else(|| <SourceCodeInfo as crate::Message>::default_instance())
-    }
-    pub fn clear_source_code_info(&mut self) {
-        self.source_code_info.clear();
-    }
-
-    pub fn has_source_code_info(&self) -> bool {
-        self.source_code_info.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_source_code_info(&mut self, v: SourceCodeInfo) {
-        self.source_code_info = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_source_code_info(&mut self) -> &mut SourceCodeInfo {
-        if self.source_code_info.is_none() {
-            self.source_code_info.set_default();
-        }
-        self.source_code_info.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_source_code_info(&mut self) -> SourceCodeInfo {
-        self.source_code_info.take().unwrap_or_else(|| SourceCodeInfo::new())
-    }
-
     // optional string syntax = 12;
 
-
-    pub fn get_syntax(&self) -> &str {
+    pub fn syntax(&self) -> &str {
         match self.syntax.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_syntax(&mut self) {
-        self.syntax.clear();
+        self.syntax = ::std::option::Option::None;
     }
 
     pub fn has_syntax(&self) -> bool {
@@ -554,14 +298,14 @@
 
     // Param is passed by value, moved
     pub fn set_syntax(&mut self, v: ::std::string::String) {
-        self.syntax = crate::SingularField::some(v);
+        self.syntax = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_syntax(&mut self) -> &mut ::std::string::String {
         if self.syntax.is_none() {
-            self.syntax.set_default();
+            self.syntax = ::std::option::Option::Some(::std::string::String::new());
         }
         self.syntax.as_mut().unwrap()
     }
@@ -570,9 +314,81 @@
     pub fn take_syntax(&mut self) -> ::std::string::String {
         self.syntax.take().unwrap_or_else(|| ::std::string::String::new())
     }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(12);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &FileDescriptorProto| { &m.name },
+            |m: &mut FileDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "package",
+            |m: &FileDescriptorProto| { &m.package },
+            |m: &mut FileDescriptorProto| { &mut m.package },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "dependency",
+            |m: &FileDescriptorProto| { &m.dependency },
+            |m: &mut FileDescriptorProto| { &mut m.dependency },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "public_dependency",
+            |m: &FileDescriptorProto| { &m.public_dependency },
+            |m: &mut FileDescriptorProto| { &mut m.public_dependency },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "weak_dependency",
+            |m: &FileDescriptorProto| { &m.weak_dependency },
+            |m: &mut FileDescriptorProto| { &mut m.weak_dependency },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "message_type",
+            |m: &FileDescriptorProto| { &m.message_type },
+            |m: &mut FileDescriptorProto| { &mut m.message_type },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "enum_type",
+            |m: &FileDescriptorProto| { &m.enum_type },
+            |m: &mut FileDescriptorProto| { &mut m.enum_type },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "service",
+            |m: &FileDescriptorProto| { &m.service },
+            |m: &mut FileDescriptorProto| { &mut m.service },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "extension",
+            |m: &FileDescriptorProto| { &m.extension },
+            |m: &mut FileDescriptorProto| { &mut m.extension },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, FileOptions>(
+            "options",
+            |m: &FileDescriptorProto| { &m.options },
+            |m: &mut FileDescriptorProto| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, SourceCodeInfo>(
+            "source_code_info",
+            |m: &FileDescriptorProto| { &m.source_code_info },
+            |m: &mut FileDescriptorProto| { &mut m.source_code_info },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "syntax",
+            |m: &FileDescriptorProto| { &m.syntax },
+            |m: &mut FileDescriptorProto| { &mut m.syntax },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FileDescriptorProto>(
+            "FileDescriptorProto",
+            fields,
+            oneofs,
+        )
+    }
 }
 
 impl crate::Message for FileDescriptorProto {
+    const NAME: &'static str = "FileDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.message_type {
             if !v.is_initialized() {
@@ -607,48 +423,53 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.package)?;
-                },
-                3 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.dependency)?;
-                },
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
                 10 => {
-                    crate::rt::read_repeated_int32_into(wire_type, is, &mut self.public_dependency)?;
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                11 => {
-                    crate::rt::read_repeated_int32_into(wire_type, is, &mut self.weak_dependency)?;
+                18 => {
+                    self.package = ::std::option::Option::Some(is.read_string()?);
                 },
-                4 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.message_type)?;
+                26 => {
+                    self.dependency.push(is.read_string()?);
                 },
-                5 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.enum_type)?;
+                82 => {
+                    is.read_repeated_packed_int32_into(&mut self.public_dependency)?;
                 },
-                6 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.service)?;
+                80 => {
+                    self.public_dependency.push(is.read_int32()?);
                 },
-                7 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.extension)?;
+                90 => {
+                    is.read_repeated_packed_int32_into(&mut self.weak_dependency)?;
                 },
-                8 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                88 => {
+                    self.weak_dependency.push(is.read_int32()?);
                 },
-                9 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.source_code_info)?;
+                34 => {
+                    self.message_type.push(is.read_message()?);
                 },
-                12 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.syntax)?;
+                42 => {
+                    self.enum_type.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                50 => {
+                    self.service.push(is.read_message()?);
+                },
+                58 => {
+                    self.extension.push(is.read_message()?);
+                },
+                66 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
+                },
+                74 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.source_code_info)?;
+                },
+                98 => {
+                    self.syntax = ::std::option::Option::Some(is.read_string()?);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -657,61 +478,61 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
-        if let Some(ref v) = self.package.as_ref() {
+        if let Some(v) = self.package.as_ref() {
             my_size += crate::rt::string_size(2, &v);
         }
         for value in &self.dependency {
             my_size += crate::rt::string_size(3, &value);
         };
         for value in &self.public_dependency {
-            my_size += crate::rt::value_size(10, *value, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(10, *value);
         };
         for value in &self.weak_dependency {
-            my_size += crate::rt::value_size(11, *value, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(11, *value);
         };
         for value in &self.message_type {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.enum_type {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.service {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.extension {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
-        if let Some(ref v) = self.source_code_info.as_ref() {
+        if let Some(v) = self.source_code_info.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
-        if let Some(ref v) = self.syntax.as_ref() {
+        if let Some(v) = self.syntax.as_ref() {
             my_size += crate::rt::string_size(12, &v);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
-        if let Some(ref v) = self.package.as_ref() {
-            os.write_string(2, &v)?;
+        if let Some(v) = self.package.as_ref() {
+            os.write_string(2, v)?;
         }
         for v in &self.dependency {
             os.write_string(3, &v)?;
@@ -723,154 +544,45 @@
             os.write_int32(11, *v)?;
         };
         for v in &self.message_type {
-            os.write_tag(4, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(4, v, os)?;
         };
         for v in &self.enum_type {
-            os.write_tag(5, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(5, v, os)?;
         };
         for v in &self.service {
-            os.write_tag(6, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(6, v, os)?;
         };
         for v in &self.extension {
-            os.write_tag(7, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(7, v, os)?;
         };
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(8, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(8, v, os)?;
         }
-        if let Some(ref v) = self.source_code_info.as_ref() {
-            os.write_tag(9, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.source_code_info.as_ref() {
+            crate::rt::write_message_field_with_cached_size(9, v, os)?;
         }
-        if let Some(ref v) = self.syntax.as_ref() {
-            os.write_string(12, &v)?;
+        if let Some(v) = self.syntax.as_ref() {
+            os.write_string(12, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FileDescriptorProto {
         FileDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &FileDescriptorProto| { &m.name },
-                |m: &mut FileDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "package",
-                |m: &FileDescriptorProto| { &m.package },
-                |m: &mut FileDescriptorProto| { &mut m.package },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "dependency",
-                |m: &FileDescriptorProto| { &m.dependency },
-                |m: &mut FileDescriptorProto| { &mut m.dependency },
-            ));
-            fields.push(crate::reflect::accessor::make_vec_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "public_dependency",
-                |m: &FileDescriptorProto| { &m.public_dependency },
-                |m: &mut FileDescriptorProto| { &mut m.public_dependency },
-            ));
-            fields.push(crate::reflect::accessor::make_vec_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "weak_dependency",
-                |m: &FileDescriptorProto| { &m.weak_dependency },
-                |m: &mut FileDescriptorProto| { &mut m.weak_dependency },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<DescriptorProto>>(
-                "message_type",
-                |m: &FileDescriptorProto| { &m.message_type },
-                |m: &mut FileDescriptorProto| { &mut m.message_type },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumDescriptorProto>>(
-                "enum_type",
-                |m: &FileDescriptorProto| { &m.enum_type },
-                |m: &mut FileDescriptorProto| { &mut m.enum_type },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<ServiceDescriptorProto>>(
-                "service",
-                |m: &FileDescriptorProto| { &m.service },
-                |m: &mut FileDescriptorProto| { &mut m.service },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<FieldDescriptorProto>>(
-                "extension",
-                |m: &FileDescriptorProto| { &m.extension },
-                |m: &mut FileDescriptorProto| { &mut m.extension },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<FileOptions>>(
-                "options",
-                |m: &FileDescriptorProto| { &m.options },
-                |m: &mut FileDescriptorProto| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<SourceCodeInfo>>(
-                "source_code_info",
-                |m: &FileDescriptorProto| { &m.source_code_info },
-                |m: &mut FileDescriptorProto| { &mut m.source_code_info },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "syntax",
-                |m: &FileDescriptorProto| { &m.syntax },
-                |m: &mut FileDescriptorProto| { &mut m.syntax },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FileDescriptorProto>(
-                "FileDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static FileDescriptorProto {
-        static instance: crate::rt::LazyV2<FileDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(FileDescriptorProto::new)
-    }
-}
-
-impl crate::Clear for FileDescriptorProto {
     fn clear(&mut self) {
-        self.name.clear();
-        self.package.clear();
+        self.name = ::std::option::Option::None;
+        self.package = ::std::option::Option::None;
         self.dependency.clear();
         self.public_dependency.clear();
         self.weak_dependency.clear();
@@ -880,42 +592,77 @@
         self.extension.clear();
         self.options.clear();
         self.source_code_info.clear();
-        self.syntax.clear();
-        self.unknown_fields.clear();
+        self.syntax = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static FileDescriptorProto {
+        static instance: FileDescriptorProto = FileDescriptorProto {
+            name: ::std::option::Option::None,
+            package: ::std::option::Option::None,
+            dependency: ::std::vec::Vec::new(),
+            public_dependency: ::std::vec::Vec::new(),
+            weak_dependency: ::std::vec::Vec::new(),
+            message_type: ::std::vec::Vec::new(),
+            enum_type: ::std::vec::Vec::new(),
+            service: ::std::vec::Vec::new(),
+            extension: ::std::vec::Vec::new(),
+            options: crate::MessageField::none(),
+            source_code_info: crate::MessageField::none(),
+            syntax: ::std::option::Option::None,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for FileDescriptorProto {
+impl crate::MessageFull for FileDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FileDescriptorProto").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for FileDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FileDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a message type.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.DescriptorProto)
 pub struct DescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    pub field: crate::RepeatedField<FieldDescriptorProto>,
-    pub extension: crate::RepeatedField<FieldDescriptorProto>,
-    pub nested_type: crate::RepeatedField<DescriptorProto>,
-    pub enum_type: crate::RepeatedField<EnumDescriptorProto>,
-    pub extension_range: crate::RepeatedField<DescriptorProto_ExtensionRange>,
-    pub oneof_decl: crate::RepeatedField<OneofDescriptorProto>,
-    pub options: crate::SingularPtrField<MessageOptions>,
-    pub reserved_range: crate::RepeatedField<DescriptorProto_ReservedRange>,
-    pub reserved_name: crate::RepeatedField<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.field)
+    pub field: ::std::vec::Vec<FieldDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.extension)
+    pub extension: ::std::vec::Vec<FieldDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.nested_type)
+    pub nested_type: ::std::vec::Vec<DescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.enum_type)
+    pub enum_type: ::std::vec::Vec<EnumDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.extension_range)
+    pub extension_range: ::std::vec::Vec<descriptor_proto::ExtensionRange>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.oneof_decl)
+    pub oneof_decl: ::std::vec::Vec<OneofDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.options)
+    pub options: crate::MessageField<MessageOptions>,
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.reserved_range)
+    pub reserved_range: ::std::vec::Vec<descriptor_proto::ReservedRange>,
+    ///  Reserved field names, which may not be used by fields in the same message.
+    ///  A given name may only be reserved once.
+    // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.reserved_name)
+    pub reserved_name: ::std::vec::Vec<::std::string::String>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.DescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a DescriptorProto {
@@ -931,15 +678,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -948,14 +695,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -965,241 +712,70 @@
         self.name.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // repeated .google.protobuf.FieldDescriptorProto field = 2;
-
-
-    pub fn get_field(&self) -> &[FieldDescriptorProto] {
-        &self.field
-    }
-    pub fn clear_field(&mut self) {
-        self.field.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field(&mut self, v: crate::RepeatedField<FieldDescriptorProto>) {
-        self.field = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_field(&mut self) -> &mut crate::RepeatedField<FieldDescriptorProto> {
-        &mut self.field
-    }
-
-    // Take field
-    pub fn take_field(&mut self) -> crate::RepeatedField<FieldDescriptorProto> {
-        ::std::mem::replace(&mut self.field, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.FieldDescriptorProto extension = 6;
-
-
-    pub fn get_extension(&self) -> &[FieldDescriptorProto] {
-        &self.extension
-    }
-    pub fn clear_extension(&mut self) {
-        self.extension.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_extension(&mut self, v: crate::RepeatedField<FieldDescriptorProto>) {
-        self.extension = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_extension(&mut self) -> &mut crate::RepeatedField<FieldDescriptorProto> {
-        &mut self.extension
-    }
-
-    // Take field
-    pub fn take_extension(&mut self) -> crate::RepeatedField<FieldDescriptorProto> {
-        ::std::mem::replace(&mut self.extension, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.DescriptorProto nested_type = 3;
-
-
-    pub fn get_nested_type(&self) -> &[DescriptorProto] {
-        &self.nested_type
-    }
-    pub fn clear_nested_type(&mut self) {
-        self.nested_type.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_nested_type(&mut self, v: crate::RepeatedField<DescriptorProto>) {
-        self.nested_type = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_nested_type(&mut self) -> &mut crate::RepeatedField<DescriptorProto> {
-        &mut self.nested_type
-    }
-
-    // Take field
-    pub fn take_nested_type(&mut self) -> crate::RepeatedField<DescriptorProto> {
-        ::std::mem::replace(&mut self.nested_type, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
-
-
-    pub fn get_enum_type(&self) -> &[EnumDescriptorProto] {
-        &self.enum_type
-    }
-    pub fn clear_enum_type(&mut self) {
-        self.enum_type.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_enum_type(&mut self, v: crate::RepeatedField<EnumDescriptorProto>) {
-        self.enum_type = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_enum_type(&mut self) -> &mut crate::RepeatedField<EnumDescriptorProto> {
-        &mut self.enum_type
-    }
-
-    // Take field
-    pub fn take_enum_type(&mut self) -> crate::RepeatedField<EnumDescriptorProto> {
-        ::std::mem::replace(&mut self.enum_type, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
-
-
-    pub fn get_extension_range(&self) -> &[DescriptorProto_ExtensionRange] {
-        &self.extension_range
-    }
-    pub fn clear_extension_range(&mut self) {
-        self.extension_range.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_extension_range(&mut self, v: crate::RepeatedField<DescriptorProto_ExtensionRange>) {
-        self.extension_range = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_extension_range(&mut self) -> &mut crate::RepeatedField<DescriptorProto_ExtensionRange> {
-        &mut self.extension_range
-    }
-
-    // Take field
-    pub fn take_extension_range(&mut self) -> crate::RepeatedField<DescriptorProto_ExtensionRange> {
-        ::std::mem::replace(&mut self.extension_range, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
-
-
-    pub fn get_oneof_decl(&self) -> &[OneofDescriptorProto] {
-        &self.oneof_decl
-    }
-    pub fn clear_oneof_decl(&mut self) {
-        self.oneof_decl.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_oneof_decl(&mut self, v: crate::RepeatedField<OneofDescriptorProto>) {
-        self.oneof_decl = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_oneof_decl(&mut self) -> &mut crate::RepeatedField<OneofDescriptorProto> {
-        &mut self.oneof_decl
-    }
-
-    // Take field
-    pub fn take_oneof_decl(&mut self) -> crate::RepeatedField<OneofDescriptorProto> {
-        ::std::mem::replace(&mut self.oneof_decl, crate::RepeatedField::new())
-    }
-
-    // optional .google.protobuf.MessageOptions options = 7;
-
-
-    pub fn get_options(&self) -> &MessageOptions {
-        self.options.as_ref().unwrap_or_else(|| <MessageOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: MessageOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut MessageOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> MessageOptions {
-        self.options.take().unwrap_or_else(|| MessageOptions::new())
-    }
-
-    // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
-
-
-    pub fn get_reserved_range(&self) -> &[DescriptorProto_ReservedRange] {
-        &self.reserved_range
-    }
-    pub fn clear_reserved_range(&mut self) {
-        self.reserved_range.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_reserved_range(&mut self, v: crate::RepeatedField<DescriptorProto_ReservedRange>) {
-        self.reserved_range = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_reserved_range(&mut self) -> &mut crate::RepeatedField<DescriptorProto_ReservedRange> {
-        &mut self.reserved_range
-    }
-
-    // Take field
-    pub fn take_reserved_range(&mut self) -> crate::RepeatedField<DescriptorProto_ReservedRange> {
-        ::std::mem::replace(&mut self.reserved_range, crate::RepeatedField::new())
-    }
-
-    // repeated string reserved_name = 10;
-
-
-    pub fn get_reserved_name(&self) -> &[::std::string::String] {
-        &self.reserved_name
-    }
-    pub fn clear_reserved_name(&mut self) {
-        self.reserved_name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_reserved_name(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.reserved_name = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_reserved_name(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.reserved_name
-    }
-
-    // Take field
-    pub fn take_reserved_name(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.reserved_name, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(10);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &DescriptorProto| { &m.name },
+            |m: &mut DescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "field",
+            |m: &DescriptorProto| { &m.field },
+            |m: &mut DescriptorProto| { &mut m.field },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "extension",
+            |m: &DescriptorProto| { &m.extension },
+            |m: &mut DescriptorProto| { &mut m.extension },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "nested_type",
+            |m: &DescriptorProto| { &m.nested_type },
+            |m: &mut DescriptorProto| { &mut m.nested_type },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "enum_type",
+            |m: &DescriptorProto| { &m.enum_type },
+            |m: &mut DescriptorProto| { &mut m.enum_type },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "extension_range",
+            |m: &DescriptorProto| { &m.extension_range },
+            |m: &mut DescriptorProto| { &mut m.extension_range },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "oneof_decl",
+            |m: &DescriptorProto| { &m.oneof_decl },
+            |m: &mut DescriptorProto| { &mut m.oneof_decl },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, MessageOptions>(
+            "options",
+            |m: &DescriptorProto| { &m.options },
+            |m: &mut DescriptorProto| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "reserved_range",
+            |m: &DescriptorProto| { &m.reserved_range },
+            |m: &mut DescriptorProto| { &mut m.reserved_range },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "reserved_name",
+            |m: &DescriptorProto| { &m.reserved_name },
+            |m: &mut DescriptorProto| { &mut m.reserved_name },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<DescriptorProto>(
+            "DescriptorProto",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for DescriptorProto {
+    const NAME: &'static str = "DescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.field {
             if !v.is_initialized() {
@@ -1244,42 +820,41 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.field)?;
-                },
-                6 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.extension)?;
-                },
-                3 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.nested_type)?;
-                },
-                4 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.enum_type)?;
-                },
-                5 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.extension_range)?;
-                },
-                8 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.oneof_decl)?;
-                },
-                7 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
-                },
-                9 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.reserved_range)?;
-                },
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
                 10 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.reserved_name)?;
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                18 => {
+                    self.field.push(is.read_message()?);
+                },
+                50 => {
+                    self.extension.push(is.read_message()?);
+                },
+                26 => {
+                    self.nested_type.push(is.read_message()?);
+                },
+                34 => {
+                    self.enum_type.push(is.read_message()?);
+                },
+                42 => {
+                    self.extension_range.push(is.read_message()?);
+                },
+                66 => {
+                    self.oneof_decl.push(is.read_message()?);
+                },
+                58 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
+                },
+                74 => {
+                    self.reserved_range.push(is.read_message()?);
+                },
+                82 => {
+                    self.reserved_name.push(is.read_string()?);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1288,203 +863,100 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
         for value in &self.field {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.extension {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.nested_type {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.enum_type {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.extension_range {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.oneof_decl {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
         for value in &self.reserved_range {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.reserved_name {
             my_size += crate::rt::string_size(10, &value);
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
         for v in &self.field {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
         };
         for v in &self.extension {
-            os.write_tag(6, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(6, v, os)?;
         };
         for v in &self.nested_type {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
         };
         for v in &self.enum_type {
-            os.write_tag(4, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(4, v, os)?;
         };
         for v in &self.extension_range {
-            os.write_tag(5, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(5, v, os)?;
         };
         for v in &self.oneof_decl {
-            os.write_tag(8, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(8, v, os)?;
         };
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(7, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(7, v, os)?;
         }
         for v in &self.reserved_range {
-            os.write_tag(9, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(9, v, os)?;
         };
         for v in &self.reserved_name {
             os.write_string(10, &v)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> DescriptorProto {
         DescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &DescriptorProto| { &m.name },
-                |m: &mut DescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<FieldDescriptorProto>>(
-                "field",
-                |m: &DescriptorProto| { &m.field },
-                |m: &mut DescriptorProto| { &mut m.field },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<FieldDescriptorProto>>(
-                "extension",
-                |m: &DescriptorProto| { &m.extension },
-                |m: &mut DescriptorProto| { &mut m.extension },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<DescriptorProto>>(
-                "nested_type",
-                |m: &DescriptorProto| { &m.nested_type },
-                |m: &mut DescriptorProto| { &mut m.nested_type },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumDescriptorProto>>(
-                "enum_type",
-                |m: &DescriptorProto| { &m.enum_type },
-                |m: &mut DescriptorProto| { &mut m.enum_type },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<DescriptorProto_ExtensionRange>>(
-                "extension_range",
-                |m: &DescriptorProto| { &m.extension_range },
-                |m: &mut DescriptorProto| { &mut m.extension_range },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<OneofDescriptorProto>>(
-                "oneof_decl",
-                |m: &DescriptorProto| { &m.oneof_decl },
-                |m: &mut DescriptorProto| { &mut m.oneof_decl },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<MessageOptions>>(
-                "options",
-                |m: &DescriptorProto| { &m.options },
-                |m: &mut DescriptorProto| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<DescriptorProto_ReservedRange>>(
-                "reserved_range",
-                |m: &DescriptorProto| { &m.reserved_range },
-                |m: &mut DescriptorProto| { &mut m.reserved_range },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "reserved_name",
-                |m: &DescriptorProto| { &m.reserved_name },
-                |m: &mut DescriptorProto| { &mut m.reserved_name },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<DescriptorProto>(
-                "DescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static DescriptorProto {
-        static instance: crate::rt::LazyV2<DescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(DescriptorProto::new)
-    }
-}
-
-impl crate::Clear for DescriptorProto {
     fn clear(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
         self.field.clear();
         self.extension.clear();
         self.nested_type.clear();
@@ -1494,485 +966,440 @@
         self.options.clear();
         self.reserved_range.clear();
         self.reserved_name.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static DescriptorProto {
+        static instance: DescriptorProto = DescriptorProto {
+            name: ::std::option::Option::None,
+            field: ::std::vec::Vec::new(),
+            extension: ::std::vec::Vec::new(),
+            nested_type: ::std::vec::Vec::new(),
+            enum_type: ::std::vec::Vec::new(),
+            extension_range: ::std::vec::Vec::new(),
+            oneof_decl: ::std::vec::Vec::new(),
+            options: crate::MessageField::none(),
+            reserved_range: ::std::vec::Vec::new(),
+            reserved_name: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for DescriptorProto {
+impl crate::MessageFull for DescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("DescriptorProto").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for DescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for DescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct DescriptorProto_ExtensionRange {
-    // message fields
-    start: ::std::option::Option<i32>,
-    end: ::std::option::Option<i32>,
-    pub options: crate::SingularPtrField<ExtensionRangeOptions>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a DescriptorProto_ExtensionRange {
-    fn default() -> &'a DescriptorProto_ExtensionRange {
-        <DescriptorProto_ExtensionRange as crate::Message>::default_instance()
-    }
-}
-
-impl DescriptorProto_ExtensionRange {
-    pub fn new() -> DescriptorProto_ExtensionRange {
-        ::std::default::Default::default()
+/// Nested message and enums of message `DescriptorProto`
+pub mod descriptor_proto {
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.DescriptorProto.ExtensionRange)
+    pub struct ExtensionRange {
+        // message fields
+        // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.ExtensionRange.start)
+        pub start: ::std::option::Option<i32>,
+        // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.ExtensionRange.end)
+        pub end: ::std::option::Option<i32>,
+        // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.ExtensionRange.options)
+        pub options: crate::MessageField<super::ExtensionRangeOptions>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.DescriptorProto.ExtensionRange.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    // optional int32 start = 1;
-
-
-    pub fn get_start(&self) -> i32 {
-        self.start.unwrap_or(0)
-    }
-    pub fn clear_start(&mut self) {
-        self.start = ::std::option::Option::None;
-    }
-
-    pub fn has_start(&self) -> bool {
-        self.start.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_start(&mut self, v: i32) {
-        self.start = ::std::option::Option::Some(v);
-    }
-
-    // optional int32 end = 2;
-
-
-    pub fn get_end(&self) -> i32 {
-        self.end.unwrap_or(0)
-    }
-    pub fn clear_end(&mut self) {
-        self.end = ::std::option::Option::None;
-    }
-
-    pub fn has_end(&self) -> bool {
-        self.end.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_end(&mut self, v: i32) {
-        self.end = ::std::option::Option::Some(v);
-    }
-
-    // optional .google.protobuf.ExtensionRangeOptions options = 3;
-
-
-    pub fn get_options(&self) -> &ExtensionRangeOptions {
-        self.options.as_ref().unwrap_or_else(|| <ExtensionRangeOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: ExtensionRangeOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut ExtensionRangeOptions {
-        if self.options.is_none() {
-            self.options.set_default();
+    impl<'a> ::std::default::Default for &'a ExtensionRange {
+        fn default() -> &'a ExtensionRange {
+            <ExtensionRange as crate::Message>::default_instance()
         }
-        self.options.as_mut().unwrap()
     }
 
-    // Take field
-    pub fn take_options(&mut self) -> ExtensionRangeOptions {
-        self.options.take().unwrap_or_else(|| ExtensionRangeOptions::new())
-    }
-}
-
-impl crate::Message for DescriptorProto_ExtensionRange {
-    fn is_initialized(&self) -> bool {
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.start = ::std::option::Option::Some(tmp);
-                },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.end = ::std::option::Option::Some(tmp);
-                },
-                3 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
+    impl ExtensionRange {
+        pub fn new() -> ExtensionRange {
+            ::std::default::Default::default()
         }
-        ::std::result::Result::Ok(())
-    }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let Some(v) = self.start {
-            my_size += crate::rt::value_size(1, v, crate::wire_format::WireTypeVarint);
+        // optional int32 start = 1;
+
+        pub fn start(&self) -> i32 {
+            self.start.unwrap_or(0)
         }
-        if let Some(v) = self.end {
-            my_size += crate::rt::value_size(2, v, crate::wire_format::WireTypeVarint);
+
+        pub fn clear_start(&mut self) {
+            self.start = ::std::option::Option::None;
         }
-        if let Some(ref v) = self.options.as_ref() {
-            let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+
+        pub fn has_start(&self) -> bool {
+            self.start.is_some()
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(v) = self.start {
-            os.write_int32(1, v)?;
+        // Param is passed by value, moved
+        pub fn set_start(&mut self, v: i32) {
+            self.start = ::std::option::Option::Some(v);
         }
-        if let Some(v) = self.end {
-            os.write_int32(2, v)?;
+
+        // optional int32 end = 2;
+
+        pub fn end(&self) -> i32 {
+            self.end.unwrap_or(0)
         }
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+
+        pub fn clear_end(&mut self) {
+            self.end = ::std::option::Option::None;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
+        pub fn has_end(&self) -> bool {
+            self.end.is_some()
+        }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
+        // Param is passed by value, moved
+        pub fn set_end(&mut self, v: i32) {
+            self.end = ::std::option::Option::Some(v);
+        }
 
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> DescriptorProto_ExtensionRange {
-        DescriptorProto_ExtensionRange::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(3);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "start",
-                |m: &DescriptorProto_ExtensionRange| { &m.start },
-                |m: &mut DescriptorProto_ExtensionRange| { &mut m.start },
+                |m: &ExtensionRange| { &m.start },
+                |m: &mut ExtensionRange| { &mut m.start },
             ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "end",
-                |m: &DescriptorProto_ExtensionRange| { &m.end },
-                |m: &mut DescriptorProto_ExtensionRange| { &mut m.end },
+                |m: &ExtensionRange| { &m.end },
+                |m: &mut ExtensionRange| { &mut m.end },
             ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<ExtensionRangeOptions>>(
+            fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, super::ExtensionRangeOptions>(
                 "options",
-                |m: &DescriptorProto_ExtensionRange| { &m.options },
-                |m: &mut DescriptorProto_ExtensionRange| { &mut m.options },
+                |m: &ExtensionRange| { &m.options },
+                |m: &mut ExtensionRange| { &mut m.options },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<DescriptorProto_ExtensionRange>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<ExtensionRange>(
                 "DescriptorProto.ExtensionRange",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
+        }
     }
 
-    fn default_instance() -> &'static DescriptorProto_ExtensionRange {
-        static instance: crate::rt::LazyV2<DescriptorProto_ExtensionRange> = crate::rt::LazyV2::INIT;
-        instance.get(DescriptorProto_ExtensionRange::new)
-    }
-}
+    impl crate::Message for ExtensionRange {
+        const NAME: &'static str = "ExtensionRange";
 
-impl crate::Clear for DescriptorProto_ExtensionRange {
-    fn clear(&mut self) {
-        self.start = ::std::option::Option::None;
-        self.end = ::std::option::Option::None;
-        self.options.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for DescriptorProto_ExtensionRange {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for DescriptorProto_ExtensionRange {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct DescriptorProto_ReservedRange {
-    // message fields
-    start: ::std::option::Option<i32>,
-    end: ::std::option::Option<i32>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a DescriptorProto_ReservedRange {
-    fn default() -> &'a DescriptorProto_ReservedRange {
-        <DescriptorProto_ReservedRange as crate::Message>::default_instance()
-    }
-}
-
-impl DescriptorProto_ReservedRange {
-    pub fn new() -> DescriptorProto_ReservedRange {
-        ::std::default::Default::default()
-    }
-
-    // optional int32 start = 1;
-
-
-    pub fn get_start(&self) -> i32 {
-        self.start.unwrap_or(0)
-    }
-    pub fn clear_start(&mut self) {
-        self.start = ::std::option::Option::None;
-    }
-
-    pub fn has_start(&self) -> bool {
-        self.start.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_start(&mut self, v: i32) {
-        self.start = ::std::option::Option::Some(v);
-    }
-
-    // optional int32 end = 2;
-
-
-    pub fn get_end(&self) -> i32 {
-        self.end.unwrap_or(0)
-    }
-    pub fn clear_end(&mut self) {
-        self.end = ::std::option::Option::None;
-    }
-
-    pub fn has_end(&self) -> bool {
-        self.end.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_end(&mut self, v: i32) {
-        self.end = ::std::option::Option::Some(v);
-    }
-}
-
-impl crate::Message for DescriptorProto_ReservedRange {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.start = ::std::option::Option::Some(tmp);
-                },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.end = ::std::option::Option::Some(tmp);
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
+        fn is_initialized(&self) -> bool {
+            for v in &self.options {
+                if !v.is_initialized() {
+                    return false;
+                }
             };
+            true
         }
-        ::std::result::Result::Ok(())
-    }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let Some(v) = self.start {
-            my_size += crate::rt::value_size(1, v, crate::wire_format::WireTypeVarint);
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    8 => {
+                        self.start = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    16 => {
+                        self.end = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    26 => {
+                        crate::rt::read_singular_message_into_field(is, &mut self.options)?;
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
         }
-        if let Some(v) = self.end {
-            my_size += crate::rt::value_size(2, v, crate::wire_format::WireTypeVarint);
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            if let Some(v) = self.start {
+                my_size += crate::rt::int32_size(1, v);
+            }
+            if let Some(v) = self.end {
+                my_size += crate::rt::int32_size(2, v);
+            }
+            if let Some(v) = self.options.as_ref() {
+                let len = v.compute_size();
+                my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+            }
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(v) = self.start {
-            os.write_int32(1, v)?;
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            if let Some(v) = self.start {
+                os.write_int32(1, v)?;
+            }
+            if let Some(v) = self.end {
+                os.write_int32(2, v)?;
+            }
+            if let Some(v) = self.options.as_ref() {
+                crate::rt::write_message_field_with_cached_size(3, v, os)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
         }
-        if let Some(v) = self.end {
-            os.write_int32(2, v)?;
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> ExtensionRange {
+            ExtensionRange::new()
+        }
+
+        fn clear(&mut self) {
+            self.start = ::std::option::Option::None;
+            self.end = ::std::option::Option::None;
+            self.options.clear();
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static ExtensionRange {
+            static instance: ExtensionRange = ExtensionRange {
+                start: ::std::option::Option::None,
+                end: ::std::option::Option::None,
+                options: crate::MessageField::none(),
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    impl crate::MessageFull for ExtensionRange {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("DescriptorProto.ExtensionRange").unwrap()).clone()
+        }
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
+    impl ::std::fmt::Display for ExtensionRange {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
     }
 
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
+    impl crate::reflect::ProtobufValue for ExtensionRange {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
     }
 
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
+    ///  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.
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.DescriptorProto.ReservedRange)
+    pub struct ReservedRange {
+        // message fields
+        // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.ReservedRange.start)
+        pub start: ::std::option::Option<i32>,
+        // @@protoc_insertion_point(field:google.protobuf.DescriptorProto.ReservedRange.end)
+        pub end: ::std::option::Option<i32>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.DescriptorProto.ReservedRange.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    impl<'a> ::std::default::Default for &'a ReservedRange {
+        fn default() -> &'a ReservedRange {
+            <ReservedRange as crate::Message>::default_instance()
+        }
     }
 
-    fn new() -> DescriptorProto_ReservedRange {
-        DescriptorProto_ReservedRange::new()
-    }
+    impl ReservedRange {
+        pub fn new() -> ReservedRange {
+            ::std::default::Default::default()
+        }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+        // optional int32 start = 1;
+
+        pub fn start(&self) -> i32 {
+            self.start.unwrap_or(0)
+        }
+
+        pub fn clear_start(&mut self) {
+            self.start = ::std::option::Option::None;
+        }
+
+        pub fn has_start(&self) -> bool {
+            self.start.is_some()
+        }
+
+        // Param is passed by value, moved
+        pub fn set_start(&mut self, v: i32) {
+            self.start = ::std::option::Option::Some(v);
+        }
+
+        // optional int32 end = 2;
+
+        pub fn end(&self) -> i32 {
+            self.end.unwrap_or(0)
+        }
+
+        pub fn clear_end(&mut self) {
+            self.end = ::std::option::Option::None;
+        }
+
+        pub fn has_end(&self) -> bool {
+            self.end.is_some()
+        }
+
+        // Param is passed by value, moved
+        pub fn set_end(&mut self, v: i32) {
+            self.end = ::std::option::Option::Some(v);
+        }
+
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(2);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "start",
-                |m: &DescriptorProto_ReservedRange| { &m.start },
-                |m: &mut DescriptorProto_ReservedRange| { &mut m.start },
+                |m: &ReservedRange| { &m.start },
+                |m: &mut ReservedRange| { &mut m.start },
             ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "end",
-                |m: &DescriptorProto_ReservedRange| { &m.end },
-                |m: &mut DescriptorProto_ReservedRange| { &mut m.end },
+                |m: &ReservedRange| { &m.end },
+                |m: &mut ReservedRange| { &mut m.end },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<DescriptorProto_ReservedRange>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<ReservedRange>(
                 "DescriptorProto.ReservedRange",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
+        }
     }
 
-    fn default_instance() -> &'static DescriptorProto_ReservedRange {
-        static instance: crate::rt::LazyV2<DescriptorProto_ReservedRange> = crate::rt::LazyV2::INIT;
-        instance.get(DescriptorProto_ReservedRange::new)
+    impl crate::Message for ReservedRange {
+        const NAME: &'static str = "ReservedRange";
+
+        fn is_initialized(&self) -> bool {
+            true
+        }
+
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    8 => {
+                        self.start = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    16 => {
+                        self.end = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            if let Some(v) = self.start {
+                my_size += crate::rt::int32_size(1, v);
+            }
+            if let Some(v) = self.end {
+                my_size += crate::rt::int32_size(2, v);
+            }
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            if let Some(v) = self.start {
+                os.write_int32(1, v)?;
+            }
+            if let Some(v) = self.end {
+                os.write_int32(2, v)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> ReservedRange {
+            ReservedRange::new()
+        }
+
+        fn clear(&mut self) {
+            self.start = ::std::option::Option::None;
+            self.end = ::std::option::Option::None;
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static ReservedRange {
+            static instance: ReservedRange = ReservedRange {
+                start: ::std::option::Option::None,
+                end: ::std::option::Option::None,
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
+    }
+
+    impl crate::MessageFull for ReservedRange {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("DescriptorProto.ReservedRange").unwrap()).clone()
+        }
+    }
+
+    impl ::std::fmt::Display for ReservedRange {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
+    }
+
+    impl crate::reflect::ProtobufValue for ReservedRange {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
     }
 }
 
-impl crate::Clear for DescriptorProto_ReservedRange {
-    fn clear(&mut self) {
-        self.start = ::std::option::Option::None;
-        self.end = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for DescriptorProto_ReservedRange {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for DescriptorProto_ReservedRange {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.ExtensionRangeOptions)
 pub struct ExtensionRangeOptions {
     // message fields
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.ExtensionRangeOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.ExtensionRangeOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a ExtensionRangeOptions {
@@ -1986,33 +1413,25 @@
         ::std::default::Default::default()
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &ExtensionRangeOptions| { &m.uninterpreted_option },
+            |m: &mut ExtensionRangeOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<ExtensionRangeOptions>(
+            "ExtensionRangeOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for ExtensionRangeOptions {
+    const NAME: &'static str = "ExtensionRangeOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -2022,15 +1441,14 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -2039,119 +1457,139 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> ExtensionRangeOptions {
         ExtensionRangeOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &ExtensionRangeOptions| { &m.uninterpreted_option },
-                |m: &mut ExtensionRangeOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<ExtensionRangeOptions>(
-                "ExtensionRangeOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.uninterpreted_option.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static ExtensionRangeOptions {
-        static instance: crate::rt::LazyV2<ExtensionRangeOptions> = crate::rt::LazyV2::INIT;
-        instance.get(ExtensionRangeOptions::new)
+        static instance: ExtensionRangeOptions = ExtensionRangeOptions {
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for ExtensionRangeOptions {
-    fn clear(&mut self) {
-        self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for ExtensionRangeOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("ExtensionRangeOptions").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for ExtensionRangeOptions {
+impl ::std::fmt::Display for ExtensionRangeOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for ExtensionRangeOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a field within a message.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FieldDescriptorProto)
 pub struct FieldDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    number: ::std::option::Option<i32>,
-    label: ::std::option::Option<FieldDescriptorProto_Label>,
-    field_type: ::std::option::Option<FieldDescriptorProto_Type>,
-    type_name: crate::SingularField<::std::string::String>,
-    extendee: crate::SingularField<::std::string::String>,
-    default_value: crate::SingularField<::std::string::String>,
-    oneof_index: ::std::option::Option<i32>,
-    json_name: crate::SingularField<::std::string::String>,
-    pub options: crate::SingularPtrField<FieldOptions>,
-    proto3_optional: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.number)
+    pub number: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.label)
+    pub label: ::std::option::Option<crate::EnumOrUnknown<field_descriptor_proto::Label>>,
+    ///  If type_name is set, this need not be set.  If both this and type_name
+    ///  are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.type)
+    pub type_: ::std::option::Option<crate::EnumOrUnknown<field_descriptor_proto::Type>>,
+    ///  For message and enum types, this is the name of the type.  If the name
+    ///  starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
+    ///  rules are used to find the type (i.e. first the nested types within this
+    ///  message are searched, then within the parent, on up to the root
+    ///  namespace).
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.type_name)
+    pub type_name: ::std::option::Option<::std::string::String>,
+    ///  For extensions, this is the name of the type being extended.  It is
+    ///  resolved in the same manner as type_name.
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.extendee)
+    pub extendee: ::std::option::Option<::std::string::String>,
+    ///  For numeric types, contains the original text representation of the value.
+    ///  For booleans, "true" or "false".
+    ///  For strings, contains the default text contents (not escaped in any way).
+    ///  For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
+    ///  TODO(kenton):  Base-64 encode?
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.default_value)
+    pub default_value: ::std::option::Option<::std::string::String>,
+    ///  If set, gives the index of a oneof in the containing type's oneof_decl
+    ///  list.  This field is a member of that oneof.
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.oneof_index)
+    pub oneof_index: ::std::option::Option<i32>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.json_name)
+    pub json_name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.options)
+    pub options: crate::MessageField<FieldOptions>,
+    ///  If true, this is a proto3 "optional". When a proto3 field is optional, it
+    ///  tracks presence regardless of field type.
+    ///
+    ///  When proto3_optional is true, this field must be belong to a oneof to
+    ///  signal to old proto3 clients that presence is tracked for this field. This
+    ///  oneof is known as a "synthetic" oneof, and this field must be its sole
+    ///  member (each proto3 optional field gets its own synthetic oneof). Synthetic
+    ///  oneofs exist in the descriptor only, and do not generate any API. Synthetic
+    ///  oneofs must be ordered after all "real" oneofs.
+    ///
+    ///  For message fields, proto3_optional doesn't create any semantic change,
+    ///  since non-repeated message fields always track presence. However it still
+    ///  indicates the semantic detail of whether the user wrote "optional" or not.
+    ///  This can be useful for round-tripping the .proto file. For consistency we
+    ///  give message fields a synthetic oneof also, even though it is not required
+    ///  to track presence. This is especially important because the parser can't
+    ///  tell if a field is a message or an enum, so it must always create a
+    ///  synthetic oneof.
+    ///
+    ///  Proto2 optional fields do not set this flag, because they already indicate
+    ///  optional with `LABEL_OPTIONAL`.
+    // @@protoc_insertion_point(field:google.protobuf.FieldDescriptorProto.proto3_optional)
+    pub proto3_optional: ::std::option::Option<bool>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FieldDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FieldDescriptorProto {
@@ -2167,15 +1605,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -2184,14 +1622,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -2203,10 +1641,10 @@
 
     // optional int32 number = 3;
 
-
-    pub fn get_number(&self) -> i32 {
+    pub fn number(&self) -> i32 {
         self.number.unwrap_or(0)
     }
+
     pub fn clear_number(&mut self) {
         self.number = ::std::option::Option::None;
     }
@@ -2222,10 +1660,13 @@
 
     // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
 
-
-    pub fn get_label(&self) -> FieldDescriptorProto_Label {
-        self.label.unwrap_or(FieldDescriptorProto_Label::LABEL_OPTIONAL)
+    pub fn label(&self) -> field_descriptor_proto::Label {
+        match self.label {
+            Some(e) => e.enum_value_or(field_descriptor_proto::Label::LABEL_OPTIONAL),
+            None => field_descriptor_proto::Label::LABEL_OPTIONAL,
+        }
     }
+
     pub fn clear_label(&mut self) {
         self.label = ::std::option::Option::None;
     }
@@ -2235,40 +1676,43 @@
     }
 
     // Param is passed by value, moved
-    pub fn set_label(&mut self, v: FieldDescriptorProto_Label) {
-        self.label = ::std::option::Option::Some(v);
+    pub fn set_label(&mut self, v: field_descriptor_proto::Label) {
+        self.label = ::std::option::Option::Some(crate::EnumOrUnknown::new(v));
     }
 
     // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
 
-
-    pub fn get_field_type(&self) -> FieldDescriptorProto_Type {
-        self.field_type.unwrap_or(FieldDescriptorProto_Type::TYPE_DOUBLE)
-    }
-    pub fn clear_field_type(&mut self) {
-        self.field_type = ::std::option::Option::None;
+    pub fn type_(&self) -> field_descriptor_proto::Type {
+        match self.type_ {
+            Some(e) => e.enum_value_or(field_descriptor_proto::Type::TYPE_DOUBLE),
+            None => field_descriptor_proto::Type::TYPE_DOUBLE,
+        }
     }
 
-    pub fn has_field_type(&self) -> bool {
-        self.field_type.is_some()
+    pub fn clear_type_(&mut self) {
+        self.type_ = ::std::option::Option::None;
+    }
+
+    pub fn has_type(&self) -> bool {
+        self.type_.is_some()
     }
 
     // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: FieldDescriptorProto_Type) {
-        self.field_type = ::std::option::Option::Some(v);
+    pub fn set_type(&mut self, v: field_descriptor_proto::Type) {
+        self.type_ = ::std::option::Option::Some(crate::EnumOrUnknown::new(v));
     }
 
     // optional string type_name = 6;
 
-
-    pub fn get_type_name(&self) -> &str {
+    pub fn type_name(&self) -> &str {
         match self.type_name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_type_name(&mut self) {
-        self.type_name.clear();
+        self.type_name = ::std::option::Option::None;
     }
 
     pub fn has_type_name(&self) -> bool {
@@ -2277,14 +1721,14 @@
 
     // Param is passed by value, moved
     pub fn set_type_name(&mut self, v: ::std::string::String) {
-        self.type_name = crate::SingularField::some(v);
+        self.type_name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_type_name(&mut self) -> &mut ::std::string::String {
         if self.type_name.is_none() {
-            self.type_name.set_default();
+            self.type_name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.type_name.as_mut().unwrap()
     }
@@ -2296,15 +1740,15 @@
 
     // optional string extendee = 2;
 
-
-    pub fn get_extendee(&self) -> &str {
+    pub fn extendee(&self) -> &str {
         match self.extendee.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_extendee(&mut self) {
-        self.extendee.clear();
+        self.extendee = ::std::option::Option::None;
     }
 
     pub fn has_extendee(&self) -> bool {
@@ -2313,14 +1757,14 @@
 
     // Param is passed by value, moved
     pub fn set_extendee(&mut self, v: ::std::string::String) {
-        self.extendee = crate::SingularField::some(v);
+        self.extendee = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_extendee(&mut self) -> &mut ::std::string::String {
         if self.extendee.is_none() {
-            self.extendee.set_default();
+            self.extendee = ::std::option::Option::Some(::std::string::String::new());
         }
         self.extendee.as_mut().unwrap()
     }
@@ -2332,15 +1776,15 @@
 
     // optional string default_value = 7;
 
-
-    pub fn get_default_value(&self) -> &str {
+    pub fn default_value(&self) -> &str {
         match self.default_value.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_default_value(&mut self) {
-        self.default_value.clear();
+        self.default_value = ::std::option::Option::None;
     }
 
     pub fn has_default_value(&self) -> bool {
@@ -2349,14 +1793,14 @@
 
     // Param is passed by value, moved
     pub fn set_default_value(&mut self, v: ::std::string::String) {
-        self.default_value = crate::SingularField::some(v);
+        self.default_value = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_default_value(&mut self) -> &mut ::std::string::String {
         if self.default_value.is_none() {
-            self.default_value.set_default();
+            self.default_value = ::std::option::Option::Some(::std::string::String::new());
         }
         self.default_value.as_mut().unwrap()
     }
@@ -2368,10 +1812,10 @@
 
     // optional int32 oneof_index = 9;
 
-
-    pub fn get_oneof_index(&self) -> i32 {
+    pub fn oneof_index(&self) -> i32 {
         self.oneof_index.unwrap_or(0)
     }
+
     pub fn clear_oneof_index(&mut self) {
         self.oneof_index = ::std::option::Option::None;
     }
@@ -2387,15 +1831,15 @@
 
     // optional string json_name = 10;
 
-
-    pub fn get_json_name(&self) -> &str {
+    pub fn json_name(&self) -> &str {
         match self.json_name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_json_name(&mut self) {
-        self.json_name.clear();
+        self.json_name = ::std::option::Option::None;
     }
 
     pub fn has_json_name(&self) -> bool {
@@ -2404,14 +1848,14 @@
 
     // Param is passed by value, moved
     pub fn set_json_name(&mut self, v: ::std::string::String) {
-        self.json_name = crate::SingularField::some(v);
+        self.json_name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_json_name(&mut self) -> &mut ::std::string::String {
         if self.json_name.is_none() {
-            self.json_name.set_default();
+            self.json_name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.json_name.as_mut().unwrap()
     }
@@ -2421,45 +1865,12 @@
         self.json_name.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // optional .google.protobuf.FieldOptions options = 8;
-
-
-    pub fn get_options(&self) -> &FieldOptions {
-        self.options.as_ref().unwrap_or_else(|| <FieldOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: FieldOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut FieldOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> FieldOptions {
-        self.options.take().unwrap_or_else(|| FieldOptions::new())
-    }
-
     // optional bool proto3_optional = 17;
 
-
-    pub fn get_proto3_optional(&self) -> bool {
+    pub fn proto3_optional(&self) -> bool {
         self.proto3_optional.unwrap_or(false)
     }
+
     pub fn clear_proto3_optional(&mut self) {
         self.proto3_optional = ::std::option::Option::None;
     }
@@ -2472,9 +1883,76 @@
     pub fn set_proto3_optional(&mut self, v: bool) {
         self.proto3_optional = ::std::option::Option::Some(v);
     }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(11);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &FieldDescriptorProto| { &m.name },
+            |m: &mut FieldDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "number",
+            |m: &FieldDescriptorProto| { &m.number },
+            |m: &mut FieldDescriptorProto| { &mut m.number },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "label",
+            |m: &FieldDescriptorProto| { &m.label },
+            |m: &mut FieldDescriptorProto| { &mut m.label },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "type",
+            |m: &FieldDescriptorProto| { &m.type_ },
+            |m: &mut FieldDescriptorProto| { &mut m.type_ },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "type_name",
+            |m: &FieldDescriptorProto| { &m.type_name },
+            |m: &mut FieldDescriptorProto| { &mut m.type_name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "extendee",
+            |m: &FieldDescriptorProto| { &m.extendee },
+            |m: &mut FieldDescriptorProto| { &mut m.extendee },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "default_value",
+            |m: &FieldDescriptorProto| { &m.default_value },
+            |m: &mut FieldDescriptorProto| { &mut m.default_value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "oneof_index",
+            |m: &FieldDescriptorProto| { &m.oneof_index },
+            |m: &mut FieldDescriptorProto| { &mut m.oneof_index },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "json_name",
+            |m: &FieldDescriptorProto| { &m.json_name },
+            |m: &mut FieldDescriptorProto| { &mut m.json_name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, FieldOptions>(
+            "options",
+            |m: &FieldDescriptorProto| { &m.options },
+            |m: &mut FieldDescriptorProto| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "proto3_optional",
+            |m: &FieldDescriptorProto| { &m.proto3_optional },
+            |m: &mut FieldDescriptorProto| { &mut m.proto3_optional },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FieldDescriptorProto>(
+            "FieldDescriptorProto",
+            fields,
+            oneofs,
+        )
+    }
 }
 
 impl crate::Message for FieldDescriptorProto {
+    const NAME: &'static str = "FieldDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.options {
             if !v.is_initialized() {
@@ -2484,57 +1962,44 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
-                },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.number = ::std::option::Option::Some(tmp);
-                },
-                4 => {
-                    crate::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.label, 4, &mut self.unknown_fields)?
-                },
-                5 => {
-                    crate::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 5, &mut self.unknown_fields)?
-                },
-                6 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.type_name)?;
-                },
-                2 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.extendee)?;
-                },
-                7 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.default_value)?;
-                },
-                9 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.oneof_index = ::std::option::Option::Some(tmp);
-                },
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
                 10 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.json_name)?;
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                8 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                24 => {
+                    self.number = ::std::option::Option::Some(is.read_int32()?);
                 },
-                17 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.proto3_optional = ::std::option::Option::Some(tmp);
+                32 => {
+                    self.label = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                40 => {
+                    self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?);
+                },
+                50 => {
+                    self.type_name = ::std::option::Option::Some(is.read_string()?);
+                },
+                18 => {
+                    self.extendee = ::std::option::Option::Some(is.read_string()?);
+                },
+                58 => {
+                    self.default_value = ::std::option::Option::Some(is.read_string()?);
+                },
+                72 => {
+                    self.oneof_index = ::std::option::Option::Some(is.read_int32()?);
+                },
+                82 => {
+                    self.json_name = ::std::option::Option::Some(is.read_string()?);
+                },
+                66 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
+                },
+                136 => {
+                    self.proto3_optional = ::std::option::Option::Some(is.read_bool()?);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -2543,385 +2008,364 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
         if let Some(v) = self.number {
-            my_size += crate::rt::value_size(3, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(3, v);
         }
         if let Some(v) = self.label {
-            my_size += crate::rt::enum_size(4, v);
+            my_size += crate::rt::int32_size(4, v.value());
         }
-        if let Some(v) = self.field_type {
-            my_size += crate::rt::enum_size(5, v);
+        if let Some(v) = self.type_ {
+            my_size += crate::rt::int32_size(5, v.value());
         }
-        if let Some(ref v) = self.type_name.as_ref() {
+        if let Some(v) = self.type_name.as_ref() {
             my_size += crate::rt::string_size(6, &v);
         }
-        if let Some(ref v) = self.extendee.as_ref() {
+        if let Some(v) = self.extendee.as_ref() {
             my_size += crate::rt::string_size(2, &v);
         }
-        if let Some(ref v) = self.default_value.as_ref() {
+        if let Some(v) = self.default_value.as_ref() {
             my_size += crate::rt::string_size(7, &v);
         }
         if let Some(v) = self.oneof_index {
-            my_size += crate::rt::value_size(9, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(9, v);
         }
-        if let Some(ref v) = self.json_name.as_ref() {
+        if let Some(v) = self.json_name.as_ref() {
             my_size += crate::rt::string_size(10, &v);
         }
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
         if let Some(v) = self.proto3_optional {
-            my_size += 3;
+            my_size += 2 + 1;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
         if let Some(v) = self.number {
             os.write_int32(3, v)?;
         }
         if let Some(v) = self.label {
-            os.write_enum(4, crate::ProtobufEnum::value(&v))?;
+            os.write_enum(4, crate::EnumOrUnknown::value(&v))?;
         }
-        if let Some(v) = self.field_type {
-            os.write_enum(5, crate::ProtobufEnum::value(&v))?;
+        if let Some(v) = self.type_ {
+            os.write_enum(5, crate::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.type_name.as_ref() {
-            os.write_string(6, &v)?;
+        if let Some(v) = self.type_name.as_ref() {
+            os.write_string(6, v)?;
         }
-        if let Some(ref v) = self.extendee.as_ref() {
-            os.write_string(2, &v)?;
+        if let Some(v) = self.extendee.as_ref() {
+            os.write_string(2, v)?;
         }
-        if let Some(ref v) = self.default_value.as_ref() {
-            os.write_string(7, &v)?;
+        if let Some(v) = self.default_value.as_ref() {
+            os.write_string(7, v)?;
         }
         if let Some(v) = self.oneof_index {
             os.write_int32(9, v)?;
         }
-        if let Some(ref v) = self.json_name.as_ref() {
-            os.write_string(10, &v)?;
+        if let Some(v) = self.json_name.as_ref() {
+            os.write_string(10, v)?;
         }
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(8, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(8, v, os)?;
         }
         if let Some(v) = self.proto3_optional {
             os.write_bool(17, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FieldDescriptorProto {
         FieldDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &FieldDescriptorProto| { &m.name },
-                |m: &mut FieldDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "number",
-                |m: &FieldDescriptorProto| { &m.number },
-                |m: &mut FieldDescriptorProto| { &mut m.number },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeEnum<FieldDescriptorProto_Label>>(
-                "label",
-                |m: &FieldDescriptorProto| { &m.label },
-                |m: &mut FieldDescriptorProto| { &mut m.label },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeEnum<FieldDescriptorProto_Type>>(
-                "type",
-                |m: &FieldDescriptorProto| { &m.field_type },
-                |m: &mut FieldDescriptorProto| { &mut m.field_type },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "type_name",
-                |m: &FieldDescriptorProto| { &m.type_name },
-                |m: &mut FieldDescriptorProto| { &mut m.type_name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "extendee",
-                |m: &FieldDescriptorProto| { &m.extendee },
-                |m: &mut FieldDescriptorProto| { &mut m.extendee },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "default_value",
-                |m: &FieldDescriptorProto| { &m.default_value },
-                |m: &mut FieldDescriptorProto| { &mut m.default_value },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "oneof_index",
-                |m: &FieldDescriptorProto| { &m.oneof_index },
-                |m: &mut FieldDescriptorProto| { &mut m.oneof_index },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "json_name",
-                |m: &FieldDescriptorProto| { &m.json_name },
-                |m: &mut FieldDescriptorProto| { &mut m.json_name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<FieldOptions>>(
-                "options",
-                |m: &FieldDescriptorProto| { &m.options },
-                |m: &mut FieldDescriptorProto| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "proto3_optional",
-                |m: &FieldDescriptorProto| { &m.proto3_optional },
-                |m: &mut FieldDescriptorProto| { &mut m.proto3_optional },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FieldDescriptorProto>(
-                "FieldDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.name = ::std::option::Option::None;
+        self.number = ::std::option::Option::None;
+        self.label = ::std::option::Option::None;
+        self.type_ = ::std::option::Option::None;
+        self.type_name = ::std::option::Option::None;
+        self.extendee = ::std::option::Option::None;
+        self.default_value = ::std::option::Option::None;
+        self.oneof_index = ::std::option::Option::None;
+        self.json_name = ::std::option::Option::None;
+        self.options.clear();
+        self.proto3_optional = ::std::option::Option::None;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static FieldDescriptorProto {
-        static instance: crate::rt::LazyV2<FieldDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(FieldDescriptorProto::new)
+        static instance: FieldDescriptorProto = FieldDescriptorProto {
+            name: ::std::option::Option::None,
+            number: ::std::option::Option::None,
+            label: ::std::option::Option::None,
+            type_: ::std::option::Option::None,
+            type_name: ::std::option::Option::None,
+            extendee: ::std::option::Option::None,
+            default_value: ::std::option::Option::None,
+            oneof_index: ::std::option::Option::None,
+            json_name: ::std::option::Option::None,
+            options: crate::MessageField::none(),
+            proto3_optional: ::std::option::Option::None,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for FieldDescriptorProto {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.number = ::std::option::Option::None;
-        self.label = ::std::option::Option::None;
-        self.field_type = ::std::option::Option::None;
-        self.type_name.clear();
-        self.extendee.clear();
-        self.default_value.clear();
-        self.oneof_index = ::std::option::Option::None;
-        self.json_name.clear();
-        self.options.clear();
-        self.proto3_optional = ::std::option::Option::None;
-        self.unknown_fields.clear();
+impl crate::MessageFull for FieldDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FieldDescriptorProto").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for FieldDescriptorProto {
+impl ::std::fmt::Display for FieldDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FieldDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum FieldDescriptorProto_Type {
-    TYPE_DOUBLE = 1,
-    TYPE_FLOAT = 2,
-    TYPE_INT64 = 3,
-    TYPE_UINT64 = 4,
-    TYPE_INT32 = 5,
-    TYPE_FIXED64 = 6,
-    TYPE_FIXED32 = 7,
-    TYPE_BOOL = 8,
-    TYPE_STRING = 9,
-    TYPE_GROUP = 10,
-    TYPE_MESSAGE = 11,
-    TYPE_BYTES = 12,
-    TYPE_UINT32 = 13,
-    TYPE_ENUM = 14,
-    TYPE_SFIXED32 = 15,
-    TYPE_SFIXED64 = 16,
-    TYPE_SINT32 = 17,
-    TYPE_SINT64 = 18,
-}
-
-impl crate::ProtobufEnum for FieldDescriptorProto_Type {
-    fn value(&self) -> i32 {
-        *self as i32
+/// Nested message and enums of message `FieldDescriptorProto`
+pub mod field_descriptor_proto {
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.FieldDescriptorProto.Type)
+    pub enum Type {
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_DOUBLE)
+        TYPE_DOUBLE = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_FLOAT)
+        TYPE_FLOAT = 2,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_INT64)
+        TYPE_INT64 = 3,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_UINT64)
+        TYPE_UINT64 = 4,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_INT32)
+        TYPE_INT32 = 5,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_FIXED64)
+        TYPE_FIXED64 = 6,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_FIXED32)
+        TYPE_FIXED32 = 7,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_BOOL)
+        TYPE_BOOL = 8,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_STRING)
+        TYPE_STRING = 9,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_GROUP)
+        TYPE_GROUP = 10,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_MESSAGE)
+        TYPE_MESSAGE = 11,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_BYTES)
+        TYPE_BYTES = 12,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_UINT32)
+        TYPE_UINT32 = 13,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_ENUM)
+        TYPE_ENUM = 14,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_SFIXED32)
+        TYPE_SFIXED32 = 15,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_SFIXED64)
+        TYPE_SFIXED64 = 16,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_SINT32)
+        TYPE_SINT32 = 17,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Type.TYPE_SINT64)
+        TYPE_SINT64 = 18,
     }
 
-    fn from_i32(value: i32) -> ::std::option::Option<FieldDescriptorProto_Type> {
-        match value {
-            1 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_DOUBLE),
-            2 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_FLOAT),
-            3 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_INT64),
-            4 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_UINT64),
-            5 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_INT32),
-            6 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_FIXED64),
-            7 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_FIXED32),
-            8 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_BOOL),
-            9 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_STRING),
-            10 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_GROUP),
-            11 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_MESSAGE),
-            12 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_BYTES),
-            13 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_UINT32),
-            14 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_ENUM),
-            15 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_SFIXED32),
-            16 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_SFIXED64),
-            17 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_SINT32),
-            18 => ::std::option::Option::Some(FieldDescriptorProto_Type::TYPE_SINT64),
-            _ => ::std::option::Option::None
+    impl crate::Enum for Type {
+        const NAME: &'static str = "Type";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<Type> {
+            match value {
+                1 => ::std::option::Option::Some(Type::TYPE_DOUBLE),
+                2 => ::std::option::Option::Some(Type::TYPE_FLOAT),
+                3 => ::std::option::Option::Some(Type::TYPE_INT64),
+                4 => ::std::option::Option::Some(Type::TYPE_UINT64),
+                5 => ::std::option::Option::Some(Type::TYPE_INT32),
+                6 => ::std::option::Option::Some(Type::TYPE_FIXED64),
+                7 => ::std::option::Option::Some(Type::TYPE_FIXED32),
+                8 => ::std::option::Option::Some(Type::TYPE_BOOL),
+                9 => ::std::option::Option::Some(Type::TYPE_STRING),
+                10 => ::std::option::Option::Some(Type::TYPE_GROUP),
+                11 => ::std::option::Option::Some(Type::TYPE_MESSAGE),
+                12 => ::std::option::Option::Some(Type::TYPE_BYTES),
+                13 => ::std::option::Option::Some(Type::TYPE_UINT32),
+                14 => ::std::option::Option::Some(Type::TYPE_ENUM),
+                15 => ::std::option::Option::Some(Type::TYPE_SFIXED32),
+                16 => ::std::option::Option::Some(Type::TYPE_SFIXED64),
+                17 => ::std::option::Option::Some(Type::TYPE_SINT32),
+                18 => ::std::option::Option::Some(Type::TYPE_SINT64),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [Type] = &[
+            Type::TYPE_DOUBLE,
+            Type::TYPE_FLOAT,
+            Type::TYPE_INT64,
+            Type::TYPE_UINT64,
+            Type::TYPE_INT32,
+            Type::TYPE_FIXED64,
+            Type::TYPE_FIXED32,
+            Type::TYPE_BOOL,
+            Type::TYPE_STRING,
+            Type::TYPE_GROUP,
+            Type::TYPE_MESSAGE,
+            Type::TYPE_BYTES,
+            Type::TYPE_UINT32,
+            Type::TYPE_ENUM,
+            Type::TYPE_SFIXED32,
+            Type::TYPE_SFIXED64,
+            Type::TYPE_SINT32,
+            Type::TYPE_SINT64,
+        ];
+    }
+
+    impl crate::EnumFull for Type {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("FieldDescriptorProto.Type").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = match self {
+                Type::TYPE_DOUBLE => 0,
+                Type::TYPE_FLOAT => 1,
+                Type::TYPE_INT64 => 2,
+                Type::TYPE_UINT64 => 3,
+                Type::TYPE_INT32 => 4,
+                Type::TYPE_FIXED64 => 5,
+                Type::TYPE_FIXED32 => 6,
+                Type::TYPE_BOOL => 7,
+                Type::TYPE_STRING => 8,
+                Type::TYPE_GROUP => 9,
+                Type::TYPE_MESSAGE => 10,
+                Type::TYPE_BYTES => 11,
+                Type::TYPE_UINT32 => 12,
+                Type::TYPE_ENUM => 13,
+                Type::TYPE_SFIXED32 => 14,
+                Type::TYPE_SFIXED64 => 15,
+                Type::TYPE_SINT32 => 16,
+                Type::TYPE_SINT64 => 17,
+            };
+            Self::enum_descriptor().value_by_index(index)
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [FieldDescriptorProto_Type] = &[
-            FieldDescriptorProto_Type::TYPE_DOUBLE,
-            FieldDescriptorProto_Type::TYPE_FLOAT,
-            FieldDescriptorProto_Type::TYPE_INT64,
-            FieldDescriptorProto_Type::TYPE_UINT64,
-            FieldDescriptorProto_Type::TYPE_INT32,
-            FieldDescriptorProto_Type::TYPE_FIXED64,
-            FieldDescriptorProto_Type::TYPE_FIXED32,
-            FieldDescriptorProto_Type::TYPE_BOOL,
-            FieldDescriptorProto_Type::TYPE_STRING,
-            FieldDescriptorProto_Type::TYPE_GROUP,
-            FieldDescriptorProto_Type::TYPE_MESSAGE,
-            FieldDescriptorProto_Type::TYPE_BYTES,
-            FieldDescriptorProto_Type::TYPE_UINT32,
-            FieldDescriptorProto_Type::TYPE_ENUM,
-            FieldDescriptorProto_Type::TYPE_SFIXED32,
-            FieldDescriptorProto_Type::TYPE_SFIXED64,
-            FieldDescriptorProto_Type::TYPE_SINT32,
-            FieldDescriptorProto_Type::TYPE_SINT64,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<FieldDescriptorProto_Type>("FieldDescriptorProto.Type", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for FieldDescriptorProto_Type {
-}
-
-// Note, `Default` is implemented although default value is not 0
-impl ::std::default::Default for FieldDescriptorProto_Type {
-    fn default() -> Self {
-        FieldDescriptorProto_Type::TYPE_DOUBLE
-    }
-}
-
-impl crate::reflect::ProtobufValue for FieldDescriptorProto_Type {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum FieldDescriptorProto_Label {
-    LABEL_OPTIONAL = 1,
-    LABEL_REQUIRED = 2,
-    LABEL_REPEATED = 3,
-}
-
-impl crate::ProtobufEnum for FieldDescriptorProto_Label {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<FieldDescriptorProto_Label> {
-        match value {
-            1 => ::std::option::Option::Some(FieldDescriptorProto_Label::LABEL_OPTIONAL),
-            2 => ::std::option::Option::Some(FieldDescriptorProto_Label::LABEL_REQUIRED),
-            3 => ::std::option::Option::Some(FieldDescriptorProto_Label::LABEL_REPEATED),
-            _ => ::std::option::Option::None
+    // Note, `Default` is implemented although default value is not 0
+    impl ::std::default::Default for Type {
+        fn default() -> Self {
+            Type::TYPE_DOUBLE
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [FieldDescriptorProto_Label] = &[
-            FieldDescriptorProto_Label::LABEL_OPTIONAL,
-            FieldDescriptorProto_Label::LABEL_REQUIRED,
-            FieldDescriptorProto_Label::LABEL_REPEATED,
+    impl Type {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<Type>("FieldDescriptorProto.Type")
+        }
+    }
+
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.FieldDescriptorProto.Label)
+    pub enum Label {
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Label.LABEL_OPTIONAL)
+        LABEL_OPTIONAL = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Label.LABEL_REQUIRED)
+        LABEL_REQUIRED = 2,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED)
+        LABEL_REPEATED = 3,
+    }
+
+    impl crate::Enum for Label {
+        const NAME: &'static str = "Label";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<Label> {
+            match value {
+                1 => ::std::option::Option::Some(Label::LABEL_OPTIONAL),
+                2 => ::std::option::Option::Some(Label::LABEL_REQUIRED),
+                3 => ::std::option::Option::Some(Label::LABEL_REPEATED),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [Label] = &[
+            Label::LABEL_OPTIONAL,
+            Label::LABEL_REQUIRED,
+            Label::LABEL_REPEATED,
         ];
-        values
     }
 
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<FieldDescriptorProto_Label>("FieldDescriptorProto.Label", file_descriptor_proto())
-        })
+    impl crate::EnumFull for Label {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("FieldDescriptorProto.Label").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = match self {
+                Label::LABEL_OPTIONAL => 0,
+                Label::LABEL_REQUIRED => 1,
+                Label::LABEL_REPEATED => 2,
+            };
+            Self::enum_descriptor().value_by_index(index)
+        }
+    }
+
+    // Note, `Default` is implemented although default value is not 0
+    impl ::std::default::Default for Label {
+        fn default() -> Self {
+            Label::LABEL_OPTIONAL
+        }
+    }
+
+    impl Label {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<Label>("FieldDescriptorProto.Label")
+        }
     }
 }
 
-impl ::std::marker::Copy for FieldDescriptorProto_Label {
-}
-
-// Note, `Default` is implemented although default value is not 0
-impl ::std::default::Default for FieldDescriptorProto_Label {
-    fn default() -> Self {
-        FieldDescriptorProto_Label::LABEL_OPTIONAL
-    }
-}
-
-impl crate::reflect::ProtobufValue for FieldDescriptorProto_Label {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a oneof.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.OneofDescriptorProto)
 pub struct OneofDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    pub options: crate::SingularPtrField<OneofOptions>,
+    // @@protoc_insertion_point(field:google.protobuf.OneofDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.OneofDescriptorProto.options)
+    pub options: crate::MessageField<OneofOptions>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.OneofDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a OneofDescriptorProto {
@@ -2937,15 +2381,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -2954,14 +2398,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -2971,41 +2415,30 @@
         self.name.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // optional .google.protobuf.OneofOptions options = 2;
-
-
-    pub fn get_options(&self) -> &OneofOptions {
-        self.options.as_ref().unwrap_or_else(|| <OneofOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: OneofOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut OneofOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> OneofOptions {
-        self.options.take().unwrap_or_else(|| OneofOptions::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &OneofDescriptorProto| { &m.name },
+            |m: &mut OneofDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, OneofOptions>(
+            "options",
+            |m: &OneofDescriptorProto| { &m.options },
+            |m: &mut OneofDescriptorProto| { &mut m.options },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<OneofDescriptorProto>(
+            "OneofDescriptorProto",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for OneofDescriptorProto {
+    const NAME: &'static str = "OneofDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.options {
             if !v.is_initialized() {
@@ -3015,18 +2448,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                2 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                18 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -3035,125 +2467,99 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> OneofDescriptorProto {
         OneofDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &OneofDescriptorProto| { &m.name },
-                |m: &mut OneofDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<OneofOptions>>(
-                "options",
-                |m: &OneofDescriptorProto| { &m.options },
-                |m: &mut OneofDescriptorProto| { &mut m.options },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<OneofDescriptorProto>(
-                "OneofDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.name = ::std::option::Option::None;
+        self.options.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static OneofDescriptorProto {
-        static instance: crate::rt::LazyV2<OneofDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(OneofDescriptorProto::new)
+        static instance: OneofDescriptorProto = OneofDescriptorProto {
+            name: ::std::option::Option::None,
+            options: crate::MessageField::none(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for OneofDescriptorProto {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.options.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for OneofDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("OneofDescriptorProto").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for OneofDescriptorProto {
+impl ::std::fmt::Display for OneofDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for OneofDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes an enum type.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.EnumDescriptorProto)
 pub struct EnumDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    pub value: crate::RepeatedField<EnumValueDescriptorProto>,
-    pub options: crate::SingularPtrField<EnumOptions>,
-    pub reserved_range: crate::RepeatedField<EnumDescriptorProto_EnumReservedRange>,
-    pub reserved_name: crate::RepeatedField<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.value)
+    pub value: ::std::vec::Vec<EnumValueDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.options)
+    pub options: crate::MessageField<EnumOptions>,
+    ///  Range of reserved numeric values. Reserved numeric values may not be used
+    ///  by enum values in the same enum declaration. Reserved ranges may not
+    ///  overlap.
+    // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.reserved_range)
+    pub reserved_range: ::std::vec::Vec<enum_descriptor_proto::EnumReservedRange>,
+    ///  Reserved enum value names, which may not be reused. A given name may only
+    ///  be reserved once.
+    // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.reserved_name)
+    pub reserved_name: ::std::vec::Vec<::std::string::String>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.EnumDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a EnumDescriptorProto {
@@ -3169,15 +2575,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -3186,14 +2592,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -3203,116 +2609,45 @@
         self.name.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
-
-
-    pub fn get_value(&self) -> &[EnumValueDescriptorProto] {
-        &self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: crate::RepeatedField<EnumValueDescriptorProto>) {
-        self.value = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_value(&mut self) -> &mut crate::RepeatedField<EnumValueDescriptorProto> {
-        &mut self.value
-    }
-
-    // Take field
-    pub fn take_value(&mut self) -> crate::RepeatedField<EnumValueDescriptorProto> {
-        ::std::mem::replace(&mut self.value, crate::RepeatedField::new())
-    }
-
-    // optional .google.protobuf.EnumOptions options = 3;
-
-
-    pub fn get_options(&self) -> &EnumOptions {
-        self.options.as_ref().unwrap_or_else(|| <EnumOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: EnumOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut EnumOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> EnumOptions {
-        self.options.take().unwrap_or_else(|| EnumOptions::new())
-    }
-
-    // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-
-
-    pub fn get_reserved_range(&self) -> &[EnumDescriptorProto_EnumReservedRange] {
-        &self.reserved_range
-    }
-    pub fn clear_reserved_range(&mut self) {
-        self.reserved_range.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_reserved_range(&mut self, v: crate::RepeatedField<EnumDescriptorProto_EnumReservedRange>) {
-        self.reserved_range = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_reserved_range(&mut self) -> &mut crate::RepeatedField<EnumDescriptorProto_EnumReservedRange> {
-        &mut self.reserved_range
-    }
-
-    // Take field
-    pub fn take_reserved_range(&mut self) -> crate::RepeatedField<EnumDescriptorProto_EnumReservedRange> {
-        ::std::mem::replace(&mut self.reserved_range, crate::RepeatedField::new())
-    }
-
-    // repeated string reserved_name = 5;
-
-
-    pub fn get_reserved_name(&self) -> &[::std::string::String] {
-        &self.reserved_name
-    }
-    pub fn clear_reserved_name(&mut self) {
-        self.reserved_name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_reserved_name(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.reserved_name = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_reserved_name(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.reserved_name
-    }
-
-    // Take field
-    pub fn take_reserved_name(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.reserved_name, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(5);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &EnumDescriptorProto| { &m.name },
+            |m: &mut EnumDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "value",
+            |m: &EnumDescriptorProto| { &m.value },
+            |m: &mut EnumDescriptorProto| { &mut m.value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, EnumOptions>(
+            "options",
+            |m: &EnumDescriptorProto| { &m.options },
+            |m: &mut EnumDescriptorProto| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "reserved_range",
+            |m: &EnumDescriptorProto| { &m.reserved_range },
+            |m: &mut EnumDescriptorProto| { &mut m.reserved_range },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "reserved_name",
+            |m: &EnumDescriptorProto| { &m.reserved_name },
+            |m: &mut EnumDescriptorProto| { &mut m.reserved_name },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<EnumDescriptorProto>(
+            "EnumDescriptorProto",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for EnumDescriptorProto {
+    const NAME: &'static str = "EnumDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.value {
             if !v.is_initialized() {
@@ -3332,27 +2667,26 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.value)?;
+                18 => {
+                    self.value.push(is.read_message()?);
                 },
-                3 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                26 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
                 },
-                4 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.reserved_range)?;
+                34 => {
+                    self.reserved_range.push(is.read_message()?);
                 },
-                5 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.reserved_name)?;
+                42 => {
+                    self.reserved_name.push(is.read_string()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -3361,363 +2695,303 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
         for value in &self.value {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
         for value in &self.reserved_range {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.reserved_name {
             my_size += crate::rt::string_size(5, &value);
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
         for v in &self.value {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
         };
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
         }
         for v in &self.reserved_range {
-            os.write_tag(4, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(4, v, os)?;
         };
         for v in &self.reserved_name {
             os.write_string(5, &v)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> EnumDescriptorProto {
         EnumDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &EnumDescriptorProto| { &m.name },
-                |m: &mut EnumDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumValueDescriptorProto>>(
-                "value",
-                |m: &EnumDescriptorProto| { &m.value },
-                |m: &mut EnumDescriptorProto| { &mut m.value },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumOptions>>(
-                "options",
-                |m: &EnumDescriptorProto| { &m.options },
-                |m: &mut EnumDescriptorProto| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumDescriptorProto_EnumReservedRange>>(
-                "reserved_range",
-                |m: &EnumDescriptorProto| { &m.reserved_range },
-                |m: &mut EnumDescriptorProto| { &mut m.reserved_range },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "reserved_name",
-                |m: &EnumDescriptorProto| { &m.reserved_name },
-                |m: &mut EnumDescriptorProto| { &mut m.reserved_name },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<EnumDescriptorProto>(
-                "EnumDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static EnumDescriptorProto {
-        static instance: crate::rt::LazyV2<EnumDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(EnumDescriptorProto::new)
-    }
-}
-
-impl crate::Clear for EnumDescriptorProto {
     fn clear(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
         self.value.clear();
         self.options.clear();
         self.reserved_range.clear();
         self.reserved_name.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static EnumDescriptorProto {
+        static instance: EnumDescriptorProto = EnumDescriptorProto {
+            name: ::std::option::Option::None,
+            value: ::std::vec::Vec::new(),
+            options: crate::MessageField::none(),
+            reserved_range: ::std::vec::Vec::new(),
+            reserved_name: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for EnumDescriptorProto {
+impl crate::MessageFull for EnumDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("EnumDescriptorProto").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for EnumDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for EnumDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct EnumDescriptorProto_EnumReservedRange {
-    // message fields
-    start: ::std::option::Option<i32>,
-    end: ::std::option::Option<i32>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a EnumDescriptorProto_EnumReservedRange {
-    fn default() -> &'a EnumDescriptorProto_EnumReservedRange {
-        <EnumDescriptorProto_EnumReservedRange as crate::Message>::default_instance()
-    }
-}
-
-impl EnumDescriptorProto_EnumReservedRange {
-    pub fn new() -> EnumDescriptorProto_EnumReservedRange {
-        ::std::default::Default::default()
+/// Nested message and enums of message `EnumDescriptorProto`
+pub mod enum_descriptor_proto {
+    ///  Range of reserved numeric values. Reserved values may not be used by
+    ///  entries in the same enum. Reserved ranges may not overlap.
+    ///
+    ///  Note that this is distinct from DescriptorProto.ReservedRange in that it
+    ///  is inclusive such that it can appropriately represent the entire int32
+    ///  domain.
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.EnumDescriptorProto.EnumReservedRange)
+    pub struct EnumReservedRange {
+        // message fields
+        // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.EnumReservedRange.start)
+        pub start: ::std::option::Option<i32>,
+        // @@protoc_insertion_point(field:google.protobuf.EnumDescriptorProto.EnumReservedRange.end)
+        pub end: ::std::option::Option<i32>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.EnumDescriptorProto.EnumReservedRange.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    // optional int32 start = 1;
-
-
-    pub fn get_start(&self) -> i32 {
-        self.start.unwrap_or(0)
-    }
-    pub fn clear_start(&mut self) {
-        self.start = ::std::option::Option::None;
-    }
-
-    pub fn has_start(&self) -> bool {
-        self.start.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_start(&mut self, v: i32) {
-        self.start = ::std::option::Option::Some(v);
-    }
-
-    // optional int32 end = 2;
-
-
-    pub fn get_end(&self) -> i32 {
-        self.end.unwrap_or(0)
-    }
-    pub fn clear_end(&mut self) {
-        self.end = ::std::option::Option::None;
-    }
-
-    pub fn has_end(&self) -> bool {
-        self.end.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_end(&mut self, v: i32) {
-        self.end = ::std::option::Option::Some(v);
-    }
-}
-
-impl crate::Message for EnumDescriptorProto_EnumReservedRange {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.start = ::std::option::Option::Some(tmp);
-                },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.end = ::std::option::Option::Some(tmp);
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
+    impl<'a> ::std::default::Default for &'a EnumReservedRange {
+        fn default() -> &'a EnumReservedRange {
+            <EnumReservedRange as crate::Message>::default_instance()
         }
-        ::std::result::Result::Ok(())
     }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let Some(v) = self.start {
-            my_size += crate::rt::value_size(1, v, crate::wire_format::WireTypeVarint);
+    impl EnumReservedRange {
+        pub fn new() -> EnumReservedRange {
+            ::std::default::Default::default()
         }
-        if let Some(v) = self.end {
-            my_size += crate::rt::value_size(2, v, crate::wire_format::WireTypeVarint);
+
+        // optional int32 start = 1;
+
+        pub fn start(&self) -> i32 {
+            self.start.unwrap_or(0)
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(v) = self.start {
-            os.write_int32(1, v)?;
+        pub fn clear_start(&mut self) {
+            self.start = ::std::option::Option::None;
         }
-        if let Some(v) = self.end {
-            os.write_int32(2, v)?;
+
+        pub fn has_start(&self) -> bool {
+            self.start.is_some()
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
+        // Param is passed by value, moved
+        pub fn set_start(&mut self, v: i32) {
+            self.start = ::std::option::Option::Some(v);
+        }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
+        // optional int32 end = 2;
 
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
+        pub fn end(&self) -> i32 {
+            self.end.unwrap_or(0)
+        }
 
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
+        pub fn clear_end(&mut self) {
+            self.end = ::std::option::Option::None;
+        }
 
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
+        pub fn has_end(&self) -> bool {
+            self.end.is_some()
+        }
 
-    fn new() -> EnumDescriptorProto_EnumReservedRange {
-        EnumDescriptorProto_EnumReservedRange::new()
-    }
+        // Param is passed by value, moved
+        pub fn set_end(&mut self, v: i32) {
+            self.end = ::std::option::Option::Some(v);
+        }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(2);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "start",
-                |m: &EnumDescriptorProto_EnumReservedRange| { &m.start },
-                |m: &mut EnumDescriptorProto_EnumReservedRange| { &mut m.start },
+                |m: &EnumReservedRange| { &m.start },
+                |m: &mut EnumReservedRange| { &mut m.start },
             ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "end",
-                |m: &EnumDescriptorProto_EnumReservedRange| { &m.end },
-                |m: &mut EnumDescriptorProto_EnumReservedRange| { &mut m.end },
+                |m: &EnumReservedRange| { &m.end },
+                |m: &mut EnumReservedRange| { &mut m.end },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<EnumDescriptorProto_EnumReservedRange>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<EnumReservedRange>(
                 "EnumDescriptorProto.EnumReservedRange",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
+        }
     }
 
-    fn default_instance() -> &'static EnumDescriptorProto_EnumReservedRange {
-        static instance: crate::rt::LazyV2<EnumDescriptorProto_EnumReservedRange> = crate::rt::LazyV2::INIT;
-        instance.get(EnumDescriptorProto_EnumReservedRange::new)
+    impl crate::Message for EnumReservedRange {
+        const NAME: &'static str = "EnumReservedRange";
+
+        fn is_initialized(&self) -> bool {
+            true
+        }
+
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    8 => {
+                        self.start = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    16 => {
+                        self.end = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            if let Some(v) = self.start {
+                my_size += crate::rt::int32_size(1, v);
+            }
+            if let Some(v) = self.end {
+                my_size += crate::rt::int32_size(2, v);
+            }
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            if let Some(v) = self.start {
+                os.write_int32(1, v)?;
+            }
+            if let Some(v) = self.end {
+                os.write_int32(2, v)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> EnumReservedRange {
+            EnumReservedRange::new()
+        }
+
+        fn clear(&mut self) {
+            self.start = ::std::option::Option::None;
+            self.end = ::std::option::Option::None;
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static EnumReservedRange {
+            static instance: EnumReservedRange = EnumReservedRange {
+                start: ::std::option::Option::None,
+                end: ::std::option::Option::None,
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
+    }
+
+    impl crate::MessageFull for EnumReservedRange {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("EnumDescriptorProto.EnumReservedRange").unwrap()).clone()
+        }
+    }
+
+    impl ::std::fmt::Display for EnumReservedRange {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
+    }
+
+    impl crate::reflect::ProtobufValue for EnumReservedRange {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
     }
 }
 
-impl crate::Clear for EnumDescriptorProto_EnumReservedRange {
-    fn clear(&mut self) {
-        self.start = ::std::option::Option::None;
-        self.end = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for EnumDescriptorProto_EnumReservedRange {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for EnumDescriptorProto_EnumReservedRange {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a value within an enum.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.EnumValueDescriptorProto)
 pub struct EnumValueDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    number: ::std::option::Option<i32>,
-    pub options: crate::SingularPtrField<EnumValueOptions>,
+    // @@protoc_insertion_point(field:google.protobuf.EnumValueDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.EnumValueDescriptorProto.number)
+    pub number: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:google.protobuf.EnumValueDescriptorProto.options)
+    pub options: crate::MessageField<EnumValueOptions>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.EnumValueDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a EnumValueDescriptorProto {
@@ -3733,15 +3007,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -3750,14 +3024,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -3769,10 +3043,10 @@
 
     // optional int32 number = 2;
 
-
-    pub fn get_number(&self) -> i32 {
+    pub fn number(&self) -> i32 {
         self.number.unwrap_or(0)
     }
+
     pub fn clear_number(&mut self) {
         self.number = ::std::option::Option::None;
     }
@@ -3786,41 +3060,35 @@
         self.number = ::std::option::Option::Some(v);
     }
 
-    // optional .google.protobuf.EnumValueOptions options = 3;
-
-
-    pub fn get_options(&self) -> &EnumValueOptions {
-        self.options.as_ref().unwrap_or_else(|| <EnumValueOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: EnumValueOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut EnumValueOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> EnumValueOptions {
-        self.options.take().unwrap_or_else(|| EnumValueOptions::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(3);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &EnumValueDescriptorProto| { &m.name },
+            |m: &mut EnumValueDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "number",
+            |m: &EnumValueDescriptorProto| { &m.number },
+            |m: &mut EnumValueDescriptorProto| { &mut m.number },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, EnumValueOptions>(
+            "options",
+            |m: &EnumValueDescriptorProto| { &m.options },
+            |m: &mut EnumValueDescriptorProto| { &mut m.options },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<EnumValueDescriptorProto>(
+            "EnumValueDescriptorProto",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for EnumValueDescriptorProto {
+    const NAME: &'static str = "EnumValueDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.options {
             if !v.is_initialized() {
@@ -3830,25 +3098,20 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.number = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.number = ::std::option::Option::Some(is.read_int32()?);
                 },
-                3 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                26 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -3857,135 +3120,98 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
         if let Some(v) = self.number {
-            my_size += crate::rt::value_size(2, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(2, v);
         }
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
         if let Some(v) = self.number {
             os.write_int32(2, v)?;
         }
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> EnumValueDescriptorProto {
         EnumValueDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &EnumValueDescriptorProto| { &m.name },
-                |m: &mut EnumValueDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "number",
-                |m: &EnumValueDescriptorProto| { &m.number },
-                |m: &mut EnumValueDescriptorProto| { &mut m.number },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumValueOptions>>(
-                "options",
-                |m: &EnumValueDescriptorProto| { &m.options },
-                |m: &mut EnumValueDescriptorProto| { &mut m.options },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<EnumValueDescriptorProto>(
-                "EnumValueDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.name = ::std::option::Option::None;
+        self.number = ::std::option::Option::None;
+        self.options.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static EnumValueDescriptorProto {
-        static instance: crate::rt::LazyV2<EnumValueDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(EnumValueDescriptorProto::new)
+        static instance: EnumValueDescriptorProto = EnumValueDescriptorProto {
+            name: ::std::option::Option::None,
+            number: ::std::option::Option::None,
+            options: crate::MessageField::none(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for EnumValueDescriptorProto {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.number = ::std::option::Option::None;
-        self.options.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for EnumValueDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("EnumValueDescriptorProto").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for EnumValueDescriptorProto {
+impl ::std::fmt::Display for EnumValueDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for EnumValueDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a service.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.ServiceDescriptorProto)
 pub struct ServiceDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    pub method: crate::RepeatedField<MethodDescriptorProto>,
-    pub options: crate::SingularPtrField<ServiceOptions>,
+    // @@protoc_insertion_point(field:google.protobuf.ServiceDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.ServiceDescriptorProto.method)
+    pub method: ::std::vec::Vec<MethodDescriptorProto>,
+    // @@protoc_insertion_point(field:google.protobuf.ServiceDescriptorProto.options)
+    pub options: crate::MessageField<ServiceOptions>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.ServiceDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a ServiceDescriptorProto {
@@ -4001,15 +3227,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -4018,14 +3244,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -4035,66 +3261,35 @@
         self.name.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // repeated .google.protobuf.MethodDescriptorProto method = 2;
-
-
-    pub fn get_method(&self) -> &[MethodDescriptorProto] {
-        &self.method
-    }
-    pub fn clear_method(&mut self) {
-        self.method.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_method(&mut self, v: crate::RepeatedField<MethodDescriptorProto>) {
-        self.method = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_method(&mut self) -> &mut crate::RepeatedField<MethodDescriptorProto> {
-        &mut self.method
-    }
-
-    // Take field
-    pub fn take_method(&mut self) -> crate::RepeatedField<MethodDescriptorProto> {
-        ::std::mem::replace(&mut self.method, crate::RepeatedField::new())
-    }
-
-    // optional .google.protobuf.ServiceOptions options = 3;
-
-
-    pub fn get_options(&self) -> &ServiceOptions {
-        self.options.as_ref().unwrap_or_else(|| <ServiceOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: ServiceOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut ServiceOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> ServiceOptions {
-        self.options.take().unwrap_or_else(|| ServiceOptions::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(3);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &ServiceDescriptorProto| { &m.name },
+            |m: &mut ServiceDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "method",
+            |m: &ServiceDescriptorProto| { &m.method },
+            |m: &mut ServiceDescriptorProto| { &mut m.method },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, ServiceOptions>(
+            "options",
+            |m: &ServiceDescriptorProto| { &m.options },
+            |m: &mut ServiceDescriptorProto| { &mut m.options },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<ServiceDescriptorProto>(
+            "ServiceDescriptorProto",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for ServiceDescriptorProto {
+    const NAME: &'static str = "ServiceDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.method {
             if !v.is_initialized() {
@@ -4109,21 +3304,20 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.method)?;
+                18 => {
+                    self.method.push(is.read_message()?);
                 },
-                3 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                26 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -4132,141 +3326,109 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
         for value in &self.method {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
         for v in &self.method {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
         };
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> ServiceDescriptorProto {
         ServiceDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &ServiceDescriptorProto| { &m.name },
-                |m: &mut ServiceDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<MethodDescriptorProto>>(
-                "method",
-                |m: &ServiceDescriptorProto| { &m.method },
-                |m: &mut ServiceDescriptorProto| { &mut m.method },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<ServiceOptions>>(
-                "options",
-                |m: &ServiceDescriptorProto| { &m.options },
-                |m: &mut ServiceDescriptorProto| { &mut m.options },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<ServiceDescriptorProto>(
-                "ServiceDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.name = ::std::option::Option::None;
+        self.method.clear();
+        self.options.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static ServiceDescriptorProto {
-        static instance: crate::rt::LazyV2<ServiceDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(ServiceDescriptorProto::new)
+        static instance: ServiceDescriptorProto = ServiceDescriptorProto {
+            name: ::std::option::Option::None,
+            method: ::std::vec::Vec::new(),
+            options: crate::MessageField::none(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for ServiceDescriptorProto {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.method.clear();
-        self.options.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for ServiceDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("ServiceDescriptorProto").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for ServiceDescriptorProto {
+impl ::std::fmt::Display for ServiceDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for ServiceDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Describes a method of a service.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.MethodDescriptorProto)
 pub struct MethodDescriptorProto {
     // message fields
-    name: crate::SingularField<::std::string::String>,
-    input_type: crate::SingularField<::std::string::String>,
-    output_type: crate::SingularField<::std::string::String>,
-    pub options: crate::SingularPtrField<MethodOptions>,
-    client_streaming: ::std::option::Option<bool>,
-    server_streaming: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.MethodDescriptorProto.name)
+    pub name: ::std::option::Option<::std::string::String>,
+    ///  Input and output type names.  These are resolved in the same way as
+    ///  FieldDescriptorProto.type_name, but must refer to a message type.
+    // @@protoc_insertion_point(field:google.protobuf.MethodDescriptorProto.input_type)
+    pub input_type: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.MethodDescriptorProto.output_type)
+    pub output_type: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.MethodDescriptorProto.options)
+    pub options: crate::MessageField<MethodOptions>,
+    ///  Identifies if client streams multiple client messages
+    // @@protoc_insertion_point(field:google.protobuf.MethodDescriptorProto.client_streaming)
+    pub client_streaming: ::std::option::Option<bool>,
+    ///  Identifies if server streams multiple server messages
+    // @@protoc_insertion_point(field:google.protobuf.MethodDescriptorProto.server_streaming)
+    pub server_streaming: ::std::option::Option<bool>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.MethodDescriptorProto.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a MethodDescriptorProto {
@@ -4282,15 +3444,15 @@
 
     // optional string name = 1;
 
-
-    pub fn get_name(&self) -> &str {
+    pub fn name(&self) -> &str {
         match self.name.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_name(&mut self) {
-        self.name.clear();
+        self.name = ::std::option::Option::None;
     }
 
     pub fn has_name(&self) -> bool {
@@ -4299,14 +3461,14 @@
 
     // Param is passed by value, moved
     pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
+        self.name = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_name(&mut self) -> &mut ::std::string::String {
         if self.name.is_none() {
-            self.name.set_default();
+            self.name = ::std::option::Option::Some(::std::string::String::new());
         }
         self.name.as_mut().unwrap()
     }
@@ -4318,15 +3480,15 @@
 
     // optional string input_type = 2;
 
-
-    pub fn get_input_type(&self) -> &str {
+    pub fn input_type(&self) -> &str {
         match self.input_type.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_input_type(&mut self) {
-        self.input_type.clear();
+        self.input_type = ::std::option::Option::None;
     }
 
     pub fn has_input_type(&self) -> bool {
@@ -4335,14 +3497,14 @@
 
     // Param is passed by value, moved
     pub fn set_input_type(&mut self, v: ::std::string::String) {
-        self.input_type = crate::SingularField::some(v);
+        self.input_type = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_input_type(&mut self) -> &mut ::std::string::String {
         if self.input_type.is_none() {
-            self.input_type.set_default();
+            self.input_type = ::std::option::Option::Some(::std::string::String::new());
         }
         self.input_type.as_mut().unwrap()
     }
@@ -4354,15 +3516,15 @@
 
     // optional string output_type = 3;
 
-
-    pub fn get_output_type(&self) -> &str {
+    pub fn output_type(&self) -> &str {
         match self.output_type.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_output_type(&mut self) {
-        self.output_type.clear();
+        self.output_type = ::std::option::Option::None;
     }
 
     pub fn has_output_type(&self) -> bool {
@@ -4371,14 +3533,14 @@
 
     // Param is passed by value, moved
     pub fn set_output_type(&mut self, v: ::std::string::String) {
-        self.output_type = crate::SingularField::some(v);
+        self.output_type = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_output_type(&mut self) -> &mut ::std::string::String {
         if self.output_type.is_none() {
-            self.output_type.set_default();
+            self.output_type = ::std::option::Option::Some(::std::string::String::new());
         }
         self.output_type.as_mut().unwrap()
     }
@@ -4388,45 +3550,12 @@
         self.output_type.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // optional .google.protobuf.MethodOptions options = 4;
-
-
-    pub fn get_options(&self) -> &MethodOptions {
-        self.options.as_ref().unwrap_or_else(|| <MethodOptions as crate::Message>::default_instance())
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    pub fn has_options(&self) -> bool {
-        self.options.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: MethodOptions) {
-        self.options = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_options(&mut self) -> &mut MethodOptions {
-        if self.options.is_none() {
-            self.options.set_default();
-        }
-        self.options.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> MethodOptions {
-        self.options.take().unwrap_or_else(|| MethodOptions::new())
-    }
-
     // optional bool client_streaming = 5;
 
-
-    pub fn get_client_streaming(&self) -> bool {
+    pub fn client_streaming(&self) -> bool {
         self.client_streaming.unwrap_or(false)
     }
+
     pub fn clear_client_streaming(&mut self) {
         self.client_streaming = ::std::option::Option::None;
     }
@@ -4442,10 +3571,10 @@
 
     // optional bool server_streaming = 6;
 
-
-    pub fn get_server_streaming(&self) -> bool {
+    pub fn server_streaming(&self) -> bool {
         self.server_streaming.unwrap_or(false)
     }
+
     pub fn clear_server_streaming(&mut self) {
         self.server_streaming = ::std::option::Option::None;
     }
@@ -4458,9 +3587,51 @@
     pub fn set_server_streaming(&mut self, v: bool) {
         self.server_streaming = ::std::option::Option::Some(v);
     }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(6);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "name",
+            |m: &MethodDescriptorProto| { &m.name },
+            |m: &mut MethodDescriptorProto| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "input_type",
+            |m: &MethodDescriptorProto| { &m.input_type },
+            |m: &mut MethodDescriptorProto| { &mut m.input_type },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "output_type",
+            |m: &MethodDescriptorProto| { &m.output_type },
+            |m: &mut MethodDescriptorProto| { &mut m.output_type },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, MethodOptions>(
+            "options",
+            |m: &MethodDescriptorProto| { &m.options },
+            |m: &mut MethodDescriptorProto| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "client_streaming",
+            |m: &MethodDescriptorProto| { &m.client_streaming },
+            |m: &mut MethodDescriptorProto| { &mut m.client_streaming },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "server_streaming",
+            |m: &MethodDescriptorProto| { &m.server_streaming },
+            |m: &mut MethodDescriptorProto| { &mut m.server_streaming },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<MethodDescriptorProto>(
+            "MethodDescriptorProto",
+            fields,
+            oneofs,
+        )
+    }
 }
 
 impl crate::Message for MethodDescriptorProto {
+    const NAME: &'static str = "MethodDescriptorProto";
+
     fn is_initialized(&self) -> bool {
         for v in &self.options {
             if !v.is_initialized() {
@@ -4470,38 +3641,29 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = ::std::option::Option::Some(is.read_string()?);
                 },
-                2 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.input_type)?;
+                18 => {
+                    self.input_type = ::std::option::Option::Some(is.read_string()?);
                 },
-                3 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.output_type)?;
+                26 => {
+                    self.output_type = ::std::option::Option::Some(is.read_string()?);
                 },
-                4 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.options)?;
+                34 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.options)?;
                 },
-                5 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.client_streaming = ::std::option::Option::Some(tmp);
+                40 => {
+                    self.client_streaming = ::std::option::Option::Some(is.read_bool()?);
                 },
-                6 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.server_streaming = ::std::option::Option::Some(tmp);
+                48 => {
+                    self.server_streaming = ::std::option::Option::Some(is.read_bool()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -4510,46 +3672,44 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
+        if let Some(v) = self.name.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
-        if let Some(ref v) = self.input_type.as_ref() {
+        if let Some(v) = self.input_type.as_ref() {
             my_size += crate::rt::string_size(2, &v);
         }
-        if let Some(ref v) = self.output_type.as_ref() {
+        if let Some(v) = self.output_type.as_ref() {
             my_size += crate::rt::string_size(3, &v);
         }
-        if let Some(ref v) = self.options.as_ref() {
+        if let Some(v) = self.options.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
         if let Some(v) = self.client_streaming {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.server_streaming {
-            my_size += 2;
+            my_size += 1 + 1;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.name.as_ref() {
+            os.write_string(1, v)?;
         }
-        if let Some(ref v) = self.input_type.as_ref() {
-            os.write_string(2, &v)?;
+        if let Some(v) = self.input_type.as_ref() {
+            os.write_string(2, v)?;
         }
-        if let Some(ref v) = self.output_type.as_ref() {
-            os.write_string(3, &v)?;
+        if let Some(v) = self.output_type.as_ref() {
+            os.write_string(3, v)?;
         }
-        if let Some(ref v) = self.options.as_ref() {
-            os.write_tag(4, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.options.as_ref() {
+            crate::rt::write_message_field_with_cached_size(4, v, os)?;
         }
         if let Some(v) = self.client_streaming {
             os.write_bool(5, v)?;
@@ -4557,142 +3717,175 @@
         if let Some(v) = self.server_streaming {
             os.write_bool(6, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> MethodDescriptorProto {
         MethodDescriptorProto::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &MethodDescriptorProto| { &m.name },
-                |m: &mut MethodDescriptorProto| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "input_type",
-                |m: &MethodDescriptorProto| { &m.input_type },
-                |m: &mut MethodDescriptorProto| { &mut m.input_type },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "output_type",
-                |m: &MethodDescriptorProto| { &m.output_type },
-                |m: &mut MethodDescriptorProto| { &mut m.output_type },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<MethodOptions>>(
-                "options",
-                |m: &MethodDescriptorProto| { &m.options },
-                |m: &mut MethodDescriptorProto| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "client_streaming",
-                |m: &MethodDescriptorProto| { &m.client_streaming },
-                |m: &mut MethodDescriptorProto| { &mut m.client_streaming },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "server_streaming",
-                |m: &MethodDescriptorProto| { &m.server_streaming },
-                |m: &mut MethodDescriptorProto| { &mut m.server_streaming },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<MethodDescriptorProto>(
-                "MethodDescriptorProto",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static MethodDescriptorProto {
-        static instance: crate::rt::LazyV2<MethodDescriptorProto> = crate::rt::LazyV2::INIT;
-        instance.get(MethodDescriptorProto::new)
-    }
-}
-
-impl crate::Clear for MethodDescriptorProto {
     fn clear(&mut self) {
-        self.name.clear();
-        self.input_type.clear();
-        self.output_type.clear();
+        self.name = ::std::option::Option::None;
+        self.input_type = ::std::option::Option::None;
+        self.output_type = ::std::option::Option::None;
         self.options.clear();
         self.client_streaming = ::std::option::Option::None;
         self.server_streaming = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static MethodDescriptorProto {
+        static instance: MethodDescriptorProto = MethodDescriptorProto {
+            name: ::std::option::Option::None,
+            input_type: ::std::option::Option::None,
+            output_type: ::std::option::Option::None,
+            options: crate::MessageField::none(),
+            client_streaming: ::std::option::Option::None,
+            server_streaming: ::std::option::Option::None,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for MethodDescriptorProto {
+impl crate::MessageFull for MethodDescriptorProto {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("MethodDescriptorProto").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for MethodDescriptorProto {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for MethodDescriptorProto {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FileOptions)
 pub struct FileOptions {
     // message fields
-    java_package: crate::SingularField<::std::string::String>,
-    java_outer_classname: crate::SingularField<::std::string::String>,
-    java_multiple_files: ::std::option::Option<bool>,
-    java_generate_equals_and_hash: ::std::option::Option<bool>,
-    java_string_check_utf8: ::std::option::Option<bool>,
-    optimize_for: ::std::option::Option<FileOptions_OptimizeMode>,
-    go_package: crate::SingularField<::std::string::String>,
-    cc_generic_services: ::std::option::Option<bool>,
-    java_generic_services: ::std::option::Option<bool>,
-    py_generic_services: ::std::option::Option<bool>,
-    php_generic_services: ::std::option::Option<bool>,
-    deprecated: ::std::option::Option<bool>,
-    cc_enable_arenas: ::std::option::Option<bool>,
-    objc_class_prefix: crate::SingularField<::std::string::String>,
-    csharp_namespace: crate::SingularField<::std::string::String>,
-    swift_prefix: crate::SingularField<::std::string::String>,
-    php_class_prefix: crate::SingularField<::std::string::String>,
-    php_namespace: crate::SingularField<::std::string::String>,
-    php_metadata_namespace: crate::SingularField<::std::string::String>,
-    ruby_package: crate::SingularField<::std::string::String>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.java_package)
+    pub java_package: ::std::option::Option<::std::string::String>,
+    ///  Controls the name of the wrapper Java class generated for the .proto file.
+    ///  That class will always contain the .proto file's getDescriptor() method as
+    ///  well as any top-level extensions defined in the .proto file.
+    ///  If java_multiple_files is disabled, then all the other classes from the
+    ///  .proto file will be nested inside the single wrapper outer class.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.java_outer_classname)
+    pub java_outer_classname: ::std::option::Option<::std::string::String>,
+    ///  If enabled, 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 wrapper class
+    ///  named by java_outer_classname.  However, the wrapper class will still be
+    ///  generated to contain the file's getDescriptor() method as well as any
+    ///  top-level extensions defined in the file.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.java_multiple_files)
+    pub java_multiple_files: ::std::option::Option<bool>,
+    ///  This option does nothing.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.java_generate_equals_and_hash)
+    pub java_generate_equals_and_hash: ::std::option::Option<bool>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.java_string_check_utf8)
+    pub java_string_check_utf8: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.optimize_for)
+    pub optimize_for: ::std::option::Option<crate::EnumOrUnknown<file_options::OptimizeMode>>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.go_package)
+    pub go_package: ::std::option::Option<::std::string::String>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.cc_generic_services)
+    pub cc_generic_services: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.java_generic_services)
+    pub java_generic_services: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.py_generic_services)
+    pub py_generic_services: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.php_generic_services)
+    pub php_generic_services: ::std::option::Option<bool>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    ///  Enables the use of arenas for the proto messages in this file. This applies
+    ///  only to generated classes for C++.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.cc_enable_arenas)
+    pub cc_enable_arenas: ::std::option::Option<bool>,
+    ///  Sets the objective c class prefix which is prepended to all objective c
+    ///  generated classes from this .proto. There is no default.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.objc_class_prefix)
+    pub objc_class_prefix: ::std::option::Option<::std::string::String>,
+    ///  Namespace for generated classes; defaults to the package.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.csharp_namespace)
+    pub csharp_namespace: ::std::option::Option<::std::string::String>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.swift_prefix)
+    pub swift_prefix: ::std::option::Option<::std::string::String>,
+    ///  Sets the php class prefix which is prepended to all php generated classes
+    ///  from this .proto. Default is empty.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.php_class_prefix)
+    pub php_class_prefix: ::std::option::Option<::std::string::String>,
+    ///  Use this option to change the namespace of php generated classes. Default
+    ///  is empty. When this option is empty, the package name will be used for
+    ///  determining the namespace.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.php_namespace)
+    pub php_namespace: ::std::option::Option<::std::string::String>,
+    ///  Use this option to change the namespace of php generated metadata classes.
+    ///  Default is empty. When this option is empty, the proto file name will be
+    ///  used for determining the namespace.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.php_metadata_namespace)
+    pub php_metadata_namespace: ::std::option::Option<::std::string::String>,
+    ///  Use this option to change the package of ruby generated classes. Default
+    ///  is empty. When this option is not set, the package name will be used for
+    ///  determining the ruby package.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.ruby_package)
+    pub ruby_package: ::std::option::Option<::std::string::String>,
+    ///  The parser stores options it doesn't recognize here.
+    ///  See the documentation for the "Options" section above.
+    // @@protoc_insertion_point(field:google.protobuf.FileOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FileOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FileOptions {
@@ -4708,15 +3901,15 @@
 
     // optional string java_package = 1;
 
-
-    pub fn get_java_package(&self) -> &str {
+    pub fn java_package(&self) -> &str {
         match self.java_package.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_java_package(&mut self) {
-        self.java_package.clear();
+        self.java_package = ::std::option::Option::None;
     }
 
     pub fn has_java_package(&self) -> bool {
@@ -4725,14 +3918,14 @@
 
     // Param is passed by value, moved
     pub fn set_java_package(&mut self, v: ::std::string::String) {
-        self.java_package = crate::SingularField::some(v);
+        self.java_package = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_java_package(&mut self) -> &mut ::std::string::String {
         if self.java_package.is_none() {
-            self.java_package.set_default();
+            self.java_package = ::std::option::Option::Some(::std::string::String::new());
         }
         self.java_package.as_mut().unwrap()
     }
@@ -4744,15 +3937,15 @@
 
     // optional string java_outer_classname = 8;
 
-
-    pub fn get_java_outer_classname(&self) -> &str {
+    pub fn java_outer_classname(&self) -> &str {
         match self.java_outer_classname.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_java_outer_classname(&mut self) {
-        self.java_outer_classname.clear();
+        self.java_outer_classname = ::std::option::Option::None;
     }
 
     pub fn has_java_outer_classname(&self) -> bool {
@@ -4761,14 +3954,14 @@
 
     // Param is passed by value, moved
     pub fn set_java_outer_classname(&mut self, v: ::std::string::String) {
-        self.java_outer_classname = crate::SingularField::some(v);
+        self.java_outer_classname = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_java_outer_classname(&mut self) -> &mut ::std::string::String {
         if self.java_outer_classname.is_none() {
-            self.java_outer_classname.set_default();
+            self.java_outer_classname = ::std::option::Option::Some(::std::string::String::new());
         }
         self.java_outer_classname.as_mut().unwrap()
     }
@@ -4780,10 +3973,10 @@
 
     // optional bool java_multiple_files = 10;
 
-
-    pub fn get_java_multiple_files(&self) -> bool {
+    pub fn java_multiple_files(&self) -> bool {
         self.java_multiple_files.unwrap_or(false)
     }
+
     pub fn clear_java_multiple_files(&mut self) {
         self.java_multiple_files = ::std::option::Option::None;
     }
@@ -4799,10 +3992,10 @@
 
     // optional bool java_generate_equals_and_hash = 20;
 
-
-    pub fn get_java_generate_equals_and_hash(&self) -> bool {
+    pub fn java_generate_equals_and_hash(&self) -> bool {
         self.java_generate_equals_and_hash.unwrap_or(false)
     }
+
     pub fn clear_java_generate_equals_and_hash(&mut self) {
         self.java_generate_equals_and_hash = ::std::option::Option::None;
     }
@@ -4818,10 +4011,10 @@
 
     // optional bool java_string_check_utf8 = 27;
 
-
-    pub fn get_java_string_check_utf8(&self) -> bool {
+    pub fn java_string_check_utf8(&self) -> bool {
         self.java_string_check_utf8.unwrap_or(false)
     }
+
     pub fn clear_java_string_check_utf8(&mut self) {
         self.java_string_check_utf8 = ::std::option::Option::None;
     }
@@ -4837,10 +4030,13 @@
 
     // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9;
 
-
-    pub fn get_optimize_for(&self) -> FileOptions_OptimizeMode {
-        self.optimize_for.unwrap_or(FileOptions_OptimizeMode::SPEED)
+    pub fn optimize_for(&self) -> file_options::OptimizeMode {
+        match self.optimize_for {
+            Some(e) => e.enum_value_or(file_options::OptimizeMode::SPEED),
+            None => file_options::OptimizeMode::SPEED,
+        }
     }
+
     pub fn clear_optimize_for(&mut self) {
         self.optimize_for = ::std::option::Option::None;
     }
@@ -4850,21 +4046,21 @@
     }
 
     // Param is passed by value, moved
-    pub fn set_optimize_for(&mut self, v: FileOptions_OptimizeMode) {
-        self.optimize_for = ::std::option::Option::Some(v);
+    pub fn set_optimize_for(&mut self, v: file_options::OptimizeMode) {
+        self.optimize_for = ::std::option::Option::Some(crate::EnumOrUnknown::new(v));
     }
 
     // optional string go_package = 11;
 
-
-    pub fn get_go_package(&self) -> &str {
+    pub fn go_package(&self) -> &str {
         match self.go_package.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_go_package(&mut self) {
-        self.go_package.clear();
+        self.go_package = ::std::option::Option::None;
     }
 
     pub fn has_go_package(&self) -> bool {
@@ -4873,14 +4069,14 @@
 
     // Param is passed by value, moved
     pub fn set_go_package(&mut self, v: ::std::string::String) {
-        self.go_package = crate::SingularField::some(v);
+        self.go_package = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_go_package(&mut self) -> &mut ::std::string::String {
         if self.go_package.is_none() {
-            self.go_package.set_default();
+            self.go_package = ::std::option::Option::Some(::std::string::String::new());
         }
         self.go_package.as_mut().unwrap()
     }
@@ -4892,10 +4088,10 @@
 
     // optional bool cc_generic_services = 16;
 
-
-    pub fn get_cc_generic_services(&self) -> bool {
+    pub fn cc_generic_services(&self) -> bool {
         self.cc_generic_services.unwrap_or(false)
     }
+
     pub fn clear_cc_generic_services(&mut self) {
         self.cc_generic_services = ::std::option::Option::None;
     }
@@ -4911,10 +4107,10 @@
 
     // optional bool java_generic_services = 17;
 
-
-    pub fn get_java_generic_services(&self) -> bool {
+    pub fn java_generic_services(&self) -> bool {
         self.java_generic_services.unwrap_or(false)
     }
+
     pub fn clear_java_generic_services(&mut self) {
         self.java_generic_services = ::std::option::Option::None;
     }
@@ -4930,10 +4126,10 @@
 
     // optional bool py_generic_services = 18;
 
-
-    pub fn get_py_generic_services(&self) -> bool {
+    pub fn py_generic_services(&self) -> bool {
         self.py_generic_services.unwrap_or(false)
     }
+
     pub fn clear_py_generic_services(&mut self) {
         self.py_generic_services = ::std::option::Option::None;
     }
@@ -4949,10 +4145,10 @@
 
     // optional bool php_generic_services = 42;
 
-
-    pub fn get_php_generic_services(&self) -> bool {
+    pub fn php_generic_services(&self) -> bool {
         self.php_generic_services.unwrap_or(false)
     }
+
     pub fn clear_php_generic_services(&mut self) {
         self.php_generic_services = ::std::option::Option::None;
     }
@@ -4968,10 +4164,10 @@
 
     // optional bool deprecated = 23;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -4987,10 +4183,10 @@
 
     // optional bool cc_enable_arenas = 31;
 
-
-    pub fn get_cc_enable_arenas(&self) -> bool {
+    pub fn cc_enable_arenas(&self) -> bool {
         self.cc_enable_arenas.unwrap_or(true)
     }
+
     pub fn clear_cc_enable_arenas(&mut self) {
         self.cc_enable_arenas = ::std::option::Option::None;
     }
@@ -5006,15 +4202,15 @@
 
     // optional string objc_class_prefix = 36;
 
-
-    pub fn get_objc_class_prefix(&self) -> &str {
+    pub fn objc_class_prefix(&self) -> &str {
         match self.objc_class_prefix.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_objc_class_prefix(&mut self) {
-        self.objc_class_prefix.clear();
+        self.objc_class_prefix = ::std::option::Option::None;
     }
 
     pub fn has_objc_class_prefix(&self) -> bool {
@@ -5023,14 +4219,14 @@
 
     // Param is passed by value, moved
     pub fn set_objc_class_prefix(&mut self, v: ::std::string::String) {
-        self.objc_class_prefix = crate::SingularField::some(v);
+        self.objc_class_prefix = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_objc_class_prefix(&mut self) -> &mut ::std::string::String {
         if self.objc_class_prefix.is_none() {
-            self.objc_class_prefix.set_default();
+            self.objc_class_prefix = ::std::option::Option::Some(::std::string::String::new());
         }
         self.objc_class_prefix.as_mut().unwrap()
     }
@@ -5042,15 +4238,15 @@
 
     // optional string csharp_namespace = 37;
 
-
-    pub fn get_csharp_namespace(&self) -> &str {
+    pub fn csharp_namespace(&self) -> &str {
         match self.csharp_namespace.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_csharp_namespace(&mut self) {
-        self.csharp_namespace.clear();
+        self.csharp_namespace = ::std::option::Option::None;
     }
 
     pub fn has_csharp_namespace(&self) -> bool {
@@ -5059,14 +4255,14 @@
 
     // Param is passed by value, moved
     pub fn set_csharp_namespace(&mut self, v: ::std::string::String) {
-        self.csharp_namespace = crate::SingularField::some(v);
+        self.csharp_namespace = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_csharp_namespace(&mut self) -> &mut ::std::string::String {
         if self.csharp_namespace.is_none() {
-            self.csharp_namespace.set_default();
+            self.csharp_namespace = ::std::option::Option::Some(::std::string::String::new());
         }
         self.csharp_namespace.as_mut().unwrap()
     }
@@ -5078,15 +4274,15 @@
 
     // optional string swift_prefix = 39;
 
-
-    pub fn get_swift_prefix(&self) -> &str {
+    pub fn swift_prefix(&self) -> &str {
         match self.swift_prefix.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_swift_prefix(&mut self) {
-        self.swift_prefix.clear();
+        self.swift_prefix = ::std::option::Option::None;
     }
 
     pub fn has_swift_prefix(&self) -> bool {
@@ -5095,14 +4291,14 @@
 
     // Param is passed by value, moved
     pub fn set_swift_prefix(&mut self, v: ::std::string::String) {
-        self.swift_prefix = crate::SingularField::some(v);
+        self.swift_prefix = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_swift_prefix(&mut self) -> &mut ::std::string::String {
         if self.swift_prefix.is_none() {
-            self.swift_prefix.set_default();
+            self.swift_prefix = ::std::option::Option::Some(::std::string::String::new());
         }
         self.swift_prefix.as_mut().unwrap()
     }
@@ -5114,15 +4310,15 @@
 
     // optional string php_class_prefix = 40;
 
-
-    pub fn get_php_class_prefix(&self) -> &str {
+    pub fn php_class_prefix(&self) -> &str {
         match self.php_class_prefix.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_php_class_prefix(&mut self) {
-        self.php_class_prefix.clear();
+        self.php_class_prefix = ::std::option::Option::None;
     }
 
     pub fn has_php_class_prefix(&self) -> bool {
@@ -5131,14 +4327,14 @@
 
     // Param is passed by value, moved
     pub fn set_php_class_prefix(&mut self, v: ::std::string::String) {
-        self.php_class_prefix = crate::SingularField::some(v);
+        self.php_class_prefix = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_php_class_prefix(&mut self) -> &mut ::std::string::String {
         if self.php_class_prefix.is_none() {
-            self.php_class_prefix.set_default();
+            self.php_class_prefix = ::std::option::Option::Some(::std::string::String::new());
         }
         self.php_class_prefix.as_mut().unwrap()
     }
@@ -5150,15 +4346,15 @@
 
     // optional string php_namespace = 41;
 
-
-    pub fn get_php_namespace(&self) -> &str {
+    pub fn php_namespace(&self) -> &str {
         match self.php_namespace.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_php_namespace(&mut self) {
-        self.php_namespace.clear();
+        self.php_namespace = ::std::option::Option::None;
     }
 
     pub fn has_php_namespace(&self) -> bool {
@@ -5167,14 +4363,14 @@
 
     // Param is passed by value, moved
     pub fn set_php_namespace(&mut self, v: ::std::string::String) {
-        self.php_namespace = crate::SingularField::some(v);
+        self.php_namespace = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_php_namespace(&mut self) -> &mut ::std::string::String {
         if self.php_namespace.is_none() {
-            self.php_namespace.set_default();
+            self.php_namespace = ::std::option::Option::Some(::std::string::String::new());
         }
         self.php_namespace.as_mut().unwrap()
     }
@@ -5186,15 +4382,15 @@
 
     // optional string php_metadata_namespace = 44;
 
-
-    pub fn get_php_metadata_namespace(&self) -> &str {
+    pub fn php_metadata_namespace(&self) -> &str {
         match self.php_metadata_namespace.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_php_metadata_namespace(&mut self) {
-        self.php_metadata_namespace.clear();
+        self.php_metadata_namespace = ::std::option::Option::None;
     }
 
     pub fn has_php_metadata_namespace(&self) -> bool {
@@ -5203,14 +4399,14 @@
 
     // Param is passed by value, moved
     pub fn set_php_metadata_namespace(&mut self, v: ::std::string::String) {
-        self.php_metadata_namespace = crate::SingularField::some(v);
+        self.php_metadata_namespace = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_php_metadata_namespace(&mut self) -> &mut ::std::string::String {
         if self.php_metadata_namespace.is_none() {
-            self.php_metadata_namespace.set_default();
+            self.php_metadata_namespace = ::std::option::Option::Some(::std::string::String::new());
         }
         self.php_metadata_namespace.as_mut().unwrap()
     }
@@ -5222,15 +4418,15 @@
 
     // optional string ruby_package = 45;
 
-
-    pub fn get_ruby_package(&self) -> &str {
+    pub fn ruby_package(&self) -> &str {
         match self.ruby_package.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_ruby_package(&mut self) {
-        self.ruby_package.clear();
+        self.ruby_package = ::std::option::Option::None;
     }
 
     pub fn has_ruby_package(&self) -> bool {
@@ -5239,14 +4435,14 @@
 
     // Param is passed by value, moved
     pub fn set_ruby_package(&mut self, v: ::std::string::String) {
-        self.ruby_package = crate::SingularField::some(v);
+        self.ruby_package = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_ruby_package(&mut self) -> &mut ::std::string::String {
         if self.ruby_package.is_none() {
-            self.ruby_package.set_default();
+            self.ruby_package = ::std::option::Option::Some(::std::string::String::new());
         }
         self.ruby_package.as_mut().unwrap()
     }
@@ -5256,33 +4452,125 @@
         self.ruby_package.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(21);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "java_package",
+            |m: &FileOptions| { &m.java_package },
+            |m: &mut FileOptions| { &mut m.java_package },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "java_outer_classname",
+            |m: &FileOptions| { &m.java_outer_classname },
+            |m: &mut FileOptions| { &mut m.java_outer_classname },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "java_multiple_files",
+            |m: &FileOptions| { &m.java_multiple_files },
+            |m: &mut FileOptions| { &mut m.java_multiple_files },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "java_generate_equals_and_hash",
+            |m: &FileOptions| { &m.java_generate_equals_and_hash },
+            |m: &mut FileOptions| { &mut m.java_generate_equals_and_hash },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "java_string_check_utf8",
+            |m: &FileOptions| { &m.java_string_check_utf8 },
+            |m: &mut FileOptions| { &mut m.java_string_check_utf8 },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "optimize_for",
+            |m: &FileOptions| { &m.optimize_for },
+            |m: &mut FileOptions| { &mut m.optimize_for },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "go_package",
+            |m: &FileOptions| { &m.go_package },
+            |m: &mut FileOptions| { &mut m.go_package },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "cc_generic_services",
+            |m: &FileOptions| { &m.cc_generic_services },
+            |m: &mut FileOptions| { &mut m.cc_generic_services },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "java_generic_services",
+            |m: &FileOptions| { &m.java_generic_services },
+            |m: &mut FileOptions| { &mut m.java_generic_services },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "py_generic_services",
+            |m: &FileOptions| { &m.py_generic_services },
+            |m: &mut FileOptions| { &mut m.py_generic_services },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "php_generic_services",
+            |m: &FileOptions| { &m.php_generic_services },
+            |m: &mut FileOptions| { &mut m.php_generic_services },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &FileOptions| { &m.deprecated },
+            |m: &mut FileOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "cc_enable_arenas",
+            |m: &FileOptions| { &m.cc_enable_arenas },
+            |m: &mut FileOptions| { &mut m.cc_enable_arenas },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "objc_class_prefix",
+            |m: &FileOptions| { &m.objc_class_prefix },
+            |m: &mut FileOptions| { &mut m.objc_class_prefix },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "csharp_namespace",
+            |m: &FileOptions| { &m.csharp_namespace },
+            |m: &mut FileOptions| { &mut m.csharp_namespace },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "swift_prefix",
+            |m: &FileOptions| { &m.swift_prefix },
+            |m: &mut FileOptions| { &mut m.swift_prefix },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "php_class_prefix",
+            |m: &FileOptions| { &m.php_class_prefix },
+            |m: &mut FileOptions| { &mut m.php_class_prefix },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "php_namespace",
+            |m: &FileOptions| { &m.php_namespace },
+            |m: &mut FileOptions| { &mut m.php_namespace },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "php_metadata_namespace",
+            |m: &FileOptions| { &m.php_metadata_namespace },
+            |m: &mut FileOptions| { &mut m.php_metadata_namespace },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "ruby_package",
+            |m: &FileOptions| { &m.ruby_package },
+            |m: &mut FileOptions| { &mut m.ruby_package },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &FileOptions| { &m.uninterpreted_option },
+            |m: &mut FileOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FileOptions>(
+            "FileOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for FileOptions {
+    const NAME: &'static str = "FileOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -5292,111 +4580,74 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.java_package)?;
-                },
-                8 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.java_outer_classname)?;
-                },
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
                 10 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.java_multiple_files = ::std::option::Option::Some(tmp);
+                    self.java_package = ::std::option::Option::Some(is.read_string()?);
                 },
-                20 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.java_generate_equals_and_hash = ::std::option::Option::Some(tmp);
+                66 => {
+                    self.java_outer_classname = ::std::option::Option::Some(is.read_string()?);
                 },
-                27 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.java_string_check_utf8 = ::std::option::Option::Some(tmp);
+                80 => {
+                    self.java_multiple_files = ::std::option::Option::Some(is.read_bool()?);
                 },
-                9 => {
-                    crate::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.optimize_for, 9, &mut self.unknown_fields)?
+                160 => {
+                    self.java_generate_equals_and_hash = ::std::option::Option::Some(is.read_bool()?);
                 },
-                11 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.go_package)?;
+                216 => {
+                    self.java_string_check_utf8 = ::std::option::Option::Some(is.read_bool()?);
                 },
-                16 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.cc_generic_services = ::std::option::Option::Some(tmp);
+                72 => {
+                    self.optimize_for = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                17 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.java_generic_services = ::std::option::Option::Some(tmp);
+                90 => {
+                    self.go_package = ::std::option::Option::Some(is.read_string()?);
                 },
-                18 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.py_generic_services = ::std::option::Option::Some(tmp);
+                128 => {
+                    self.cc_generic_services = ::std::option::Option::Some(is.read_bool()?);
                 },
-                42 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.php_generic_services = ::std::option::Option::Some(tmp);
+                136 => {
+                    self.java_generic_services = ::std::option::Option::Some(is.read_bool()?);
                 },
-                23 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+                144 => {
+                    self.py_generic_services = ::std::option::Option::Some(is.read_bool()?);
                 },
-                31 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.cc_enable_arenas = ::std::option::Option::Some(tmp);
+                336 => {
+                    self.php_generic_services = ::std::option::Option::Some(is.read_bool()?);
                 },
-                36 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.objc_class_prefix)?;
+                184 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                37 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.csharp_namespace)?;
+                248 => {
+                    self.cc_enable_arenas = ::std::option::Option::Some(is.read_bool()?);
                 },
-                39 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.swift_prefix)?;
+                290 => {
+                    self.objc_class_prefix = ::std::option::Option::Some(is.read_string()?);
                 },
-                40 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.php_class_prefix)?;
+                298 => {
+                    self.csharp_namespace = ::std::option::Option::Some(is.read_string()?);
                 },
-                41 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.php_namespace)?;
+                314 => {
+                    self.swift_prefix = ::std::option::Option::Some(is.read_string()?);
                 },
-                44 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.php_metadata_namespace)?;
+                322 => {
+                    self.php_class_prefix = ::std::option::Option::Some(is.read_string()?);
                 },
-                45 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.ruby_package)?;
+                330 => {
+                    self.php_namespace = ::std::option::Option::Some(is.read_string()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                354 => {
+                    self.php_metadata_namespace = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                362 => {
+                    self.ruby_package = ::std::option::Option::Some(is.read_string()?);
+                },
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -5405,83 +4656,83 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.java_package.as_ref() {
+        if let Some(v) = self.java_package.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
-        if let Some(ref v) = self.java_outer_classname.as_ref() {
+        if let Some(v) = self.java_outer_classname.as_ref() {
             my_size += crate::rt::string_size(8, &v);
         }
         if let Some(v) = self.java_multiple_files {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.java_generate_equals_and_hash {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.java_string_check_utf8 {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.optimize_for {
-            my_size += crate::rt::enum_size(9, v);
+            my_size += crate::rt::int32_size(9, v.value());
         }
-        if let Some(ref v) = self.go_package.as_ref() {
+        if let Some(v) = self.go_package.as_ref() {
             my_size += crate::rt::string_size(11, &v);
         }
         if let Some(v) = self.cc_generic_services {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.java_generic_services {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.py_generic_services {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.php_generic_services {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.deprecated {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.cc_enable_arenas {
-            my_size += 3;
+            my_size += 2 + 1;
         }
-        if let Some(ref v) = self.objc_class_prefix.as_ref() {
+        if let Some(v) = self.objc_class_prefix.as_ref() {
             my_size += crate::rt::string_size(36, &v);
         }
-        if let Some(ref v) = self.csharp_namespace.as_ref() {
+        if let Some(v) = self.csharp_namespace.as_ref() {
             my_size += crate::rt::string_size(37, &v);
         }
-        if let Some(ref v) = self.swift_prefix.as_ref() {
+        if let Some(v) = self.swift_prefix.as_ref() {
             my_size += crate::rt::string_size(39, &v);
         }
-        if let Some(ref v) = self.php_class_prefix.as_ref() {
+        if let Some(v) = self.php_class_prefix.as_ref() {
             my_size += crate::rt::string_size(40, &v);
         }
-        if let Some(ref v) = self.php_namespace.as_ref() {
+        if let Some(v) = self.php_namespace.as_ref() {
             my_size += crate::rt::string_size(41, &v);
         }
-        if let Some(ref v) = self.php_metadata_namespace.as_ref() {
+        if let Some(v) = self.php_metadata_namespace.as_ref() {
             my_size += crate::rt::string_size(44, &v);
         }
-        if let Some(ref v) = self.ruby_package.as_ref() {
+        if let Some(v) = self.ruby_package.as_ref() {
             my_size += crate::rt::string_size(45, &v);
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.java_package.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.java_package.as_ref() {
+            os.write_string(1, v)?;
         }
-        if let Some(ref v) = self.java_outer_classname.as_ref() {
-            os.write_string(8, &v)?;
+        if let Some(v) = self.java_outer_classname.as_ref() {
+            os.write_string(8, v)?;
         }
         if let Some(v) = self.java_multiple_files {
             os.write_bool(10, v)?;
@@ -5493,10 +4744,10 @@
             os.write_bool(27, v)?;
         }
         if let Some(v) = self.optimize_for {
-            os.write_enum(9, crate::ProtobufEnum::value(&v))?;
+            os.write_enum(9, crate::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.go_package.as_ref() {
-            os.write_string(11, &v)?;
+        if let Some(v) = self.go_package.as_ref() {
+            os.write_string(11, v)?;
         }
         if let Some(v) = self.cc_generic_services {
             os.write_bool(16, v)?;
@@ -5516,297 +4767,209 @@
         if let Some(v) = self.cc_enable_arenas {
             os.write_bool(31, v)?;
         }
-        if let Some(ref v) = self.objc_class_prefix.as_ref() {
-            os.write_string(36, &v)?;
+        if let Some(v) = self.objc_class_prefix.as_ref() {
+            os.write_string(36, v)?;
         }
-        if let Some(ref v) = self.csharp_namespace.as_ref() {
-            os.write_string(37, &v)?;
+        if let Some(v) = self.csharp_namespace.as_ref() {
+            os.write_string(37, v)?;
         }
-        if let Some(ref v) = self.swift_prefix.as_ref() {
-            os.write_string(39, &v)?;
+        if let Some(v) = self.swift_prefix.as_ref() {
+            os.write_string(39, v)?;
         }
-        if let Some(ref v) = self.php_class_prefix.as_ref() {
-            os.write_string(40, &v)?;
+        if let Some(v) = self.php_class_prefix.as_ref() {
+            os.write_string(40, v)?;
         }
-        if let Some(ref v) = self.php_namespace.as_ref() {
-            os.write_string(41, &v)?;
+        if let Some(v) = self.php_namespace.as_ref() {
+            os.write_string(41, v)?;
         }
-        if let Some(ref v) = self.php_metadata_namespace.as_ref() {
-            os.write_string(44, &v)?;
+        if let Some(v) = self.php_metadata_namespace.as_ref() {
+            os.write_string(44, v)?;
         }
-        if let Some(ref v) = self.ruby_package.as_ref() {
-            os.write_string(45, &v)?;
+        if let Some(v) = self.ruby_package.as_ref() {
+            os.write_string(45, v)?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FileOptions {
         FileOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "java_package",
-                |m: &FileOptions| { &m.java_package },
-                |m: &mut FileOptions| { &mut m.java_package },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "java_outer_classname",
-                |m: &FileOptions| { &m.java_outer_classname },
-                |m: &mut FileOptions| { &mut m.java_outer_classname },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "java_multiple_files",
-                |m: &FileOptions| { &m.java_multiple_files },
-                |m: &mut FileOptions| { &mut m.java_multiple_files },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "java_generate_equals_and_hash",
-                |m: &FileOptions| { &m.java_generate_equals_and_hash },
-                |m: &mut FileOptions| { &mut m.java_generate_equals_and_hash },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "java_string_check_utf8",
-                |m: &FileOptions| { &m.java_string_check_utf8 },
-                |m: &mut FileOptions| { &mut m.java_string_check_utf8 },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeEnum<FileOptions_OptimizeMode>>(
-                "optimize_for",
-                |m: &FileOptions| { &m.optimize_for },
-                |m: &mut FileOptions| { &mut m.optimize_for },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "go_package",
-                |m: &FileOptions| { &m.go_package },
-                |m: &mut FileOptions| { &mut m.go_package },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "cc_generic_services",
-                |m: &FileOptions| { &m.cc_generic_services },
-                |m: &mut FileOptions| { &mut m.cc_generic_services },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "java_generic_services",
-                |m: &FileOptions| { &m.java_generic_services },
-                |m: &mut FileOptions| { &mut m.java_generic_services },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "py_generic_services",
-                |m: &FileOptions| { &m.py_generic_services },
-                |m: &mut FileOptions| { &mut m.py_generic_services },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "php_generic_services",
-                |m: &FileOptions| { &m.php_generic_services },
-                |m: &mut FileOptions| { &mut m.php_generic_services },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &FileOptions| { &m.deprecated },
-                |m: &mut FileOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "cc_enable_arenas",
-                |m: &FileOptions| { &m.cc_enable_arenas },
-                |m: &mut FileOptions| { &mut m.cc_enable_arenas },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "objc_class_prefix",
-                |m: &FileOptions| { &m.objc_class_prefix },
-                |m: &mut FileOptions| { &mut m.objc_class_prefix },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "csharp_namespace",
-                |m: &FileOptions| { &m.csharp_namespace },
-                |m: &mut FileOptions| { &mut m.csharp_namespace },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "swift_prefix",
-                |m: &FileOptions| { &m.swift_prefix },
-                |m: &mut FileOptions| { &mut m.swift_prefix },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "php_class_prefix",
-                |m: &FileOptions| { &m.php_class_prefix },
-                |m: &mut FileOptions| { &mut m.php_class_prefix },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "php_namespace",
-                |m: &FileOptions| { &m.php_namespace },
-                |m: &mut FileOptions| { &mut m.php_namespace },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "php_metadata_namespace",
-                |m: &FileOptions| { &m.php_metadata_namespace },
-                |m: &mut FileOptions| { &mut m.php_metadata_namespace },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "ruby_package",
-                |m: &FileOptions| { &m.ruby_package },
-                |m: &mut FileOptions| { &mut m.ruby_package },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &FileOptions| { &m.uninterpreted_option },
-                |m: &mut FileOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FileOptions>(
-                "FileOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static FileOptions {
-        static instance: crate::rt::LazyV2<FileOptions> = crate::rt::LazyV2::INIT;
-        instance.get(FileOptions::new)
-    }
-}
-
-impl crate::Clear for FileOptions {
     fn clear(&mut self) {
-        self.java_package.clear();
-        self.java_outer_classname.clear();
+        self.java_package = ::std::option::Option::None;
+        self.java_outer_classname = ::std::option::Option::None;
         self.java_multiple_files = ::std::option::Option::None;
         self.java_generate_equals_and_hash = ::std::option::Option::None;
         self.java_string_check_utf8 = ::std::option::Option::None;
         self.optimize_for = ::std::option::Option::None;
-        self.go_package.clear();
+        self.go_package = ::std::option::Option::None;
         self.cc_generic_services = ::std::option::Option::None;
         self.java_generic_services = ::std::option::Option::None;
         self.py_generic_services = ::std::option::Option::None;
         self.php_generic_services = ::std::option::Option::None;
         self.deprecated = ::std::option::Option::None;
         self.cc_enable_arenas = ::std::option::Option::None;
-        self.objc_class_prefix.clear();
-        self.csharp_namespace.clear();
-        self.swift_prefix.clear();
-        self.php_class_prefix.clear();
-        self.php_namespace.clear();
-        self.php_metadata_namespace.clear();
-        self.ruby_package.clear();
+        self.objc_class_prefix = ::std::option::Option::None;
+        self.csharp_namespace = ::std::option::Option::None;
+        self.swift_prefix = ::std::option::Option::None;
+        self.php_class_prefix = ::std::option::Option::None;
+        self.php_namespace = ::std::option::Option::None;
+        self.php_metadata_namespace = ::std::option::Option::None;
+        self.ruby_package = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static FileOptions {
+        static instance: FileOptions = FileOptions {
+            java_package: ::std::option::Option::None,
+            java_outer_classname: ::std::option::Option::None,
+            java_multiple_files: ::std::option::Option::None,
+            java_generate_equals_and_hash: ::std::option::Option::None,
+            java_string_check_utf8: ::std::option::Option::None,
+            optimize_for: ::std::option::Option::None,
+            go_package: ::std::option::Option::None,
+            cc_generic_services: ::std::option::Option::None,
+            java_generic_services: ::std::option::Option::None,
+            py_generic_services: ::std::option::Option::None,
+            php_generic_services: ::std::option::Option::None,
+            deprecated: ::std::option::Option::None,
+            cc_enable_arenas: ::std::option::Option::None,
+            objc_class_prefix: ::std::option::Option::None,
+            csharp_namespace: ::std::option::Option::None,
+            swift_prefix: ::std::option::Option::None,
+            php_class_prefix: ::std::option::Option::None,
+            php_namespace: ::std::option::Option::None,
+            php_metadata_namespace: ::std::option::Option::None,
+            ruby_package: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for FileOptions {
+impl crate::MessageFull for FileOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FileOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for FileOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FileOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum FileOptions_OptimizeMode {
-    SPEED = 1,
-    CODE_SIZE = 2,
-    LITE_RUNTIME = 3,
-}
-
-impl crate::ProtobufEnum for FileOptions_OptimizeMode {
-    fn value(&self) -> i32 {
-        *self as i32
+/// Nested message and enums of message `FileOptions`
+pub mod file_options {
+    ///  Generated classes can be optimized for speed or code size.
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.FileOptions.OptimizeMode)
+    pub enum OptimizeMode {
+        // @@protoc_insertion_point(enum_value:google.protobuf.FileOptions.OptimizeMode.SPEED)
+        SPEED = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FileOptions.OptimizeMode.CODE_SIZE)
+        CODE_SIZE = 2,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FileOptions.OptimizeMode.LITE_RUNTIME)
+        LITE_RUNTIME = 3,
     }
 
-    fn from_i32(value: i32) -> ::std::option::Option<FileOptions_OptimizeMode> {
-        match value {
-            1 => ::std::option::Option::Some(FileOptions_OptimizeMode::SPEED),
-            2 => ::std::option::Option::Some(FileOptions_OptimizeMode::CODE_SIZE),
-            3 => ::std::option::Option::Some(FileOptions_OptimizeMode::LITE_RUNTIME),
-            _ => ::std::option::Option::None
+    impl crate::Enum for OptimizeMode {
+        const NAME: &'static str = "OptimizeMode";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<OptimizeMode> {
+            match value {
+                1 => ::std::option::Option::Some(OptimizeMode::SPEED),
+                2 => ::std::option::Option::Some(OptimizeMode::CODE_SIZE),
+                3 => ::std::option::Option::Some(OptimizeMode::LITE_RUNTIME),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [OptimizeMode] = &[
+            OptimizeMode::SPEED,
+            OptimizeMode::CODE_SIZE,
+            OptimizeMode::LITE_RUNTIME,
+        ];
+    }
+
+    impl crate::EnumFull for OptimizeMode {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("FileOptions.OptimizeMode").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = match self {
+                OptimizeMode::SPEED => 0,
+                OptimizeMode::CODE_SIZE => 1,
+                OptimizeMode::LITE_RUNTIME => 2,
+            };
+            Self::enum_descriptor().value_by_index(index)
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [FileOptions_OptimizeMode] = &[
-            FileOptions_OptimizeMode::SPEED,
-            FileOptions_OptimizeMode::CODE_SIZE,
-            FileOptions_OptimizeMode::LITE_RUNTIME,
-        ];
-        values
+    // Note, `Default` is implemented although default value is not 0
+    impl ::std::default::Default for OptimizeMode {
+        fn default() -> Self {
+            OptimizeMode::SPEED
+        }
     }
 
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<FileOptions_OptimizeMode>("FileOptions.OptimizeMode", file_descriptor_proto())
-        })
+    impl OptimizeMode {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<OptimizeMode>("FileOptions.OptimizeMode")
+        }
     }
 }
 
-impl ::std::marker::Copy for FileOptions_OptimizeMode {
-}
-
-// Note, `Default` is implemented although default value is not 0
-impl ::std::default::Default for FileOptions_OptimizeMode {
-    fn default() -> Self {
-        FileOptions_OptimizeMode::SPEED
-    }
-}
-
-impl crate::reflect::ProtobufValue for FileOptions_OptimizeMode {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.MessageOptions)
 pub struct MessageOptions {
     // message fields
-    message_set_wire_format: ::std::option::Option<bool>,
-    no_standard_descriptor_accessor: ::std::option::Option<bool>,
-    deprecated: ::std::option::Option<bool>,
-    map_entry: ::std::option::Option<bool>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    // @@protoc_insertion_point(field:google.protobuf.MessageOptions.message_set_wire_format)
+    pub message_set_wire_format: ::std::option::Option<bool>,
+    ///  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".
+    // @@protoc_insertion_point(field:google.protobuf.MessageOptions.no_standard_descriptor_accessor)
+    pub no_standard_descriptor_accessor: ::std::option::Option<bool>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.MessageOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.MessageOptions.map_entry)
+    pub map_entry: ::std::option::Option<bool>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.MessageOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.MessageOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a MessageOptions {
@@ -5822,10 +4985,10 @@
 
     // optional bool message_set_wire_format = 1;
 
-
-    pub fn get_message_set_wire_format(&self) -> bool {
+    pub fn message_set_wire_format(&self) -> bool {
         self.message_set_wire_format.unwrap_or(false)
     }
+
     pub fn clear_message_set_wire_format(&mut self) {
         self.message_set_wire_format = ::std::option::Option::None;
     }
@@ -5841,10 +5004,10 @@
 
     // optional bool no_standard_descriptor_accessor = 2;
 
-
-    pub fn get_no_standard_descriptor_accessor(&self) -> bool {
+    pub fn no_standard_descriptor_accessor(&self) -> bool {
         self.no_standard_descriptor_accessor.unwrap_or(false)
     }
+
     pub fn clear_no_standard_descriptor_accessor(&mut self) {
         self.no_standard_descriptor_accessor = ::std::option::Option::None;
     }
@@ -5860,10 +5023,10 @@
 
     // optional bool deprecated = 3;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -5879,10 +5042,10 @@
 
     // optional bool map_entry = 7;
 
-
-    pub fn get_map_entry(&self) -> bool {
+    pub fn map_entry(&self) -> bool {
         self.map_entry.unwrap_or(false)
     }
+
     pub fn clear_map_entry(&mut self) {
         self.map_entry = ::std::option::Option::None;
     }
@@ -5896,33 +5059,45 @@
         self.map_entry = ::std::option::Option::Some(v);
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(5);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "message_set_wire_format",
+            |m: &MessageOptions| { &m.message_set_wire_format },
+            |m: &mut MessageOptions| { &mut m.message_set_wire_format },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "no_standard_descriptor_accessor",
+            |m: &MessageOptions| { &m.no_standard_descriptor_accessor },
+            |m: &mut MessageOptions| { &mut m.no_standard_descriptor_accessor },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &MessageOptions| { &m.deprecated },
+            |m: &mut MessageOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "map_entry",
+            |m: &MessageOptions| { &m.map_entry },
+            |m: &mut MessageOptions| { &mut m.map_entry },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &MessageOptions| { &m.uninterpreted_option },
+            |m: &mut MessageOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<MessageOptions>(
+            "MessageOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for MessageOptions {
+    const NAME: &'static str = "MessageOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -5932,43 +5107,26 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.message_set_wire_format = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.message_set_wire_format = ::std::option::Option::Some(is.read_bool()?);
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.no_standard_descriptor_accessor = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.no_standard_descriptor_accessor = ::std::option::Option::Some(is.read_bool()?);
                 },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+                24 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                7 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.map_entry = ::std::option::Option::Some(tmp);
+                56 => {
+                    self.map_entry = ::std::option::Option::Some(is.read_bool()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -5977,30 +5135,30 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.message_set_wire_format {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.no_standard_descriptor_accessor {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.deprecated {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.map_entry {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.message_set_wire_format {
             os.write_bool(1, v)?;
         }
@@ -6014,126 +5172,138 @@
             os.write_bool(7, v)?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> MessageOptions {
         MessageOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "message_set_wire_format",
-                |m: &MessageOptions| { &m.message_set_wire_format },
-                |m: &mut MessageOptions| { &mut m.message_set_wire_format },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "no_standard_descriptor_accessor",
-                |m: &MessageOptions| { &m.no_standard_descriptor_accessor },
-                |m: &mut MessageOptions| { &mut m.no_standard_descriptor_accessor },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &MessageOptions| { &m.deprecated },
-                |m: &mut MessageOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "map_entry",
-                |m: &MessageOptions| { &m.map_entry },
-                |m: &mut MessageOptions| { &mut m.map_entry },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &MessageOptions| { &m.uninterpreted_option },
-                |m: &mut MessageOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<MessageOptions>(
-                "MessageOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static MessageOptions {
-        static instance: crate::rt::LazyV2<MessageOptions> = crate::rt::LazyV2::INIT;
-        instance.get(MessageOptions::new)
-    }
-}
-
-impl crate::Clear for MessageOptions {
     fn clear(&mut self) {
         self.message_set_wire_format = ::std::option::Option::None;
         self.no_standard_descriptor_accessor = ::std::option::Option::None;
         self.deprecated = ::std::option::Option::None;
         self.map_entry = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static MessageOptions {
+        static instance: MessageOptions = MessageOptions {
+            message_set_wire_format: ::std::option::Option::None,
+            no_standard_descriptor_accessor: ::std::option::Option::None,
+            deprecated: ::std::option::Option::None,
+            map_entry: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for MessageOptions {
+impl crate::MessageFull for MessageOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("MessageOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for MessageOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for MessageOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FieldOptions)
 pub struct FieldOptions {
     // message fields
-    ctype: ::std::option::Option<FieldOptions_CType>,
-    packed: ::std::option::Option<bool>,
-    jstype: ::std::option::Option<FieldOptions_JSType>,
-    lazy: ::std::option::Option<bool>,
-    deprecated: ::std::option::Option<bool>,
-    weak: ::std::option::Option<bool>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  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!
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.ctype)
+    pub ctype: ::std::option::Option<crate::EnumOrUnknown<field_options::CType>>,
+    ///  The packed option can be enabled for repeated primitive fields to enable
+    ///  a more efficient representation on the wire. Rather than repeatedly
+    ///  writing the tag and type for each element, the entire array is encoded as
+    ///  a single length-delimited blob. In proto3, only explicit setting it to
+    ///  false will avoid using packed encoding.
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.packed)
+    pub packed: ::std::option::Option<bool>,
+    ///  The jstype option determines the JavaScript type used for values of the
+    ///  field.  The option is permitted only for 64 bit integral and fixed types
+    ///  (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
+    ///  is represented as JavaScript string, which avoids loss of precision that
+    ///  can happen when a large value is converted to a floating point JavaScript.
+    ///  Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
+    ///  use the JavaScript "number" type.  The behavior of the default option
+    ///  JS_NORMAL is implementation dependent.
+    ///
+    ///  This option is an enum to permit additional types to be added, e.g.
+    ///  goog.math.Integer.
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.jstype)
+    pub jstype: ::std::option::Option<crate::EnumOrUnknown<field_options::JSType>>,
+    ///  Should this field be parsed lazily?  Lazy applies only to message-type
+    ///  fields.  It means that when the outer message is initially parsed, the
+    ///  inner message's contents will not be parsed but instead stored in encoded
+    ///  form.  The inner message will actually be parsed when it is first accessed.
+    ///
+    ///  This is only a hint.  Implementations are free to choose whether to use
+    ///  eager or lazy parsing regardless of the value of this option.  However,
+    ///  setting this option true suggests that the protocol author believes that
+    ///  using lazy parsing on this field is worth the additional bookkeeping
+    ///  overhead typically needed to implement it.
+    ///
+    ///  This option does not affect the public interface of any generated code;
+    ///  all method signatures remain the same.  Furthermore, thread-safety of the
+    ///  interface is not affected by this option; const methods remain safe to
+    ///  call from multiple threads concurrently, while non-const methods continue
+    ///  to require exclusive access.
+    ///
+    ///
+    ///  Note that implementations may choose not to check required fields within
+    ///  a lazy sub-message.  That is, calling IsInitialized() on the outer message
+    ///  may return true even if the inner message has missing required fields.
+    ///  This is necessary because otherwise the inner message would have to be
+    ///  parsed in order to perform the check, defeating the purpose of lazy
+    ///  parsing.  An implementation which chooses not to check required fields
+    ///  must be consistent about it.  That is, for any particular sub-message, the
+    ///  implementation must either *always* check its required fields, or *never*
+    ///  check its required fields, regardless of whether or not the message has
+    ///  been parsed.
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.lazy)
+    pub lazy: ::std::option::Option<bool>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    ///  For Google-internal migration only. Do not use.
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.weak)
+    pub weak: ::std::option::Option<bool>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.FieldOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FieldOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FieldOptions {
@@ -6149,10 +5319,13 @@
 
     // optional .google.protobuf.FieldOptions.CType ctype = 1;
 
-
-    pub fn get_ctype(&self) -> FieldOptions_CType {
-        self.ctype.unwrap_or(FieldOptions_CType::STRING)
+    pub fn ctype(&self) -> field_options::CType {
+        match self.ctype {
+            Some(e) => e.enum_value_or(field_options::CType::STRING),
+            None => field_options::CType::STRING,
+        }
     }
+
     pub fn clear_ctype(&mut self) {
         self.ctype = ::std::option::Option::None;
     }
@@ -6162,16 +5335,16 @@
     }
 
     // Param is passed by value, moved
-    pub fn set_ctype(&mut self, v: FieldOptions_CType) {
-        self.ctype = ::std::option::Option::Some(v);
+    pub fn set_ctype(&mut self, v: field_options::CType) {
+        self.ctype = ::std::option::Option::Some(crate::EnumOrUnknown::new(v));
     }
 
     // optional bool packed = 2;
 
-
-    pub fn get_packed(&self) -> bool {
+    pub fn packed(&self) -> bool {
         self.packed.unwrap_or(false)
     }
+
     pub fn clear_packed(&mut self) {
         self.packed = ::std::option::Option::None;
     }
@@ -6187,10 +5360,13 @@
 
     // optional .google.protobuf.FieldOptions.JSType jstype = 6;
 
-
-    pub fn get_jstype(&self) -> FieldOptions_JSType {
-        self.jstype.unwrap_or(FieldOptions_JSType::JS_NORMAL)
+    pub fn jstype(&self) -> field_options::JSType {
+        match self.jstype {
+            Some(e) => e.enum_value_or(field_options::JSType::JS_NORMAL),
+            None => field_options::JSType::JS_NORMAL,
+        }
     }
+
     pub fn clear_jstype(&mut self) {
         self.jstype = ::std::option::Option::None;
     }
@@ -6200,16 +5376,16 @@
     }
 
     // Param is passed by value, moved
-    pub fn set_jstype(&mut self, v: FieldOptions_JSType) {
-        self.jstype = ::std::option::Option::Some(v);
+    pub fn set_jstype(&mut self, v: field_options::JSType) {
+        self.jstype = ::std::option::Option::Some(crate::EnumOrUnknown::new(v));
     }
 
     // optional bool lazy = 5;
 
-
-    pub fn get_lazy(&self) -> bool {
+    pub fn lazy(&self) -> bool {
         self.lazy.unwrap_or(false)
     }
+
     pub fn clear_lazy(&mut self) {
         self.lazy = ::std::option::Option::None;
     }
@@ -6225,10 +5401,10 @@
 
     // optional bool deprecated = 3;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -6244,10 +5420,10 @@
 
     // optional bool weak = 10;
 
-
-    pub fn get_weak(&self) -> bool {
+    pub fn weak(&self) -> bool {
         self.weak.unwrap_or(false)
     }
+
     pub fn clear_weak(&mut self) {
         self.weak = ::std::option::Option::None;
     }
@@ -6261,33 +5437,55 @@
         self.weak = ::std::option::Option::Some(v);
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(7);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "ctype",
+            |m: &FieldOptions| { &m.ctype },
+            |m: &mut FieldOptions| { &mut m.ctype },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "packed",
+            |m: &FieldOptions| { &m.packed },
+            |m: &mut FieldOptions| { &mut m.packed },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "jstype",
+            |m: &FieldOptions| { &m.jstype },
+            |m: &mut FieldOptions| { &mut m.jstype },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "lazy",
+            |m: &FieldOptions| { &m.lazy },
+            |m: &mut FieldOptions| { &mut m.lazy },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &FieldOptions| { &m.deprecated },
+            |m: &mut FieldOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "weak",
+            |m: &FieldOptions| { &m.weak },
+            |m: &mut FieldOptions| { &mut m.weak },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &FieldOptions| { &m.uninterpreted_option },
+            |m: &mut FieldOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FieldOptions>(
+            "FieldOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for FieldOptions {
+    const NAME: &'static str = "FieldOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -6297,49 +5495,32 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.ctype, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.ctype = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.packed = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.packed = ::std::option::Option::Some(is.read_bool()?);
                 },
-                6 => {
-                    crate::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.jstype, 6, &mut self.unknown_fields)?
+                48 => {
+                    self.jstype = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                5 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.lazy = ::std::option::Option::Some(tmp);
+                40 => {
+                    self.lazy = ::std::option::Option::Some(is.read_bool()?);
                 },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+                24 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                10 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.weak = ::std::option::Option::Some(tmp);
+                80 => {
+                    self.weak = ::std::option::Option::Some(is.read_bool()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -6348,44 +5529,44 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.ctype {
-            my_size += crate::rt::enum_size(1, v);
+            my_size += crate::rt::int32_size(1, v.value());
         }
         if let Some(v) = self.packed {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.jstype {
-            my_size += crate::rt::enum_size(6, v);
+            my_size += crate::rt::int32_size(6, v.value());
         }
         if let Some(v) = self.lazy {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.deprecated {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.weak {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.ctype {
-            os.write_enum(1, crate::ProtobufEnum::value(&v))?;
+            os.write_enum(1, crate::EnumOrUnknown::value(&v))?;
         }
         if let Some(v) = self.packed {
             os.write_bool(2, v)?;
         }
         if let Some(v) = self.jstype {
-            os.write_enum(6, crate::ProtobufEnum::value(&v))?;
+            os.write_enum(6, crate::EnumOrUnknown::value(&v))?;
         }
         if let Some(v) = self.lazy {
             os.write_bool(5, v)?;
@@ -6397,98 +5578,24 @@
             os.write_bool(10, v)?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FieldOptions {
         FieldOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeEnum<FieldOptions_CType>>(
-                "ctype",
-                |m: &FieldOptions| { &m.ctype },
-                |m: &mut FieldOptions| { &mut m.ctype },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "packed",
-                |m: &FieldOptions| { &m.packed },
-                |m: &mut FieldOptions| { &mut m.packed },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeEnum<FieldOptions_JSType>>(
-                "jstype",
-                |m: &FieldOptions| { &m.jstype },
-                |m: &mut FieldOptions| { &mut m.jstype },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "lazy",
-                |m: &FieldOptions| { &m.lazy },
-                |m: &mut FieldOptions| { &mut m.lazy },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &FieldOptions| { &m.deprecated },
-                |m: &mut FieldOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "weak",
-                |m: &FieldOptions| { &m.weak },
-                |m: &mut FieldOptions| { &mut m.weak },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &FieldOptions| { &m.uninterpreted_option },
-                |m: &mut FieldOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FieldOptions>(
-                "FieldOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static FieldOptions {
-        static instance: crate::rt::LazyV2<FieldOptions> = crate::rt::LazyV2::INIT;
-        instance.get(FieldOptions::new)
-    }
-}
-
-impl crate::Clear for FieldOptions {
     fn clear(&mut self) {
         self.ctype = ::std::option::Option::None;
         self.packed = ::std::option::Option::None;
@@ -6497,140 +5604,170 @@
         self.deprecated = ::std::option::Option::None;
         self.weak = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static FieldOptions {
+        static instance: FieldOptions = FieldOptions {
+            ctype: ::std::option::Option::None,
+            packed: ::std::option::Option::None,
+            jstype: ::std::option::Option::None,
+            lazy: ::std::option::Option::None,
+            deprecated: ::std::option::Option::None,
+            weak: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for FieldOptions {
+impl crate::MessageFull for FieldOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FieldOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for FieldOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FieldOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum FieldOptions_CType {
-    STRING = 0,
-    CORD = 1,
-    STRING_PIECE = 2,
-}
-
-impl crate::ProtobufEnum for FieldOptions_CType {
-    fn value(&self) -> i32 {
-        *self as i32
+/// Nested message and enums of message `FieldOptions`
+pub mod field_options {
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.FieldOptions.CType)
+    pub enum CType {
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldOptions.CType.STRING)
+        STRING = 0,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldOptions.CType.CORD)
+        CORD = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldOptions.CType.STRING_PIECE)
+        STRING_PIECE = 2,
     }
 
-    fn from_i32(value: i32) -> ::std::option::Option<FieldOptions_CType> {
-        match value {
-            0 => ::std::option::Option::Some(FieldOptions_CType::STRING),
-            1 => ::std::option::Option::Some(FieldOptions_CType::CORD),
-            2 => ::std::option::Option::Some(FieldOptions_CType::STRING_PIECE),
-            _ => ::std::option::Option::None
+    impl crate::Enum for CType {
+        const NAME: &'static str = "CType";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<CType> {
+            match value {
+                0 => ::std::option::Option::Some(CType::STRING),
+                1 => ::std::option::Option::Some(CType::CORD),
+                2 => ::std::option::Option::Some(CType::STRING_PIECE),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [CType] = &[
+            CType::STRING,
+            CType::CORD,
+            CType::STRING_PIECE,
+        ];
+    }
+
+    impl crate::EnumFull for CType {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("FieldOptions.CType").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = *self as usize;
+            Self::enum_descriptor().value_by_index(index)
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [FieldOptions_CType] = &[
-            FieldOptions_CType::STRING,
-            FieldOptions_CType::CORD,
-            FieldOptions_CType::STRING_PIECE,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<FieldOptions_CType>("FieldOptions.CType", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for FieldOptions_CType {
-}
-
-impl ::std::default::Default for FieldOptions_CType {
-    fn default() -> Self {
-        FieldOptions_CType::STRING
-    }
-}
-
-impl crate::reflect::ProtobufValue for FieldOptions_CType {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum FieldOptions_JSType {
-    JS_NORMAL = 0,
-    JS_STRING = 1,
-    JS_NUMBER = 2,
-}
-
-impl crate::ProtobufEnum for FieldOptions_JSType {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<FieldOptions_JSType> {
-        match value {
-            0 => ::std::option::Option::Some(FieldOptions_JSType::JS_NORMAL),
-            1 => ::std::option::Option::Some(FieldOptions_JSType::JS_STRING),
-            2 => ::std::option::Option::Some(FieldOptions_JSType::JS_NUMBER),
-            _ => ::std::option::Option::None
+    impl ::std::default::Default for CType {
+        fn default() -> Self {
+            CType::STRING
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [FieldOptions_JSType] = &[
-            FieldOptions_JSType::JS_NORMAL,
-            FieldOptions_JSType::JS_STRING,
-            FieldOptions_JSType::JS_NUMBER,
+    impl CType {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<CType>("FieldOptions.CType")
+        }
+    }
+
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.FieldOptions.JSType)
+    pub enum JSType {
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldOptions.JSType.JS_NORMAL)
+        JS_NORMAL = 0,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldOptions.JSType.JS_STRING)
+        JS_STRING = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.FieldOptions.JSType.JS_NUMBER)
+        JS_NUMBER = 2,
+    }
+
+    impl crate::Enum for JSType {
+        const NAME: &'static str = "JSType";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<JSType> {
+            match value {
+                0 => ::std::option::Option::Some(JSType::JS_NORMAL),
+                1 => ::std::option::Option::Some(JSType::JS_STRING),
+                2 => ::std::option::Option::Some(JSType::JS_NUMBER),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [JSType] = &[
+            JSType::JS_NORMAL,
+            JSType::JS_STRING,
+            JSType::JS_NUMBER,
         ];
-        values
     }
 
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<FieldOptions_JSType>("FieldOptions.JSType", file_descriptor_proto())
-        })
+    impl crate::EnumFull for JSType {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("FieldOptions.JSType").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = *self as usize;
+            Self::enum_descriptor().value_by_index(index)
+        }
+    }
+
+    impl ::std::default::Default for JSType {
+        fn default() -> Self {
+            JSType::JS_NORMAL
+        }
+    }
+
+    impl JSType {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<JSType>("FieldOptions.JSType")
+        }
     }
 }
 
-impl ::std::marker::Copy for FieldOptions_JSType {
-}
-
-impl ::std::default::Default for FieldOptions_JSType {
-    fn default() -> Self {
-        FieldOptions_JSType::JS_NORMAL
-    }
-}
-
-impl crate::reflect::ProtobufValue for FieldOptions_JSType {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.OneofOptions)
 pub struct OneofOptions {
     // message fields
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.OneofOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.OneofOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a OneofOptions {
@@ -6644,33 +5781,25 @@
         ::std::default::Default::default()
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &OneofOptions| { &m.uninterpreted_option },
+            |m: &mut OneofOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<OneofOptions>(
+            "OneofOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for OneofOptions {
+    const NAME: &'static str = "OneofOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -6680,15 +5809,14 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -6697,111 +5825,88 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> OneofOptions {
         OneofOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &OneofOptions| { &m.uninterpreted_option },
-                |m: &mut OneofOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<OneofOptions>(
-                "OneofOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.uninterpreted_option.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static OneofOptions {
-        static instance: crate::rt::LazyV2<OneofOptions> = crate::rt::LazyV2::INIT;
-        instance.get(OneofOptions::new)
+        static instance: OneofOptions = OneofOptions {
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for OneofOptions {
-    fn clear(&mut self) {
-        self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for OneofOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("OneofOptions").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for OneofOptions {
+impl ::std::fmt::Display for OneofOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for OneofOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.EnumOptions)
 pub struct EnumOptions {
     // message fields
-    allow_alias: ::std::option::Option<bool>,
-    deprecated: ::std::option::Option<bool>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  Set this option to true to allow mapping different tag names to the same
+    ///  value.
+    // @@protoc_insertion_point(field:google.protobuf.EnumOptions.allow_alias)
+    pub allow_alias: ::std::option::Option<bool>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.EnumOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.EnumOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.EnumOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a EnumOptions {
@@ -6817,10 +5922,10 @@
 
     // optional bool allow_alias = 2;
 
-
-    pub fn get_allow_alias(&self) -> bool {
+    pub fn allow_alias(&self) -> bool {
         self.allow_alias.unwrap_or(false)
     }
+
     pub fn clear_allow_alias(&mut self) {
         self.allow_alias = ::std::option::Option::None;
     }
@@ -6836,10 +5941,10 @@
 
     // optional bool deprecated = 3;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -6853,33 +5958,35 @@
         self.deprecated = ::std::option::Option::Some(v);
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(3);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "allow_alias",
+            |m: &EnumOptions| { &m.allow_alias },
+            |m: &mut EnumOptions| { &mut m.allow_alias },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &EnumOptions| { &m.deprecated },
+            |m: &mut EnumOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &EnumOptions| { &m.uninterpreted_option },
+            |m: &mut EnumOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<EnumOptions>(
+            "EnumOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for EnumOptions {
+    const NAME: &'static str = "EnumOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -6889,29 +5996,20 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.allow_alias = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                16 => {
+                    self.allow_alias = ::std::option::Option::Some(is.read_bool()?);
                 },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+                24 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -6920,24 +6018,24 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.allow_alias {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if let Some(v) = self.deprecated {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.allow_alias {
             os.write_bool(2, v)?;
         }
@@ -6945,109 +6043,75 @@
             os.write_bool(3, v)?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> EnumOptions {
         EnumOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "allow_alias",
-                |m: &EnumOptions| { &m.allow_alias },
-                |m: &mut EnumOptions| { &mut m.allow_alias },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &EnumOptions| { &m.deprecated },
-                |m: &mut EnumOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &EnumOptions| { &m.uninterpreted_option },
-                |m: &mut EnumOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<EnumOptions>(
-                "EnumOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static EnumOptions {
-        static instance: crate::rt::LazyV2<EnumOptions> = crate::rt::LazyV2::INIT;
-        instance.get(EnumOptions::new)
-    }
-}
-
-impl crate::Clear for EnumOptions {
     fn clear(&mut self) {
         self.allow_alias = ::std::option::Option::None;
         self.deprecated = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static EnumOptions {
+        static instance: EnumOptions = EnumOptions {
+            allow_alias: ::std::option::Option::None,
+            deprecated: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for EnumOptions {
+impl crate::MessageFull for EnumOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("EnumOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for EnumOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for EnumOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.EnumValueOptions)
 pub struct EnumValueOptions {
     // message fields
-    deprecated: ::std::option::Option<bool>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.EnumValueOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.EnumValueOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.EnumValueOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a EnumValueOptions {
@@ -7063,10 +6127,10 @@
 
     // optional bool deprecated = 1;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -7080,33 +6144,30 @@
         self.deprecated = ::std::option::Option::Some(v);
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &EnumValueOptions| { &m.deprecated },
+            |m: &mut EnumValueOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &EnumValueOptions| { &m.uninterpreted_option },
+            |m: &mut EnumValueOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<EnumValueOptions>(
+            "EnumValueOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for EnumValueOptions {
+    const NAME: &'static str = "EnumValueOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -7116,22 +6177,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -7140,122 +6196,92 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.deprecated {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.deprecated {
             os.write_bool(1, v)?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> EnumValueOptions {
         EnumValueOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &EnumValueOptions| { &m.deprecated },
-                |m: &mut EnumValueOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &EnumValueOptions| { &m.uninterpreted_option },
-                |m: &mut EnumValueOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<EnumValueOptions>(
-                "EnumValueOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static EnumValueOptions {
-        static instance: crate::rt::LazyV2<EnumValueOptions> = crate::rt::LazyV2::INIT;
-        instance.get(EnumValueOptions::new)
-    }
-}
-
-impl crate::Clear for EnumValueOptions {
     fn clear(&mut self) {
         self.deprecated = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static EnumValueOptions {
+        static instance: EnumValueOptions = EnumValueOptions {
+            deprecated: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for EnumValueOptions {
+impl crate::MessageFull for EnumValueOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("EnumValueOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for EnumValueOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for EnumValueOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.ServiceOptions)
 pub struct ServiceOptions {
     // message fields
-    deprecated: ::std::option::Option<bool>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.ServiceOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.ServiceOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.ServiceOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a ServiceOptions {
@@ -7271,10 +6297,10 @@
 
     // optional bool deprecated = 33;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -7288,33 +6314,30 @@
         self.deprecated = ::std::option::Option::Some(v);
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &ServiceOptions| { &m.deprecated },
+            |m: &mut ServiceOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &ServiceOptions| { &m.uninterpreted_option },
+            |m: &mut ServiceOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<ServiceOptions>(
+            "ServiceOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for ServiceOptions {
+    const NAME: &'static str = "ServiceOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -7324,22 +6347,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                33 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                264 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -7348,123 +6366,94 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.deprecated {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.deprecated {
             os.write_bool(33, v)?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> ServiceOptions {
         ServiceOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &ServiceOptions| { &m.deprecated },
-                |m: &mut ServiceOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &ServiceOptions| { &m.uninterpreted_option },
-                |m: &mut ServiceOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<ServiceOptions>(
-                "ServiceOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static ServiceOptions {
-        static instance: crate::rt::LazyV2<ServiceOptions> = crate::rt::LazyV2::INIT;
-        instance.get(ServiceOptions::new)
-    }
-}
-
-impl crate::Clear for ServiceOptions {
     fn clear(&mut self) {
         self.deprecated = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static ServiceOptions {
+        static instance: ServiceOptions = ServiceOptions {
+            deprecated: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for ServiceOptions {
+impl crate::MessageFull for ServiceOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("ServiceOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for ServiceOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for ServiceOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.MethodOptions)
 pub struct MethodOptions {
     // message fields
-    deprecated: ::std::option::Option<bool>,
-    idempotency_level: ::std::option::Option<MethodOptions_IdempotencyLevel>,
-    pub uninterpreted_option: crate::RepeatedField<UninterpretedOption>,
+    ///  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.
+    // @@protoc_insertion_point(field:google.protobuf.MethodOptions.deprecated)
+    pub deprecated: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:google.protobuf.MethodOptions.idempotency_level)
+    pub idempotency_level: ::std::option::Option<crate::EnumOrUnknown<method_options::IdempotencyLevel>>,
+    ///  The parser stores options it doesn't recognize here. See above.
+    // @@protoc_insertion_point(field:google.protobuf.MethodOptions.uninterpreted_option)
+    pub uninterpreted_option: ::std::vec::Vec<UninterpretedOption>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.MethodOptions.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a MethodOptions {
@@ -7480,10 +6469,10 @@
 
     // optional bool deprecated = 33;
 
-
-    pub fn get_deprecated(&self) -> bool {
+    pub fn deprecated(&self) -> bool {
         self.deprecated.unwrap_or(false)
     }
+
     pub fn clear_deprecated(&mut self) {
         self.deprecated = ::std::option::Option::None;
     }
@@ -7499,10 +6488,13 @@
 
     // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34;
 
-
-    pub fn get_idempotency_level(&self) -> MethodOptions_IdempotencyLevel {
-        self.idempotency_level.unwrap_or(MethodOptions_IdempotencyLevel::IDEMPOTENCY_UNKNOWN)
+    pub fn idempotency_level(&self) -> method_options::IdempotencyLevel {
+        match self.idempotency_level {
+            Some(e) => e.enum_value_or(method_options::IdempotencyLevel::IDEMPOTENCY_UNKNOWN),
+            None => method_options::IdempotencyLevel::IDEMPOTENCY_UNKNOWN,
+        }
     }
+
     pub fn clear_idempotency_level(&mut self) {
         self.idempotency_level = ::std::option::Option::None;
     }
@@ -7512,37 +6504,39 @@
     }
 
     // Param is passed by value, moved
-    pub fn set_idempotency_level(&mut self, v: MethodOptions_IdempotencyLevel) {
-        self.idempotency_level = ::std::option::Option::Some(v);
+    pub fn set_idempotency_level(&mut self, v: method_options::IdempotencyLevel) {
+        self.idempotency_level = ::std::option::Option::Some(crate::EnumOrUnknown::new(v));
     }
 
-    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-
-
-    pub fn get_uninterpreted_option(&self) -> &[UninterpretedOption] {
-        &self.uninterpreted_option
-    }
-    pub fn clear_uninterpreted_option(&mut self) {
-        self.uninterpreted_option.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_uninterpreted_option(&mut self, v: crate::RepeatedField<UninterpretedOption>) {
-        self.uninterpreted_option = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_uninterpreted_option(&mut self) -> &mut crate::RepeatedField<UninterpretedOption> {
-        &mut self.uninterpreted_option
-    }
-
-    // Take field
-    pub fn take_uninterpreted_option(&mut self) -> crate::RepeatedField<UninterpretedOption> {
-        ::std::mem::replace(&mut self.uninterpreted_option, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(3);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "deprecated",
+            |m: &MethodOptions| { &m.deprecated },
+            |m: &mut MethodOptions| { &mut m.deprecated },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "idempotency_level",
+            |m: &MethodOptions| { &m.idempotency_level },
+            |m: &mut MethodOptions| { &mut m.idempotency_level },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "uninterpreted_option",
+            |m: &MethodOptions| { &m.uninterpreted_option },
+            |m: &mut MethodOptions| { &mut m.uninterpreted_option },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<MethodOptions>(
+            "MethodOptions",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for MethodOptions {
+    const NAME: &'static str = "MethodOptions";
+
     fn is_initialized(&self) -> bool {
         for v in &self.uninterpreted_option {
             if !v.is_initialized() {
@@ -7552,25 +6546,20 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                33 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.deprecated = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                264 => {
+                    self.deprecated = ::std::option::Option::Some(is.read_bool()?);
                 },
-                34 => {
-                    crate::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.idempotency_level, 34, &mut self.unknown_fields)?
+                272 => {
+                    self.idempotency_level = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                999 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.uninterpreted_option)?;
+                7994 => {
+                    self.uninterpreted_option.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -7579,193 +6568,177 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.deprecated {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.idempotency_level {
-            my_size += crate::rt::enum_size(34, v);
+            my_size += crate::rt::int32_size(34, v.value());
         }
         for value in &self.uninterpreted_option {
             let len = value.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.deprecated {
             os.write_bool(33, v)?;
         }
         if let Some(v) = self.idempotency_level {
-            os.write_enum(34, crate::ProtobufEnum::value(&v))?;
+            os.write_enum(34, crate::EnumOrUnknown::value(&v))?;
         }
         for v in &self.uninterpreted_option {
-            os.write_tag(999, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(999, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> MethodOptions {
         MethodOptions::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
-                "deprecated",
-                |m: &MethodOptions| { &m.deprecated },
-                |m: &mut MethodOptions| { &mut m.deprecated },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeEnum<MethodOptions_IdempotencyLevel>>(
-                "idempotency_level",
-                |m: &MethodOptions| { &m.idempotency_level },
-                |m: &mut MethodOptions| { &mut m.idempotency_level },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption>>(
-                "uninterpreted_option",
-                |m: &MethodOptions| { &m.uninterpreted_option },
-                |m: &mut MethodOptions| { &mut m.uninterpreted_option },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<MethodOptions>(
-                "MethodOptions",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static MethodOptions {
-        static instance: crate::rt::LazyV2<MethodOptions> = crate::rt::LazyV2::INIT;
-        instance.get(MethodOptions::new)
-    }
-}
-
-impl crate::Clear for MethodOptions {
     fn clear(&mut self) {
         self.deprecated = ::std::option::Option::None;
         self.idempotency_level = ::std::option::Option::None;
         self.uninterpreted_option.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static MethodOptions {
+        static instance: MethodOptions = MethodOptions {
+            deprecated: ::std::option::Option::None,
+            idempotency_level: ::std::option::Option::None,
+            uninterpreted_option: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for MethodOptions {
+impl crate::MessageFull for MethodOptions {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("MethodOptions").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for MethodOptions {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for MethodOptions {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum MethodOptions_IdempotencyLevel {
-    IDEMPOTENCY_UNKNOWN = 0,
-    NO_SIDE_EFFECTS = 1,
-    IDEMPOTENT = 2,
-}
-
-impl crate::ProtobufEnum for MethodOptions_IdempotencyLevel {
-    fn value(&self) -> i32 {
-        *self as i32
+/// Nested message and enums of message `MethodOptions`
+pub mod method_options {
+    ///  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.
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.MethodOptions.IdempotencyLevel)
+    pub enum IdempotencyLevel {
+        // @@protoc_insertion_point(enum_value:google.protobuf.MethodOptions.IdempotencyLevel.IDEMPOTENCY_UNKNOWN)
+        IDEMPOTENCY_UNKNOWN = 0,
+        // @@protoc_insertion_point(enum_value:google.protobuf.MethodOptions.IdempotencyLevel.NO_SIDE_EFFECTS)
+        NO_SIDE_EFFECTS = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.MethodOptions.IdempotencyLevel.IDEMPOTENT)
+        IDEMPOTENT = 2,
     }
 
-    fn from_i32(value: i32) -> ::std::option::Option<MethodOptions_IdempotencyLevel> {
-        match value {
-            0 => ::std::option::Option::Some(MethodOptions_IdempotencyLevel::IDEMPOTENCY_UNKNOWN),
-            1 => ::std::option::Option::Some(MethodOptions_IdempotencyLevel::NO_SIDE_EFFECTS),
-            2 => ::std::option::Option::Some(MethodOptions_IdempotencyLevel::IDEMPOTENT),
-            _ => ::std::option::Option::None
+    impl crate::Enum for IdempotencyLevel {
+        const NAME: &'static str = "IdempotencyLevel";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<IdempotencyLevel> {
+            match value {
+                0 => ::std::option::Option::Some(IdempotencyLevel::IDEMPOTENCY_UNKNOWN),
+                1 => ::std::option::Option::Some(IdempotencyLevel::NO_SIDE_EFFECTS),
+                2 => ::std::option::Option::Some(IdempotencyLevel::IDEMPOTENT),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [IdempotencyLevel] = &[
+            IdempotencyLevel::IDEMPOTENCY_UNKNOWN,
+            IdempotencyLevel::NO_SIDE_EFFECTS,
+            IdempotencyLevel::IDEMPOTENT,
+        ];
+    }
+
+    impl crate::EnumFull for IdempotencyLevel {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("MethodOptions.IdempotencyLevel").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = *self as usize;
+            Self::enum_descriptor().value_by_index(index)
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [MethodOptions_IdempotencyLevel] = &[
-            MethodOptions_IdempotencyLevel::IDEMPOTENCY_UNKNOWN,
-            MethodOptions_IdempotencyLevel::NO_SIDE_EFFECTS,
-            MethodOptions_IdempotencyLevel::IDEMPOTENT,
-        ];
-        values
+    impl ::std::default::Default for IdempotencyLevel {
+        fn default() -> Self {
+            IdempotencyLevel::IDEMPOTENCY_UNKNOWN
+        }
     }
 
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<MethodOptions_IdempotencyLevel>("MethodOptions.IdempotencyLevel", file_descriptor_proto())
-        })
+    impl IdempotencyLevel {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<IdempotencyLevel>("MethodOptions.IdempotencyLevel")
+        }
     }
 }
 
-impl ::std::marker::Copy for MethodOptions_IdempotencyLevel {
-}
-
-impl ::std::default::Default for MethodOptions_IdempotencyLevel {
-    fn default() -> Self {
-        MethodOptions_IdempotencyLevel::IDEMPOTENCY_UNKNOWN
-    }
-}
-
-impl crate::reflect::ProtobufValue for MethodOptions_IdempotencyLevel {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  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.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.UninterpretedOption)
 pub struct UninterpretedOption {
     // message fields
-    pub name: crate::RepeatedField<UninterpretedOption_NamePart>,
-    identifier_value: crate::SingularField<::std::string::String>,
-    positive_int_value: ::std::option::Option<u64>,
-    negative_int_value: ::std::option::Option<i64>,
-    double_value: ::std::option::Option<f64>,
-    string_value: crate::SingularField<::std::vec::Vec<u8>>,
-    aggregate_value: crate::SingularField<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.name)
+    pub name: ::std::vec::Vec<uninterpreted_option::NamePart>,
+    ///  The value of the uninterpreted option, in whatever type the tokenizer
+    ///  identified it as during parsing. Exactly one of these should be set.
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.identifier_value)
+    pub identifier_value: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.positive_int_value)
+    pub positive_int_value: ::std::option::Option<u64>,
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.negative_int_value)
+    pub negative_int_value: ::std::option::Option<i64>,
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.double_value)
+    pub double_value: ::std::option::Option<f64>,
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.string_value)
+    pub string_value: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.aggregate_value)
+    pub aggregate_value: ::std::option::Option<::std::string::String>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.UninterpretedOption.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a UninterpretedOption {
@@ -7779,42 +6752,17 @@
         ::std::default::Default::default()
     }
 
-    // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
-
-
-    pub fn get_name(&self) -> &[UninterpretedOption_NamePart] {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: crate::RepeatedField<UninterpretedOption_NamePart>) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_name(&mut self) -> &mut crate::RepeatedField<UninterpretedOption_NamePart> {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> crate::RepeatedField<UninterpretedOption_NamePart> {
-        ::std::mem::replace(&mut self.name, crate::RepeatedField::new())
-    }
-
     // optional string identifier_value = 3;
 
-
-    pub fn get_identifier_value(&self) -> &str {
+    pub fn identifier_value(&self) -> &str {
         match self.identifier_value.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_identifier_value(&mut self) {
-        self.identifier_value.clear();
+        self.identifier_value = ::std::option::Option::None;
     }
 
     pub fn has_identifier_value(&self) -> bool {
@@ -7823,14 +6771,14 @@
 
     // Param is passed by value, moved
     pub fn set_identifier_value(&mut self, v: ::std::string::String) {
-        self.identifier_value = crate::SingularField::some(v);
+        self.identifier_value = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_identifier_value(&mut self) -> &mut ::std::string::String {
         if self.identifier_value.is_none() {
-            self.identifier_value.set_default();
+            self.identifier_value = ::std::option::Option::Some(::std::string::String::new());
         }
         self.identifier_value.as_mut().unwrap()
     }
@@ -7842,10 +6790,10 @@
 
     // optional uint64 positive_int_value = 4;
 
-
-    pub fn get_positive_int_value(&self) -> u64 {
+    pub fn positive_int_value(&self) -> u64 {
         self.positive_int_value.unwrap_or(0)
     }
+
     pub fn clear_positive_int_value(&mut self) {
         self.positive_int_value = ::std::option::Option::None;
     }
@@ -7861,10 +6809,10 @@
 
     // optional int64 negative_int_value = 5;
 
-
-    pub fn get_negative_int_value(&self) -> i64 {
+    pub fn negative_int_value(&self) -> i64 {
         self.negative_int_value.unwrap_or(0)
     }
+
     pub fn clear_negative_int_value(&mut self) {
         self.negative_int_value = ::std::option::Option::None;
     }
@@ -7880,10 +6828,10 @@
 
     // optional double double_value = 6;
 
-
-    pub fn get_double_value(&self) -> f64 {
+    pub fn double_value(&self) -> f64 {
         self.double_value.unwrap_or(0.)
     }
+
     pub fn clear_double_value(&mut self) {
         self.double_value = ::std::option::Option::None;
     }
@@ -7899,15 +6847,15 @@
 
     // optional bytes string_value = 7;
 
-
-    pub fn get_string_value(&self) -> &[u8] {
+    pub fn string_value(&self) -> &[u8] {
         match self.string_value.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_string_value(&mut self) {
-        self.string_value.clear();
+        self.string_value = ::std::option::Option::None;
     }
 
     pub fn has_string_value(&self) -> bool {
@@ -7916,14 +6864,14 @@
 
     // Param is passed by value, moved
     pub fn set_string_value(&mut self, v: ::std::vec::Vec<u8>) {
-        self.string_value = crate::SingularField::some(v);
+        self.string_value = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_string_value(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.string_value.is_none() {
-            self.string_value.set_default();
+            self.string_value = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.string_value.as_mut().unwrap()
     }
@@ -7935,15 +6883,15 @@
 
     // optional string aggregate_value = 8;
 
-
-    pub fn get_aggregate_value(&self) -> &str {
+    pub fn aggregate_value(&self) -> &str {
         match self.aggregate_value.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_aggregate_value(&mut self) {
-        self.aggregate_value.clear();
+        self.aggregate_value = ::std::option::Option::None;
     }
 
     pub fn has_aggregate_value(&self) -> bool {
@@ -7952,14 +6900,14 @@
 
     // Param is passed by value, moved
     pub fn set_aggregate_value(&mut self, v: ::std::string::String) {
-        self.aggregate_value = crate::SingularField::some(v);
+        self.aggregate_value = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_aggregate_value(&mut self) -> &mut ::std::string::String {
         if self.aggregate_value.is_none() {
-            self.aggregate_value.set_default();
+            self.aggregate_value = ::std::option::Option::Some(::std::string::String::new());
         }
         self.aggregate_value.as_mut().unwrap()
     }
@@ -7968,9 +6916,56 @@
     pub fn take_aggregate_value(&mut self) -> ::std::string::String {
         self.aggregate_value.take().unwrap_or_else(|| ::std::string::String::new())
     }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(7);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "name",
+            |m: &UninterpretedOption| { &m.name },
+            |m: &mut UninterpretedOption| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "identifier_value",
+            |m: &UninterpretedOption| { &m.identifier_value },
+            |m: &mut UninterpretedOption| { &mut m.identifier_value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "positive_int_value",
+            |m: &UninterpretedOption| { &m.positive_int_value },
+            |m: &mut UninterpretedOption| { &mut m.positive_int_value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "negative_int_value",
+            |m: &UninterpretedOption| { &m.negative_int_value },
+            |m: &mut UninterpretedOption| { &mut m.negative_int_value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "double_value",
+            |m: &UninterpretedOption| { &m.double_value },
+            |m: &mut UninterpretedOption| { &mut m.double_value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "string_value",
+            |m: &UninterpretedOption| { &m.string_value },
+            |m: &mut UninterpretedOption| { &mut m.string_value },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "aggregate_value",
+            |m: &UninterpretedOption| { &m.aggregate_value },
+            |m: &mut UninterpretedOption| { &mut m.aggregate_value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<UninterpretedOption>(
+            "UninterpretedOption",
+            fields,
+            oneofs,
+        )
+    }
 }
 
 impl crate::Message for UninterpretedOption {
+    const NAME: &'static str = "UninterpretedOption";
+
     fn is_initialized(&self) -> bool {
         for v in &self.name {
             if !v.is_initialized() {
@@ -7980,45 +6975,32 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                18 => {
+                    self.name.push(is.read_message()?);
                 },
-                3 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.identifier_value)?;
+                26 => {
+                    self.identifier_value = ::std::option::Option::Some(is.read_string()?);
                 },
-                4 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_uint64()?;
-                    self.positive_int_value = ::std::option::Option::Some(tmp);
+                32 => {
+                    self.positive_int_value = ::std::option::Option::Some(is.read_uint64()?);
                 },
-                5 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.negative_int_value = ::std::option::Option::Some(tmp);
+                40 => {
+                    self.negative_int_value = ::std::option::Option::Some(is.read_int64()?);
                 },
-                6 => {
-                    if wire_type != crate::wire_format::WireTypeFixed64 {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_double()?;
-                    self.double_value = ::std::option::Option::Some(tmp);
+                49 => {
+                    self.double_value = ::std::option::Option::Some(is.read_double()?);
                 },
-                7 => {
-                    crate::rt::read_singular_bytes_into(wire_type, is, &mut self.string_value)?;
+                58 => {
+                    self.string_value = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                8 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.aggregate_value)?;
+                66 => {
+                    self.aggregate_value = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -8027,43 +7009,41 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.name {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.identifier_value.as_ref() {
+        if let Some(v) = self.identifier_value.as_ref() {
             my_size += crate::rt::string_size(3, &v);
         }
         if let Some(v) = self.positive_int_value {
-            my_size += crate::rt::value_size(4, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::uint64_size(4, v);
         }
         if let Some(v) = self.negative_int_value {
-            my_size += crate::rt::value_size(5, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int64_size(5, v);
         }
         if let Some(v) = self.double_value {
-            my_size += 9;
+            my_size += 1 + 8;
         }
-        if let Some(ref v) = self.string_value.as_ref() {
+        if let Some(v) = self.string_value.as_ref() {
             my_size += crate::rt::bytes_size(7, &v);
         }
-        if let Some(ref v) = self.aggregate_value.as_ref() {
+        if let Some(v) = self.aggregate_value.as_ref() {
             my_size += crate::rt::string_size(8, &v);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.name {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
         };
-        if let Some(ref v) = self.identifier_value.as_ref() {
-            os.write_string(3, &v)?;
+        if let Some(v) = self.identifier_value.as_ref() {
+            os.write_string(3, v)?;
         }
         if let Some(v) = self.positive_int_value {
             os.write_uint64(4, v)?;
@@ -8074,351 +7054,291 @@
         if let Some(v) = self.double_value {
             os.write_double(6, v)?;
         }
-        if let Some(ref v) = self.string_value.as_ref() {
-            os.write_bytes(7, &v)?;
+        if let Some(v) = self.string_value.as_ref() {
+            os.write_bytes(7, v)?;
         }
-        if let Some(ref v) = self.aggregate_value.as_ref() {
-            os.write_string(8, &v)?;
+        if let Some(v) = self.aggregate_value.as_ref() {
+            os.write_string(8, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> UninterpretedOption {
         UninterpretedOption::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<UninterpretedOption_NamePart>>(
-                "name",
-                |m: &UninterpretedOption| { &m.name },
-                |m: &mut UninterpretedOption| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "identifier_value",
-                |m: &UninterpretedOption| { &m.identifier_value },
-                |m: &mut UninterpretedOption| { &mut m.identifier_value },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeUint64>(
-                "positive_int_value",
-                |m: &UninterpretedOption| { &m.positive_int_value },
-                |m: &mut UninterpretedOption| { &mut m.positive_int_value },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt64>(
-                "negative_int_value",
-                |m: &UninterpretedOption| { &m.negative_int_value },
-                |m: &mut UninterpretedOption| { &mut m.negative_int_value },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeDouble>(
-                "double_value",
-                |m: &UninterpretedOption| { &m.double_value },
-                |m: &mut UninterpretedOption| { &mut m.double_value },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeBytes>(
-                "string_value",
-                |m: &UninterpretedOption| { &m.string_value },
-                |m: &mut UninterpretedOption| { &mut m.string_value },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "aggregate_value",
-                |m: &UninterpretedOption| { &m.aggregate_value },
-                |m: &mut UninterpretedOption| { &mut m.aggregate_value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<UninterpretedOption>(
-                "UninterpretedOption",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static UninterpretedOption {
-        static instance: crate::rt::LazyV2<UninterpretedOption> = crate::rt::LazyV2::INIT;
-        instance.get(UninterpretedOption::new)
-    }
-}
-
-impl crate::Clear for UninterpretedOption {
     fn clear(&mut self) {
         self.name.clear();
-        self.identifier_value.clear();
+        self.identifier_value = ::std::option::Option::None;
         self.positive_int_value = ::std::option::Option::None;
         self.negative_int_value = ::std::option::Option::None;
         self.double_value = ::std::option::Option::None;
-        self.string_value.clear();
-        self.aggregate_value.clear();
-        self.unknown_fields.clear();
+        self.string_value = ::std::option::Option::None;
+        self.aggregate_value = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static UninterpretedOption {
+        static instance: UninterpretedOption = UninterpretedOption {
+            name: ::std::vec::Vec::new(),
+            identifier_value: ::std::option::Option::None,
+            positive_int_value: ::std::option::Option::None,
+            negative_int_value: ::std::option::Option::None,
+            double_value: ::std::option::Option::None,
+            string_value: ::std::option::Option::None,
+            aggregate_value: ::std::option::Option::None,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for UninterpretedOption {
+impl crate::MessageFull for UninterpretedOption {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("UninterpretedOption").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for UninterpretedOption {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for UninterpretedOption {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct UninterpretedOption_NamePart {
-    // message fields
-    name_part: crate::SingularField<::std::string::String>,
-    is_extension: ::std::option::Option<bool>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a UninterpretedOption_NamePart {
-    fn default() -> &'a UninterpretedOption_NamePart {
-        <UninterpretedOption_NamePart as crate::Message>::default_instance()
-    }
-}
-
-impl UninterpretedOption_NamePart {
-    pub fn new() -> UninterpretedOption_NamePart {
-        ::std::default::Default::default()
+/// Nested message and enums of message `UninterpretedOption`
+pub mod uninterpreted_option {
+    ///  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".
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.UninterpretedOption.NamePart)
+    pub struct NamePart {
+        // message fields
+        // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.NamePart.name_part)
+        pub name_part: ::std::option::Option<::std::string::String>,
+        // @@protoc_insertion_point(field:google.protobuf.UninterpretedOption.NamePart.is_extension)
+        pub is_extension: ::std::option::Option<bool>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.UninterpretedOption.NamePart.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    // required string name_part = 1;
-
-
-    pub fn get_name_part(&self) -> &str {
-        match self.name_part.as_ref() {
-            Some(v) => &v,
-            None => "",
+    impl<'a> ::std::default::Default for &'a NamePart {
+        fn default() -> &'a NamePart {
+            <NamePart as crate::Message>::default_instance()
         }
     }
-    pub fn clear_name_part(&mut self) {
-        self.name_part.clear();
-    }
 
-    pub fn has_name_part(&self) -> bool {
-        self.name_part.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name_part(&mut self, v: ::std::string::String) {
-        self.name_part = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name_part(&mut self) -> &mut ::std::string::String {
-        if self.name_part.is_none() {
-            self.name_part.set_default();
+    impl NamePart {
+        pub fn new() -> NamePart {
+            ::std::default::Default::default()
         }
-        self.name_part.as_mut().unwrap()
-    }
 
-    // Take field
-    pub fn take_name_part(&mut self) -> ::std::string::String {
-        self.name_part.take().unwrap_or_else(|| ::std::string::String::new())
-    }
+        // required string name_part = 1;
 
-    // required bool is_extension = 2;
-
-
-    pub fn get_is_extension(&self) -> bool {
-        self.is_extension.unwrap_or(false)
-    }
-    pub fn clear_is_extension(&mut self) {
-        self.is_extension = ::std::option::Option::None;
-    }
-
-    pub fn has_is_extension(&self) -> bool {
-        self.is_extension.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_is_extension(&mut self, v: bool) {
-        self.is_extension = ::std::option::Option::Some(v);
-    }
-}
-
-impl crate::Message for UninterpretedOption_NamePart {
-    fn is_initialized(&self) -> bool {
-        if self.name_part.is_none() {
-            return false;
+        pub fn name_part(&self) -> &str {
+            match self.name_part.as_ref() {
+                Some(v) => v,
+                None => "",
+            }
         }
-        if self.is_extension.is_none() {
-            return false;
+
+        pub fn clear_name_part(&mut self) {
+            self.name_part = ::std::option::Option::None;
         }
-        true
-    }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name_part)?;
-                },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.is_extension = ::std::option::Option::Some(tmp);
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
+        pub fn has_name_part(&self) -> bool {
+            self.name_part.is_some()
         }
-        ::std::result::Result::Ok(())
-    }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let Some(ref v) = self.name_part.as_ref() {
-            my_size += crate::rt::string_size(1, &v);
+        // Param is passed by value, moved
+        pub fn set_name_part(&mut self, v: ::std::string::String) {
+            self.name_part = ::std::option::Option::Some(v);
         }
-        if let Some(v) = self.is_extension {
-            my_size += 2;
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_name_part(&mut self) -> &mut ::std::string::String {
+            if self.name_part.is_none() {
+                self.name_part = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.name_part.as_mut().unwrap()
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name_part.as_ref() {
-            os.write_string(1, &v)?;
+        // Take field
+        pub fn take_name_part(&mut self) -> ::std::string::String {
+            self.name_part.take().unwrap_or_else(|| ::std::string::String::new())
         }
-        if let Some(v) = self.is_extension {
-            os.write_bool(2, v)?;
+
+        // required bool is_extension = 2;
+
+        pub fn is_extension(&self) -> bool {
+            self.is_extension.unwrap_or(false)
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
+        pub fn clear_is_extension(&mut self) {
+            self.is_extension = ::std::option::Option::None;
+        }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
+        pub fn has_is_extension(&self) -> bool {
+            self.is_extension.is_some()
+        }
 
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
+        // Param is passed by value, moved
+        pub fn set_is_extension(&mut self, v: bool) {
+            self.is_extension = ::std::option::Option::Some(v);
+        }
 
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> UninterpretedOption_NamePart {
-        UninterpretedOption_NamePart::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(2);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "name_part",
-                |m: &UninterpretedOption_NamePart| { &m.name_part },
-                |m: &mut UninterpretedOption_NamePart| { &mut m.name_part },
+                |m: &NamePart| { &m.name_part },
+                |m: &mut NamePart| { &mut m.name_part },
             ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeBool>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "is_extension",
-                |m: &UninterpretedOption_NamePart| { &m.is_extension },
-                |m: &mut UninterpretedOption_NamePart| { &mut m.is_extension },
+                |m: &NamePart| { &m.is_extension },
+                |m: &mut NamePart| { &mut m.is_extension },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<UninterpretedOption_NamePart>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<NamePart>(
                 "UninterpretedOption.NamePart",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
+        }
     }
 
-    fn default_instance() -> &'static UninterpretedOption_NamePart {
-        static instance: crate::rt::LazyV2<UninterpretedOption_NamePart> = crate::rt::LazyV2::INIT;
-        instance.get(UninterpretedOption_NamePart::new)
+    impl crate::Message for NamePart {
+        const NAME: &'static str = "NamePart";
+
+        fn is_initialized(&self) -> bool {
+            if self.name_part.is_none() {
+                return false;
+            }
+            if self.is_extension.is_none() {
+                return false;
+            }
+            true
+        }
+
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    10 => {
+                        self.name_part = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    16 => {
+                        self.is_extension = ::std::option::Option::Some(is.read_bool()?);
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            if let Some(v) = self.name_part.as_ref() {
+                my_size += crate::rt::string_size(1, &v);
+            }
+            if let Some(v) = self.is_extension {
+                my_size += 1 + 1;
+            }
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            if let Some(v) = self.name_part.as_ref() {
+                os.write_string(1, v)?;
+            }
+            if let Some(v) = self.is_extension {
+                os.write_bool(2, v)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> NamePart {
+            NamePart::new()
+        }
+
+        fn clear(&mut self) {
+            self.name_part = ::std::option::Option::None;
+            self.is_extension = ::std::option::Option::None;
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static NamePart {
+            static instance: NamePart = NamePart {
+                name_part: ::std::option::Option::None,
+                is_extension: ::std::option::Option::None,
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
+    }
+
+    impl crate::MessageFull for NamePart {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("UninterpretedOption.NamePart").unwrap()).clone()
+        }
+    }
+
+    impl ::std::fmt::Display for NamePart {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
+    }
+
+    impl crate::reflect::ProtobufValue for NamePart {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
     }
 }
 
-impl crate::Clear for UninterpretedOption_NamePart {
-    fn clear(&mut self) {
-        self.name_part.clear();
-        self.is_extension = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for UninterpretedOption_NamePart {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for UninterpretedOption_NamePart {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Encapsulates information about the original source file from which a
+///  FileDescriptorProto was generated.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.SourceCodeInfo)
 pub struct SourceCodeInfo {
     // message fields
-    pub location: crate::RepeatedField<SourceCodeInfo_Location>,
+    // @@protoc_insertion_point(field:google.protobuf.SourceCodeInfo.location)
+    pub location: ::std::vec::Vec<source_code_info::Location>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.SourceCodeInfo.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a SourceCodeInfo {
@@ -8432,51 +7352,37 @@
         ::std::default::Default::default()
     }
 
-    // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
-
-
-    pub fn get_location(&self) -> &[SourceCodeInfo_Location] {
-        &self.location
-    }
-    pub fn clear_location(&mut self) {
-        self.location.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_location(&mut self, v: crate::RepeatedField<SourceCodeInfo_Location>) {
-        self.location = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_location(&mut self) -> &mut crate::RepeatedField<SourceCodeInfo_Location> {
-        &mut self.location
-    }
-
-    // Take field
-    pub fn take_location(&mut self) -> crate::RepeatedField<SourceCodeInfo_Location> {
-        ::std::mem::replace(&mut self.location, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "location",
+            |m: &SourceCodeInfo| { &m.location },
+            |m: &mut SourceCodeInfo| { &mut m.location },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<SourceCodeInfo>(
+            "SourceCodeInfo",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for SourceCodeInfo {
+    const NAME: &'static str = "SourceCodeInfo";
+
     fn is_initialized(&self) -> bool {
-        for v in &self.location {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.location)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.location.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -8485,466 +7391,354 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.location {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.location {
-            os.write_tag(1, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(1, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> SourceCodeInfo {
         SourceCodeInfo::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<SourceCodeInfo_Location>>(
-                "location",
-                |m: &SourceCodeInfo| { &m.location },
-                |m: &mut SourceCodeInfo| { &mut m.location },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<SourceCodeInfo>(
-                "SourceCodeInfo",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.location.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static SourceCodeInfo {
-        static instance: crate::rt::LazyV2<SourceCodeInfo> = crate::rt::LazyV2::INIT;
-        instance.get(SourceCodeInfo::new)
+        static instance: SourceCodeInfo = SourceCodeInfo {
+            location: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for SourceCodeInfo {
-    fn clear(&mut self) {
-        self.location.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for SourceCodeInfo {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("SourceCodeInfo").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for SourceCodeInfo {
+impl ::std::fmt::Display for SourceCodeInfo {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for SourceCodeInfo {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct SourceCodeInfo_Location {
-    // message fields
-    pub path: ::std::vec::Vec<i32>,
-    pub span: ::std::vec::Vec<i32>,
-    leading_comments: crate::SingularField<::std::string::String>,
-    trailing_comments: crate::SingularField<::std::string::String>,
-    pub leading_detached_comments: crate::RepeatedField<::std::string::String>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a SourceCodeInfo_Location {
-    fn default() -> &'a SourceCodeInfo_Location {
-        <SourceCodeInfo_Location as crate::Message>::default_instance()
-    }
-}
-
-impl SourceCodeInfo_Location {
-    pub fn new() -> SourceCodeInfo_Location {
-        ::std::default::Default::default()
+/// Nested message and enums of message `SourceCodeInfo`
+pub mod source_code_info {
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.SourceCodeInfo.Location)
+    pub struct Location {
+        // message fields
+        // @@protoc_insertion_point(field:google.protobuf.SourceCodeInfo.Location.path)
+        pub path: ::std::vec::Vec<i32>,
+        ///  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.
+        // @@protoc_insertion_point(field:google.protobuf.SourceCodeInfo.Location.span)
+        pub span: ::std::vec::Vec<i32>,
+        // @@protoc_insertion_point(field:google.protobuf.SourceCodeInfo.Location.leading_comments)
+        pub leading_comments: ::std::option::Option<::std::string::String>,
+        // @@protoc_insertion_point(field:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+        pub trailing_comments: ::std::option::Option<::std::string::String>,
+        // @@protoc_insertion_point(field:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+        pub leading_detached_comments: ::std::vec::Vec<::std::string::String>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.SourceCodeInfo.Location.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    // repeated int32 path = 1;
-
-
-    pub fn get_path(&self) -> &[i32] {
-        &self.path
-    }
-    pub fn clear_path(&mut self) {
-        self.path.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_path(&mut self, v: ::std::vec::Vec<i32>) {
-        self.path = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_path(&mut self) -> &mut ::std::vec::Vec<i32> {
-        &mut self.path
-    }
-
-    // Take field
-    pub fn take_path(&mut self) -> ::std::vec::Vec<i32> {
-        ::std::mem::replace(&mut self.path, ::std::vec::Vec::new())
-    }
-
-    // repeated int32 span = 2;
-
-
-    pub fn get_span(&self) -> &[i32] {
-        &self.span
-    }
-    pub fn clear_span(&mut self) {
-        self.span.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_span(&mut self, v: ::std::vec::Vec<i32>) {
-        self.span = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_span(&mut self) -> &mut ::std::vec::Vec<i32> {
-        &mut self.span
-    }
-
-    // Take field
-    pub fn take_span(&mut self) -> ::std::vec::Vec<i32> {
-        ::std::mem::replace(&mut self.span, ::std::vec::Vec::new())
-    }
-
-    // optional string leading_comments = 3;
-
-
-    pub fn get_leading_comments(&self) -> &str {
-        match self.leading_comments.as_ref() {
-            Some(v) => &v,
-            None => "",
+    impl<'a> ::std::default::Default for &'a Location {
+        fn default() -> &'a Location {
+            <Location as crate::Message>::default_instance()
         }
     }
-    pub fn clear_leading_comments(&mut self) {
-        self.leading_comments.clear();
-    }
 
-    pub fn has_leading_comments(&self) -> bool {
-        self.leading_comments.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_leading_comments(&mut self, v: ::std::string::String) {
-        self.leading_comments = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_leading_comments(&mut self) -> &mut ::std::string::String {
-        if self.leading_comments.is_none() {
-            self.leading_comments.set_default();
+    impl Location {
+        pub fn new() -> Location {
+            ::std::default::Default::default()
         }
-        self.leading_comments.as_mut().unwrap()
-    }
 
-    // Take field
-    pub fn take_leading_comments(&mut self) -> ::std::string::String {
-        self.leading_comments.take().unwrap_or_else(|| ::std::string::String::new())
-    }
+        // optional string leading_comments = 3;
 
-    // optional string trailing_comments = 4;
-
-
-    pub fn get_trailing_comments(&self) -> &str {
-        match self.trailing_comments.as_ref() {
-            Some(v) => &v,
-            None => "",
+        pub fn leading_comments(&self) -> &str {
+            match self.leading_comments.as_ref() {
+                Some(v) => v,
+                None => "",
+            }
         }
-    }
-    pub fn clear_trailing_comments(&mut self) {
-        self.trailing_comments.clear();
-    }
 
-    pub fn has_trailing_comments(&self) -> bool {
-        self.trailing_comments.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_trailing_comments(&mut self, v: ::std::string::String) {
-        self.trailing_comments = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_trailing_comments(&mut self) -> &mut ::std::string::String {
-        if self.trailing_comments.is_none() {
-            self.trailing_comments.set_default();
+        pub fn clear_leading_comments(&mut self) {
+            self.leading_comments = ::std::option::Option::None;
         }
-        self.trailing_comments.as_mut().unwrap()
-    }
 
-    // Take field
-    pub fn take_trailing_comments(&mut self) -> ::std::string::String {
-        self.trailing_comments.take().unwrap_or_else(|| ::std::string::String::new())
-    }
-
-    // repeated string leading_detached_comments = 6;
-
-
-    pub fn get_leading_detached_comments(&self) -> &[::std::string::String] {
-        &self.leading_detached_comments
-    }
-    pub fn clear_leading_detached_comments(&mut self) {
-        self.leading_detached_comments.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_leading_detached_comments(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.leading_detached_comments = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_leading_detached_comments(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.leading_detached_comments
-    }
-
-    // Take field
-    pub fn take_leading_detached_comments(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.leading_detached_comments, crate::RepeatedField::new())
-    }
-}
-
-impl crate::Message for SourceCodeInfo_Location {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_int32_into(wire_type, is, &mut self.path)?;
-                },
-                2 => {
-                    crate::rt::read_repeated_int32_into(wire_type, is, &mut self.span)?;
-                },
-                3 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.leading_comments)?;
-                },
-                4 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.trailing_comments)?;
-                },
-                6 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.leading_detached_comments)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
+        pub fn has_leading_comments(&self) -> bool {
+            self.leading_comments.is_some()
         }
-        ::std::result::Result::Ok(())
-    }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.path.is_empty() {
-            my_size += crate::rt::vec_packed_varint_size(1, &self.path);
+        // Param is passed by value, moved
+        pub fn set_leading_comments(&mut self, v: ::std::string::String) {
+            self.leading_comments = ::std::option::Option::Some(v);
         }
-        if !self.span.is_empty() {
-            my_size += crate::rt::vec_packed_varint_size(2, &self.span);
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_leading_comments(&mut self) -> &mut ::std::string::String {
+            if self.leading_comments.is_none() {
+                self.leading_comments = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.leading_comments.as_mut().unwrap()
         }
-        if let Some(ref v) = self.leading_comments.as_ref() {
-            my_size += crate::rt::string_size(3, &v);
+
+        // Take field
+        pub fn take_leading_comments(&mut self) -> ::std::string::String {
+            self.leading_comments.take().unwrap_or_else(|| ::std::string::String::new())
         }
-        if let Some(ref v) = self.trailing_comments.as_ref() {
-            my_size += crate::rt::string_size(4, &v);
+
+        // optional string trailing_comments = 4;
+
+        pub fn trailing_comments(&self) -> &str {
+            match self.trailing_comments.as_ref() {
+                Some(v) => v,
+                None => "",
+            }
         }
-        for value in &self.leading_detached_comments {
-            my_size += crate::rt::string_size(6, &value);
-        };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if !self.path.is_empty() {
-            os.write_tag(1, crate::wire_format::WireTypeLengthDelimited)?;
-            // TODO: Data size is computed again, it should be cached
-            os.write_raw_varint32(crate::rt::vec_packed_varint_data_size(&self.path))?;
-            for v in &self.path {
-                os.write_int32_no_tag(*v)?;
-            };
+        pub fn clear_trailing_comments(&mut self) {
+            self.trailing_comments = ::std::option::Option::None;
         }
-        if !self.span.is_empty() {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            // TODO: Data size is computed again, it should be cached
-            os.write_raw_varint32(crate::rt::vec_packed_varint_data_size(&self.span))?;
-            for v in &self.span {
-                os.write_int32_no_tag(*v)?;
-            };
+
+        pub fn has_trailing_comments(&self) -> bool {
+            self.trailing_comments.is_some()
         }
-        if let Some(ref v) = self.leading_comments.as_ref() {
-            os.write_string(3, &v)?;
+
+        // Param is passed by value, moved
+        pub fn set_trailing_comments(&mut self, v: ::std::string::String) {
+            self.trailing_comments = ::std::option::Option::Some(v);
         }
-        if let Some(ref v) = self.trailing_comments.as_ref() {
-            os.write_string(4, &v)?;
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_trailing_comments(&mut self) -> &mut ::std::string::String {
+            if self.trailing_comments.is_none() {
+                self.trailing_comments = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.trailing_comments.as_mut().unwrap()
         }
-        for v in &self.leading_detached_comments {
-            os.write_string(6, &v)?;
-        };
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
+        // Take field
+        pub fn take_trailing_comments(&mut self) -> ::std::string::String {
+            self.trailing_comments.take().unwrap_or_else(|| ::std::string::String::new())
+        }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> SourceCodeInfo_Location {
-        SourceCodeInfo_Location::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_vec_accessor::<_, crate::types::ProtobufTypeInt32>(
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(5);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
                 "path",
-                |m: &SourceCodeInfo_Location| { &m.path },
-                |m: &mut SourceCodeInfo_Location| { &mut m.path },
+                |m: &Location| { &m.path },
+                |m: &mut Location| { &mut m.path },
             ));
-            fields.push(crate::reflect::accessor::make_vec_accessor::<_, crate::types::ProtobufTypeInt32>(
+            fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
                 "span",
-                |m: &SourceCodeInfo_Location| { &m.span },
-                |m: &mut SourceCodeInfo_Location| { &mut m.span },
+                |m: &Location| { &m.span },
+                |m: &mut Location| { &mut m.span },
             ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "leading_comments",
-                |m: &SourceCodeInfo_Location| { &m.leading_comments },
-                |m: &mut SourceCodeInfo_Location| { &mut m.leading_comments },
+                |m: &Location| { &m.leading_comments },
+                |m: &mut Location| { &mut m.leading_comments },
             ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "trailing_comments",
-                |m: &SourceCodeInfo_Location| { &m.trailing_comments },
-                |m: &mut SourceCodeInfo_Location| { &mut m.trailing_comments },
+                |m: &Location| { &m.trailing_comments },
+                |m: &mut Location| { &mut m.trailing_comments },
             ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
+            fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
                 "leading_detached_comments",
-                |m: &SourceCodeInfo_Location| { &m.leading_detached_comments },
-                |m: &mut SourceCodeInfo_Location| { &mut m.leading_detached_comments },
+                |m: &Location| { &m.leading_detached_comments },
+                |m: &mut Location| { &mut m.leading_detached_comments },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<SourceCodeInfo_Location>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<Location>(
                 "SourceCodeInfo.Location",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
+        }
     }
 
-    fn default_instance() -> &'static SourceCodeInfo_Location {
-        static instance: crate::rt::LazyV2<SourceCodeInfo_Location> = crate::rt::LazyV2::INIT;
-        instance.get(SourceCodeInfo_Location::new)
+    impl crate::Message for Location {
+        const NAME: &'static str = "Location";
+
+        fn is_initialized(&self) -> bool {
+            true
+        }
+
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    10 => {
+                        is.read_repeated_packed_int32_into(&mut self.path)?;
+                    },
+                    8 => {
+                        self.path.push(is.read_int32()?);
+                    },
+                    18 => {
+                        is.read_repeated_packed_int32_into(&mut self.span)?;
+                    },
+                    16 => {
+                        self.span.push(is.read_int32()?);
+                    },
+                    26 => {
+                        self.leading_comments = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    34 => {
+                        self.trailing_comments = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    50 => {
+                        self.leading_detached_comments.push(is.read_string()?);
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            my_size += crate::rt::vec_packed_int32_size(1, &self.path);
+            my_size += crate::rt::vec_packed_int32_size(2, &self.span);
+            if let Some(v) = self.leading_comments.as_ref() {
+                my_size += crate::rt::string_size(3, &v);
+            }
+            if let Some(v) = self.trailing_comments.as_ref() {
+                my_size += crate::rt::string_size(4, &v);
+            }
+            for value in &self.leading_detached_comments {
+                my_size += crate::rt::string_size(6, &value);
+            };
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            os.write_repeated_packed_int32(1, &self.path)?;
+            os.write_repeated_packed_int32(2, &self.span)?;
+            if let Some(v) = self.leading_comments.as_ref() {
+                os.write_string(3, v)?;
+            }
+            if let Some(v) = self.trailing_comments.as_ref() {
+                os.write_string(4, v)?;
+            }
+            for v in &self.leading_detached_comments {
+                os.write_string(6, &v)?;
+            };
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> Location {
+            Location::new()
+        }
+
+        fn clear(&mut self) {
+            self.path.clear();
+            self.span.clear();
+            self.leading_comments = ::std::option::Option::None;
+            self.trailing_comments = ::std::option::Option::None;
+            self.leading_detached_comments.clear();
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static Location {
+            static instance: Location = Location {
+                path: ::std::vec::Vec::new(),
+                span: ::std::vec::Vec::new(),
+                leading_comments: ::std::option::Option::None,
+                trailing_comments: ::std::option::Option::None,
+                leading_detached_comments: ::std::vec::Vec::new(),
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
+    }
+
+    impl crate::MessageFull for Location {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("SourceCodeInfo.Location").unwrap()).clone()
+        }
+    }
+
+    impl ::std::fmt::Display for Location {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
+    }
+
+    impl crate::reflect::ProtobufValue for Location {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
     }
 }
 
-impl crate::Clear for SourceCodeInfo_Location {
-    fn clear(&mut self) {
-        self.path.clear();
-        self.span.clear();
-        self.leading_comments.clear();
-        self.trailing_comments.clear();
-        self.leading_detached_comments.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for SourceCodeInfo_Location {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for SourceCodeInfo_Location {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  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.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.GeneratedCodeInfo)
 pub struct GeneratedCodeInfo {
     // message fields
-    pub annotation: crate::RepeatedField<GeneratedCodeInfo_Annotation>,
+    ///  An Annotation connects some span of text in generated code to an element
+    ///  of its generating .proto file.
+    // @@protoc_insertion_point(field:google.protobuf.GeneratedCodeInfo.annotation)
+    pub annotation: ::std::vec::Vec<generated_code_info::Annotation>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.GeneratedCodeInfo.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a GeneratedCodeInfo {
@@ -8958,51 +7752,37 @@
         ::std::default::Default::default()
     }
 
-    // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
-
-
-    pub fn get_annotation(&self) -> &[GeneratedCodeInfo_Annotation] {
-        &self.annotation
-    }
-    pub fn clear_annotation(&mut self) {
-        self.annotation.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_annotation(&mut self, v: crate::RepeatedField<GeneratedCodeInfo_Annotation>) {
-        self.annotation = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_annotation(&mut self) -> &mut crate::RepeatedField<GeneratedCodeInfo_Annotation> {
-        &mut self.annotation
-    }
-
-    // Take field
-    pub fn take_annotation(&mut self) -> crate::RepeatedField<GeneratedCodeInfo_Annotation> {
-        ::std::mem::replace(&mut self.annotation, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "annotation",
+            |m: &GeneratedCodeInfo| { &m.annotation },
+            |m: &mut GeneratedCodeInfo| { &mut m.annotation },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<GeneratedCodeInfo>(
+            "GeneratedCodeInfo",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for GeneratedCodeInfo {
+    const NAME: &'static str = "GeneratedCodeInfo";
+
     fn is_initialized(&self) -> bool {
-        for v in &self.annotation {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.annotation)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.annotation.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -9011,392 +7791,325 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.annotation {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.annotation {
-            os.write_tag(1, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(1, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> GeneratedCodeInfo {
         GeneratedCodeInfo::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<GeneratedCodeInfo_Annotation>>(
-                "annotation",
-                |m: &GeneratedCodeInfo| { &m.annotation },
-                |m: &mut GeneratedCodeInfo| { &mut m.annotation },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<GeneratedCodeInfo>(
-                "GeneratedCodeInfo",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.annotation.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static GeneratedCodeInfo {
-        static instance: crate::rt::LazyV2<GeneratedCodeInfo> = crate::rt::LazyV2::INIT;
-        instance.get(GeneratedCodeInfo::new)
+        static instance: GeneratedCodeInfo = GeneratedCodeInfo {
+            annotation: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for GeneratedCodeInfo {
-    fn clear(&mut self) {
-        self.annotation.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for GeneratedCodeInfo {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("GeneratedCodeInfo").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for GeneratedCodeInfo {
+impl ::std::fmt::Display for GeneratedCodeInfo {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for GeneratedCodeInfo {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct GeneratedCodeInfo_Annotation {
-    // message fields
-    pub path: ::std::vec::Vec<i32>,
-    source_file: crate::SingularField<::std::string::String>,
-    begin: ::std::option::Option<i32>,
-    end: ::std::option::Option<i32>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a GeneratedCodeInfo_Annotation {
-    fn default() -> &'a GeneratedCodeInfo_Annotation {
-        <GeneratedCodeInfo_Annotation as crate::Message>::default_instance()
-    }
-}
-
-impl GeneratedCodeInfo_Annotation {
-    pub fn new() -> GeneratedCodeInfo_Annotation {
-        ::std::default::Default::default()
+/// Nested message and enums of message `GeneratedCodeInfo`
+pub mod generated_code_info {
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.GeneratedCodeInfo.Annotation)
+    pub struct Annotation {
+        // message fields
+        ///  Identifies the element in the original source .proto file. This field
+        ///  is formatted the same as SourceCodeInfo.Location.path.
+        // @@protoc_insertion_point(field:google.protobuf.GeneratedCodeInfo.Annotation.path)
+        pub path: ::std::vec::Vec<i32>,
+        ///  Identifies the filesystem path to the original source .proto.
+        // @@protoc_insertion_point(field:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+        pub source_file: ::std::option::Option<::std::string::String>,
+        ///  Identifies the starting offset in bytes in the generated code
+        ///  that relates to the identified object.
+        // @@protoc_insertion_point(field:google.protobuf.GeneratedCodeInfo.Annotation.begin)
+        pub begin: ::std::option::Option<i32>,
+        ///  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).
+        // @@protoc_insertion_point(field:google.protobuf.GeneratedCodeInfo.Annotation.end)
+        pub end: ::std::option::Option<i32>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.GeneratedCodeInfo.Annotation.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    // repeated int32 path = 1;
-
-
-    pub fn get_path(&self) -> &[i32] {
-        &self.path
-    }
-    pub fn clear_path(&mut self) {
-        self.path.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_path(&mut self, v: ::std::vec::Vec<i32>) {
-        self.path = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_path(&mut self) -> &mut ::std::vec::Vec<i32> {
-        &mut self.path
-    }
-
-    // Take field
-    pub fn take_path(&mut self) -> ::std::vec::Vec<i32> {
-        ::std::mem::replace(&mut self.path, ::std::vec::Vec::new())
-    }
-
-    // optional string source_file = 2;
-
-
-    pub fn get_source_file(&self) -> &str {
-        match self.source_file.as_ref() {
-            Some(v) => &v,
-            None => "",
+    impl<'a> ::std::default::Default for &'a Annotation {
+        fn default() -> &'a Annotation {
+            <Annotation as crate::Message>::default_instance()
         }
     }
-    pub fn clear_source_file(&mut self) {
-        self.source_file.clear();
-    }
 
-    pub fn has_source_file(&self) -> bool {
-        self.source_file.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_source_file(&mut self, v: ::std::string::String) {
-        self.source_file = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_source_file(&mut self) -> &mut ::std::string::String {
-        if self.source_file.is_none() {
-            self.source_file.set_default();
+    impl Annotation {
+        pub fn new() -> Annotation {
+            ::std::default::Default::default()
         }
-        self.source_file.as_mut().unwrap()
-    }
 
-    // Take field
-    pub fn take_source_file(&mut self) -> ::std::string::String {
-        self.source_file.take().unwrap_or_else(|| ::std::string::String::new())
-    }
+        // optional string source_file = 2;
 
-    // optional int32 begin = 3;
-
-
-    pub fn get_begin(&self) -> i32 {
-        self.begin.unwrap_or(0)
-    }
-    pub fn clear_begin(&mut self) {
-        self.begin = ::std::option::Option::None;
-    }
-
-    pub fn has_begin(&self) -> bool {
-        self.begin.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_begin(&mut self, v: i32) {
-        self.begin = ::std::option::Option::Some(v);
-    }
-
-    // optional int32 end = 4;
-
-
-    pub fn get_end(&self) -> i32 {
-        self.end.unwrap_or(0)
-    }
-    pub fn clear_end(&mut self) {
-        self.end = ::std::option::Option::None;
-    }
-
-    pub fn has_end(&self) -> bool {
-        self.end.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_end(&mut self, v: i32) {
-        self.end = ::std::option::Option::Some(v);
-    }
-}
-
-impl crate::Message for GeneratedCodeInfo_Annotation {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_int32_into(wire_type, is, &mut self.path)?;
-                },
-                2 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.source_file)?;
-                },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.begin = ::std::option::Option::Some(tmp);
-                },
-                4 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.end = ::std::option::Option::Some(tmp);
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
+        pub fn source_file(&self) -> &str {
+            match self.source_file.as_ref() {
+                Some(v) => v,
+                None => "",
+            }
         }
-        ::std::result::Result::Ok(())
-    }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.path.is_empty() {
-            my_size += crate::rt::vec_packed_varint_size(1, &self.path);
+        pub fn clear_source_file(&mut self) {
+            self.source_file = ::std::option::Option::None;
         }
-        if let Some(ref v) = self.source_file.as_ref() {
-            my_size += crate::rt::string_size(2, &v);
+
+        pub fn has_source_file(&self) -> bool {
+            self.source_file.is_some()
         }
-        if let Some(v) = self.begin {
-            my_size += crate::rt::value_size(3, v, crate::wire_format::WireTypeVarint);
+
+        // Param is passed by value, moved
+        pub fn set_source_file(&mut self, v: ::std::string::String) {
+            self.source_file = ::std::option::Option::Some(v);
         }
-        if let Some(v) = self.end {
-            my_size += crate::rt::value_size(4, v, crate::wire_format::WireTypeVarint);
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_source_file(&mut self) -> &mut ::std::string::String {
+            if self.source_file.is_none() {
+                self.source_file = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.source_file.as_mut().unwrap()
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if !self.path.is_empty() {
-            os.write_tag(1, crate::wire_format::WireTypeLengthDelimited)?;
-            // TODO: Data size is computed again, it should be cached
-            os.write_raw_varint32(crate::rt::vec_packed_varint_data_size(&self.path))?;
-            for v in &self.path {
-                os.write_int32_no_tag(*v)?;
-            };
+        // Take field
+        pub fn take_source_file(&mut self) -> ::std::string::String {
+            self.source_file.take().unwrap_or_else(|| ::std::string::String::new())
         }
-        if let Some(ref v) = self.source_file.as_ref() {
-            os.write_string(2, &v)?;
+
+        // optional int32 begin = 3;
+
+        pub fn begin(&self) -> i32 {
+            self.begin.unwrap_or(0)
         }
-        if let Some(v) = self.begin {
-            os.write_int32(3, v)?;
+
+        pub fn clear_begin(&mut self) {
+            self.begin = ::std::option::Option::None;
         }
-        if let Some(v) = self.end {
-            os.write_int32(4, v)?;
+
+        pub fn has_begin(&self) -> bool {
+            self.begin.is_some()
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
+        // Param is passed by value, moved
+        pub fn set_begin(&mut self, v: i32) {
+            self.begin = ::std::option::Option::Some(v);
+        }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
+        // optional int32 end = 4;
 
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
+        pub fn end(&self) -> i32 {
+            self.end.unwrap_or(0)
+        }
 
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
+        pub fn clear_end(&mut self) {
+            self.end = ::std::option::Option::None;
+        }
 
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
+        pub fn has_end(&self) -> bool {
+            self.end.is_some()
+        }
 
-    fn new() -> GeneratedCodeInfo_Annotation {
-        GeneratedCodeInfo_Annotation::new()
-    }
+        // Param is passed by value, moved
+        pub fn set_end(&mut self, v: i32) {
+            self.end = ::std::option::Option::Some(v);
+        }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_vec_accessor::<_, crate::types::ProtobufTypeInt32>(
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(4);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
                 "path",
-                |m: &GeneratedCodeInfo_Annotation| { &m.path },
-                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.path },
+                |m: &Annotation| { &m.path },
+                |m: &mut Annotation| { &mut m.path },
             ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "source_file",
-                |m: &GeneratedCodeInfo_Annotation| { &m.source_file },
-                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.source_file },
+                |m: &Annotation| { &m.source_file },
+                |m: &mut Annotation| { &mut m.source_file },
             ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "begin",
-                |m: &GeneratedCodeInfo_Annotation| { &m.begin },
-                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.begin },
+                |m: &Annotation| { &m.begin },
+                |m: &mut Annotation| { &mut m.begin },
             ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "end",
-                |m: &GeneratedCodeInfo_Annotation| { &m.end },
-                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.end },
+                |m: &Annotation| { &m.end },
+                |m: &mut Annotation| { &mut m.end },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<GeneratedCodeInfo_Annotation>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<Annotation>(
                 "GeneratedCodeInfo.Annotation",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
+        }
     }
 
-    fn default_instance() -> &'static GeneratedCodeInfo_Annotation {
-        static instance: crate::rt::LazyV2<GeneratedCodeInfo_Annotation> = crate::rt::LazyV2::INIT;
-        instance.get(GeneratedCodeInfo_Annotation::new)
-    }
-}
+    impl crate::Message for Annotation {
+        const NAME: &'static str = "Annotation";
 
-impl crate::Clear for GeneratedCodeInfo_Annotation {
-    fn clear(&mut self) {
-        self.path.clear();
-        self.source_file.clear();
-        self.begin = ::std::option::Option::None;
-        self.end = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
+        fn is_initialized(&self) -> bool {
+            true
+        }
 
-impl ::std::fmt::Debug for GeneratedCodeInfo_Annotation {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    10 => {
+                        is.read_repeated_packed_int32_into(&mut self.path)?;
+                    },
+                    8 => {
+                        self.path.push(is.read_int32()?);
+                    },
+                    18 => {
+                        self.source_file = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    24 => {
+                        self.begin = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    32 => {
+                        self.end = ::std::option::Option::Some(is.read_int32()?);
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
 
-impl crate::reflect::ProtobufValue for GeneratedCodeInfo_Annotation {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            my_size += crate::rt::vec_packed_int32_size(1, &self.path);
+            if let Some(v) = self.source_file.as_ref() {
+                my_size += crate::rt::string_size(2, &v);
+            }
+            if let Some(v) = self.begin {
+                my_size += crate::rt::int32_size(3, v);
+            }
+            if let Some(v) = self.end {
+                my_size += crate::rt::int32_size(4, v);
+            }
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            os.write_repeated_packed_int32(1, &self.path)?;
+            if let Some(v) = self.source_file.as_ref() {
+                os.write_string(2, v)?;
+            }
+            if let Some(v) = self.begin {
+                os.write_int32(3, v)?;
+            }
+            if let Some(v) = self.end {
+                os.write_int32(4, v)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> Annotation {
+            Annotation::new()
+        }
+
+        fn clear(&mut self) {
+            self.path.clear();
+            self.source_file = ::std::option::Option::None;
+            self.begin = ::std::option::Option::None;
+            self.end = ::std::option::Option::None;
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static Annotation {
+            static instance: Annotation = Annotation {
+                path: ::std::vec::Vec::new(),
+                source_file: ::std::option::Option::None,
+                begin: ::std::option::Option::None,
+                end: ::std::option::Option::None,
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
+    }
+
+    impl crate::MessageFull for Annotation {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("GeneratedCodeInfo.Annotation").unwrap()).clone()
+        }
+    }
+
+    impl ::std::fmt::Display for Annotation {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
+    }
+
+    impl crate::reflect::ProtobufValue for Annotation {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
     }
 }
 
@@ -9504,75 +8217,76 @@
     $.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOp\
     timizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\
     \x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\
-    &\x10'\"\xd1\x02\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\
+    &\x10'\"\xe3\x02\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\
     \x18\x01\x20\x01(\x08:\x05falseR\x14messageSetWireFormat\x12L\n\x1fno_st\
     andard_descriptor_accessor\x18\x02\x20\x01(\x08:\x05falseR\x1cnoStandard\
     DescriptorAccessor\x12%\n\ndeprecated\x18\x03\x20\x01(\x08:\x05falseR\nd\
     eprecated\x12\x1b\n\tmap_entry\x18\x07\x20\x01(\x08R\x08mapEntry\x12X\n\
     \x14uninterpreted_option\x18\xe7\x07\x20\x03(\x0b2$.google.protobuf.Unin\
     terpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\
-    \x80\x02J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xe2\x03\n\x0cFieldOptions\
-    \x12A\n\x05ctype\x18\x01\x20\x01(\x0e2#.google.protobuf.FieldOptions.CTy\
-    pe:\x06STRINGR\x05ctype\x12\x16\n\x06packed\x18\x02\x20\x01(\x08R\x06pac\
-    ked\x12G\n\x06jstype\x18\x06\x20\x01(\x0e2$.google.protobuf.FieldOptions\
-    .JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05\x20\x01(\x08:\
-    \x05falseR\x04lazy\x12%\n\ndeprecated\x18\x03\x20\x01(\x08:\x05falseR\nd\
-    eprecated\x12\x19\n\x04weak\x18\n\x20\x01(\x08:\x05falseR\x04weak\x12X\n\
+    \x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\
+    \x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xe2\x03\n\x0cFieldOptions\x12A\n\
+    \x05ctype\x18\x01\x20\x01(\x0e2#.google.protobuf.FieldOptions.CType:\x06\
+    STRINGR\x05ctype\x12\x16\n\x06packed\x18\x02\x20\x01(\x08R\x06packed\x12\
+    G\n\x06jstype\x18\x06\x20\x01(\x0e2$.google.protobuf.FieldOptions.JSType\
+    :\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05\x20\x01(\x08:\x05false\
+    R\x04lazy\x12%\n\ndeprecated\x18\x03\x20\x01(\x08:\x05falseR\ndeprecated\
+    \x12\x19\n\x04weak\x18\n\x20\x01(\x08:\x05falseR\x04weak\x12X\n\x14unint\
+    erpreted_option\x18\xe7\x07\x20\x03(\x0b2$.google.protobuf.Uninterpreted\
+    OptionR\x13uninterpretedOption\"/\n\x05CType\x12\n\n\x06STRING\x10\0\x12\
+    \x08\n\x04CORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\
+    \x12\r\n\tJS_NORMAL\x10\0\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\
+    \x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05\"s\
+    \n\x0cOneofOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07\x20\x03(\
+    \x0b2$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\
+    \x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc0\x01\n\x0bEnumOptions\x12\x1f\
+    \n\x0ballow_alias\x18\x02\x20\x01(\x08R\nallowAlias\x12%\n\ndeprecated\
+    \x18\x03\x20\x01(\x08:\x05falseR\ndeprecated\x12X\n\x14uninterpreted_opt\
+    ion\x18\xe7\x07\x20\x03(\x0b2$.google.protobuf.UninterpretedOptionR\x13u\
+    ninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\
+    \x10\x06\"\x9e\x01\n\x10EnumValueOptions\x12%\n\ndeprecated\x18\x01\x20\
+    \x01(\x08:\x05falseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\
+    \x07\x20\x03(\x0b2$.google.protobuf.UninterpretedOptionR\x13uninterprete\
+    dOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9c\x01\n\x0eServiceOpt\
+    ions\x12%\n\ndeprecated\x18!\x20\x01(\x08:\x05falseR\ndeprecated\x12X\n\
     \x14uninterpreted_option\x18\xe7\x07\x20\x03(\x0b2$.google.protobuf.Unin\
-    terpretedOptionR\x13uninterpretedOption\"/\n\x05CType\x12\n\n\x06STRING\
-    \x10\0\x12\x08\n\x04CORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\
-    \x06JSType\x12\r\n\tJS_NORMAL\x10\0\x12\r\n\tJS_STRING\x10\x01\x12\r\n\t\
-    JS_NUMBER\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\
-    \x10\x05\"s\n\x0cOneofOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07\
-    \x20\x03(\x0b2$.google.protobuf.UninterpretedOptionR\x13uninterpretedOpt\
-    ion*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc0\x01\n\x0bEnumOptions\
-    \x12\x1f\n\x0ballow_alias\x18\x02\x20\x01(\x08R\nallowAlias\x12%\n\ndepr\
-    ecated\x18\x03\x20\x01(\x08:\x05falseR\ndeprecated\x12X\n\x14uninterpret\
-    ed_option\x18\xe7\x07\x20\x03(\x0b2$.google.protobuf.UninterpretedOption\
-    R\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\
-    \x05\x10\x06\"\x9e\x01\n\x10EnumValueOptions\x12%\n\ndeprecated\x18\x01\
-    \x20\x01(\x08:\x05falseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\
-    \xe7\x07\x20\x03(\x0b2$.google.protobuf.UninterpretedOptionR\x13uninterp\
-    retedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9c\x01\n\x0eServic\
-    eOptions\x12%\n\ndeprecated\x18!\x20\x01(\x08:\x05falseR\ndeprecated\x12\
-    X\n\x14uninterpreted_option\x18\xe7\x07\x20\x03(\x0b2$.google.protobuf.U\
-    ninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\
-    \x80\x80\x02\"\xe0\x02\n\rMethodOptions\x12%\n\ndeprecated\x18!\x20\x01(\
-    \x08:\x05falseR\ndeprecated\x12q\n\x11idempotency_level\x18\"\x20\x01(\
-    \x0e2/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UN\
-    KNOWNR\x10idempotencyLevel\x12X\n\x14uninterpreted_option\x18\xe7\x07\
-    \x20\x03(\x0b2$.google.protobuf.UninterpretedOptionR\x13uninterpretedOpt\
-    ion\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\0\x12\
-    \x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\
-    \xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12A\
-    \n\x04name\x18\x02\x20\x03(\x0b2-.google.protobuf.UninterpretedOption.Na\
-    mePartR\x04name\x12)\n\x10identifier_value\x18\x03\x20\x01(\tR\x0fidenti\
-    fierValue\x12,\n\x12positive_int_value\x18\x04\x20\x01(\x04R\x10positive\
-    IntValue\x12,\n\x12negative_int_value\x18\x05\x20\x01(\x03R\x10negativeI\
-    ntValue\x12!\n\x0cdouble_value\x18\x06\x20\x01(\x01R\x0bdoubleValue\x12!\
-    \n\x0cstring_value\x18\x07\x20\x01(\x0cR\x0bstringValue\x12'\n\x0faggreg\
-    ate_value\x18\x08\x20\x01(\tR\x0eaggregateValue\x1aJ\n\x08NamePart\x12\
-    \x1b\n\tname_part\x18\x01\x20\x02(\tR\x08namePart\x12!\n\x0cis_extension\
-    \x18\x02\x20\x02(\x08R\x0bisExtension\"\xa7\x02\n\x0eSourceCodeInfo\x12D\
-    \n\x08location\x18\x01\x20\x03(\x0b2(.google.protobuf.SourceCodeInfo.Loc\
-    ationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01\
-    \x20\x03(\x05R\x04pathB\x02\x10\x01\x12\x16\n\x04span\x18\x02\x20\x03(\
-    \x05R\x04spanB\x02\x10\x01\x12)\n\x10leading_comments\x18\x03\x20\x01(\t\
-    R\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04\x20\x01(\tR\x10\
-    trailingComments\x12:\n\x19leading_detached_comments\x18\x06\x20\x03(\tR\
-    \x17leadingDetachedComments\"\xd1\x01\n\x11GeneratedCodeInfo\x12M\n\nann\
-    otation\x18\x01\x20\x03(\x0b2-.google.protobuf.GeneratedCodeInfo.Annotat\
-    ionR\nannotation\x1am\n\nAnnotation\x12\x16\n\x04path\x18\x01\x20\x03(\
-    \x05R\x04pathB\x02\x10\x01\x12\x1f\n\x0bsource_file\x18\x02\x20\x01(\tR\
-    \nsourceFile\x12\x14\n\x05begin\x18\x03\x20\x01(\x05R\x05begin\x12\x10\n\
-    \x03end\x18\x04\x20\x01(\x05R\x03endB~\n\x13com.google.protobufB\x10Desc\
-    riptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\
-    \x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.ReflectionJ\xbc\xc8\x02\n\
-    \x07\x12\x05'\0\x8c\x07\x01\n\xaa\x0f\n\x01\x0c\x12\x03'\0\x122\xc1\x0c\
-    \x20Protocol\x20Buffers\x20-\x20Google's\x20data\x20interchange\x20forma\
-    t\n\x20Copyright\x202008\x20Google\x20Inc.\x20\x20All\x20rights\x20reser\
-    ved.\n\x20https://developers.google.com/protocol-buffers/\n\n\x20Redistr\
-    ibution\x20and\x20use\x20in\x20source\x20and\x20binary\x20forms,\x20with\
+    terpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\
+    \x80\x02\"\xe0\x02\n\rMethodOptions\x12%\n\ndeprecated\x18!\x20\x01(\x08\
+    :\x05falseR\ndeprecated\x12q\n\x11idempotency_level\x18\"\x20\x01(\x0e2/\
+    .google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\
+    \x10idempotencyLevel\x12X\n\x14uninterpreted_option\x18\xe7\x07\x20\x03(\
+    \x0b2$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\
+    \x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\0\x12\x13\n\
+    \x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\
+    \x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12A\n\x04na\
+    me\x18\x02\x20\x03(\x0b2-.google.protobuf.UninterpretedOption.NamePartR\
+    \x04name\x12)\n\x10identifier_value\x18\x03\x20\x01(\tR\x0fidentifierVal\
+    ue\x12,\n\x12positive_int_value\x18\x04\x20\x01(\x04R\x10positiveIntValu\
+    e\x12,\n\x12negative_int_value\x18\x05\x20\x01(\x03R\x10negativeIntValue\
+    \x12!\n\x0cdouble_value\x18\x06\x20\x01(\x01R\x0bdoubleValue\x12!\n\x0cs\
+    tring_value\x18\x07\x20\x01(\x0cR\x0bstringValue\x12'\n\x0faggregate_val\
+    ue\x18\x08\x20\x01(\tR\x0eaggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tn\
+    ame_part\x18\x01\x20\x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02\
+    \x20\x02(\x08R\x0bisExtension\"\xa7\x02\n\x0eSourceCodeInfo\x12D\n\x08lo\
+    cation\x18\x01\x20\x03(\x0b2(.google.protobuf.SourceCodeInfo.LocationR\
+    \x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01\x20\x03\
+    (\x05R\x04pathB\x02\x10\x01\x12\x16\n\x04span\x18\x02\x20\x03(\x05R\x04s\
+    panB\x02\x10\x01\x12)\n\x10leading_comments\x18\x03\x20\x01(\tR\x0fleadi\
+    ngComments\x12+\n\x11trailing_comments\x18\x04\x20\x01(\tR\x10trailingCo\
+    mments\x12:\n\x19leading_detached_comments\x18\x06\x20\x03(\tR\x17leadin\
+    gDetachedComments\"\xd1\x01\n\x11GeneratedCodeInfo\x12M\n\nannotation\
+    \x18\x01\x20\x03(\x0b2-.google.protobuf.GeneratedCodeInfo.AnnotationR\na\
+    nnotation\x1am\n\nAnnotation\x12\x16\n\x04path\x18\x01\x20\x03(\x05R\x04\
+    pathB\x02\x10\x01\x12\x1f\n\x0bsource_file\x18\x02\x20\x01(\tR\nsourceFi\
+    le\x12\x14\n\x05begin\x18\x03\x20\x01(\x05R\x05begin\x12\x10\n\x03end\
+    \x18\x04\x20\x01(\x05R\x03endB~\n\x13com.google.protobufB\x10DescriptorP\
+    rotosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\
+    \xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.ReflectionJ\x82\xca\x02\n\x07\
+    \x12\x05'\0\x8e\x07\x01\n\xaa\x0f\n\x01\x0c\x12\x03'\0\x122\xc1\x0c\x20P\
+    rotocol\x20Buffers\x20-\x20Google's\x20data\x20interchange\x20format\n\
+    \x20Copyright\x202008\x20Google\x20Inc.\x20\x20All\x20rights\x20reserved\
+    .\n\x20https://developers.google.com/protocol-buffers/\n\n\x20Redistribu\
+    tion\x20and\x20use\x20in\x20source\x20and\x20binary\x20forms,\x20with\
     \x20or\x20without\n\x20modification,\x20are\x20permitted\x20provided\x20\
     that\x20the\x20following\x20conditions\x20are\n\x20met:\n\n\x20\x20\x20\
     \x20\x20*\x20Redistributions\x20of\x20source\x20code\x20must\x20retain\
@@ -10073,53 +8787,54 @@
     t\x20normally\x20start\x20with\x20backwards\n\x20domain\x20names.\n\n\r\
     \n\x05\x04\n\x02\0\x04\x12\x04\xdb\x02\x02\n\n\r\n\x05\x04\n\x02\0\x05\
     \x12\x04\xdb\x02\x0b\x11\n\r\n\x05\x04\n\x02\0\x01\x12\x04\xdb\x02\x12\
-    \x1e\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xdb\x02!\"\n\xbf\x02\n\x04\x04\n\
-    \x02\x01\x12\x04\xe3\x02\x02+\x1a\xb0\x02\x20If\x20set,\x20all\x20the\
-    \x20classes\x20from\x20the\x20.proto\x20file\x20are\x20wrapped\x20in\x20\
-    a\x20single\n\x20outer\x20class\x20with\x20the\x20given\x20name.\x20\x20\
-    This\x20applies\x20to\x20both\x20Proto1\n\x20(equivalent\x20to\x20the\
-    \x20old\x20\"--one_java_file\"\x20option)\x20and\x20Proto2\x20(where\n\
-    \x20a\x20.proto\x20always\x20translates\x20to\x20a\x20single\x20class,\
-    \x20but\x20you\x20may\x20want\x20to\n\x20explicitly\x20choose\x20the\x20\
-    class\x20name).\n\n\r\n\x05\x04\n\x02\x01\x04\x12\x04\xe3\x02\x02\n\n\r\
-    \n\x05\x04\n\x02\x01\x05\x12\x04\xe3\x02\x0b\x11\n\r\n\x05\x04\n\x02\x01\
-    \x01\x12\x04\xe3\x02\x12&\n\r\n\x05\x04\n\x02\x01\x03\x12\x04\xe3\x02)*\
-    \n\xa3\x03\n\x04\x04\n\x02\x02\x12\x04\xeb\x02\x02;\x1a\x94\x03\x20If\
-    \x20set\x20true,\x20then\x20the\x20Java\x20code\x20generator\x20will\x20\
-    generate\x20a\x20separate\x20.java\n\x20file\x20for\x20each\x20top-level\
-    \x20message,\x20enum,\x20and\x20service\x20defined\x20in\x20the\x20.prot\
-    o\n\x20file.\x20\x20Thus,\x20these\x20types\x20will\x20*not*\x20be\x20ne\
-    sted\x20inside\x20the\x20outer\x20class\n\x20named\x20by\x20java_outer_c\
-    lassname.\x20\x20However,\x20the\x20outer\x20class\x20will\x20still\x20b\
-    e\n\x20generated\x20to\x20contain\x20the\x20file's\x20getDescriptor()\
-    \x20method\x20as\x20well\x20as\x20any\n\x20top-level\x20extensions\x20de\
-    fined\x20in\x20the\x20file.\n\n\r\n\x05\x04\n\x02\x02\x04\x12\x04\xeb\
-    \x02\x02\n\n\r\n\x05\x04\n\x02\x02\x05\x12\x04\xeb\x02\x0b\x0f\n\r\n\x05\
-    \x04\n\x02\x02\x01\x12\x04\xeb\x02\x10#\n\r\n\x05\x04\n\x02\x02\x03\x12\
-    \x04\xeb\x02&(\n\r\n\x05\x04\n\x02\x02\x08\x12\x04\xeb\x02):\n\r\n\x05\
-    \x04\n\x02\x02\x07\x12\x04\xeb\x0249\n)\n\x04\x04\n\x02\x03\x12\x04\xee\
-    \x02\x02E\x1a\x1b\x20This\x20option\x20does\x20nothing.\n\n\r\n\x05\x04\
-    \n\x02\x03\x04\x12\x04\xee\x02\x02\n\n\r\n\x05\x04\n\x02\x03\x05\x12\x04\
-    \xee\x02\x0b\x0f\n\r\n\x05\x04\n\x02\x03\x01\x12\x04\xee\x02\x10-\n\r\n\
-    \x05\x04\n\x02\x03\x03\x12\x04\xee\x0202\n\r\n\x05\x04\n\x02\x03\x08\x12\
-    \x04\xee\x023D\n\x0e\n\x06\x04\n\x02\x03\x08\x03\x12\x04\xee\x024C\n\xe6\
-    \x02\n\x04\x04\n\x02\x04\x12\x04\xf6\x02\x02>\x1a\xd7\x02\x20If\x20set\
-    \x20true,\x20then\x20the\x20Java2\x20code\x20generator\x20will\x20genera\
-    te\x20code\x20that\n\x20throws\x20an\x20exception\x20whenever\x20an\x20a\
-    ttempt\x20is\x20made\x20to\x20assign\x20a\x20non-UTF-8\n\x20byte\x20sequ\
-    ence\x20to\x20a\x20string\x20field.\n\x20Message\x20reflection\x20will\
-    \x20do\x20the\x20same.\n\x20However,\x20an\x20extension\x20field\x20stil\
-    l\x20accepts\x20non-UTF-8\x20byte\x20sequences.\n\x20This\x20option\x20h\
-    as\x20no\x20effect\x20on\x20when\x20used\x20with\x20the\x20lite\x20runti\
-    me.\n\n\r\n\x05\x04\n\x02\x04\x04\x12\x04\xf6\x02\x02\n\n\r\n\x05\x04\n\
-    \x02\x04\x05\x12\x04\xf6\x02\x0b\x0f\n\r\n\x05\x04\n\x02\x04\x01\x12\x04\
-    \xf6\x02\x10&\n\r\n\x05\x04\n\x02\x04\x03\x12\x04\xf6\x02)+\n\r\n\x05\
-    \x04\n\x02\x04\x08\x12\x04\xf6\x02,=\n\r\n\x05\x04\n\x02\x04\x07\x12\x04\
-    \xf6\x027<\nL\n\x04\x04\n\x04\0\x12\x06\xfa\x02\x02\xff\x02\x03\x1a<\x20\
-    Generated\x20classes\x20can\x20be\x20optimized\x20for\x20speed\x20or\x20\
-    code\x20size.\n\n\r\n\x05\x04\n\x04\0\x01\x12\x04\xfa\x02\x07\x13\nD\n\
-    \x06\x04\n\x04\0\x02\0\x12\x04\xfb\x02\x04\x0e\"4\x20Generate\x20complet\
-    e\x20code\x20for\x20parsing,\x20serialization,\n\n\x0f\n\x07\x04\n\x04\0\
+    \x1e\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xdb\x02!\"\n\xf1\x02\n\x04\x04\n\
+    \x02\x01\x12\x04\xe3\x02\x02+\x1a\xe2\x02\x20Controls\x20the\x20name\x20\
+    of\x20the\x20wrapper\x20Java\x20class\x20generated\x20for\x20the\x20.pro\
+    to\x20file.\n\x20That\x20class\x20will\x20always\x20contain\x20the\x20.p\
+    roto\x20file's\x20getDescriptor()\x20method\x20as\n\x20well\x20as\x20any\
+    \x20top-level\x20extensions\x20defined\x20in\x20the\x20.proto\x20file.\n\
+    \x20If\x20java_multiple_files\x20is\x20disabled,\x20then\x20all\x20the\
+    \x20other\x20classes\x20from\x20the\n\x20.proto\x20file\x20will\x20be\
+    \x20nested\x20inside\x20the\x20single\x20wrapper\x20outer\x20class.\n\n\
+    \r\n\x05\x04\n\x02\x01\x04\x12\x04\xe3\x02\x02\n\n\r\n\x05\x04\n\x02\x01\
+    \x05\x12\x04\xe3\x02\x0b\x11\n\r\n\x05\x04\n\x02\x01\x01\x12\x04\xe3\x02\
+    \x12&\n\r\n\x05\x04\n\x02\x01\x03\x12\x04\xe3\x02)*\n\xa6\x03\n\x04\x04\
+    \n\x02\x02\x12\x04\xeb\x02\x02;\x1a\x97\x03\x20If\x20enabled,\x20then\
+    \x20the\x20Java\x20code\x20generator\x20will\x20generate\x20a\x20separat\
+    e\x20.java\n\x20file\x20for\x20each\x20top-level\x20message,\x20enum,\
+    \x20and\x20service\x20defined\x20in\x20the\x20.proto\n\x20file.\x20\x20T\
+    hus,\x20these\x20types\x20will\x20*not*\x20be\x20nested\x20inside\x20the\
+    \x20wrapper\x20class\n\x20named\x20by\x20java_outer_classname.\x20\x20Ho\
+    wever,\x20the\x20wrapper\x20class\x20will\x20still\x20be\n\x20generated\
+    \x20to\x20contain\x20the\x20file's\x20getDescriptor()\x20method\x20as\
+    \x20well\x20as\x20any\n\x20top-level\x20extensions\x20defined\x20in\x20t\
+    he\x20file.\n\n\r\n\x05\x04\n\x02\x02\x04\x12\x04\xeb\x02\x02\n\n\r\n\
+    \x05\x04\n\x02\x02\x05\x12\x04\xeb\x02\x0b\x0f\n\r\n\x05\x04\n\x02\x02\
+    \x01\x12\x04\xeb\x02\x10#\n\r\n\x05\x04\n\x02\x02\x03\x12\x04\xeb\x02&(\
+    \n\r\n\x05\x04\n\x02\x02\x08\x12\x04\xeb\x02):\n\r\n\x05\x04\n\x02\x02\
+    \x07\x12\x04\xeb\x0249\n)\n\x04\x04\n\x02\x03\x12\x04\xee\x02\x02E\x1a\
+    \x1b\x20This\x20option\x20does\x20nothing.\n\n\r\n\x05\x04\n\x02\x03\x04\
+    \x12\x04\xee\x02\x02\n\n\r\n\x05\x04\n\x02\x03\x05\x12\x04\xee\x02\x0b\
+    \x0f\n\r\n\x05\x04\n\x02\x03\x01\x12\x04\xee\x02\x10-\n\r\n\x05\x04\n\
+    \x02\x03\x03\x12\x04\xee\x0202\n\r\n\x05\x04\n\x02\x03\x08\x12\x04\xee\
+    \x023D\n\x0e\n\x06\x04\n\x02\x03\x08\x03\x12\x04\xee\x024C\n\xe6\x02\n\
+    \x04\x04\n\x02\x04\x12\x04\xf6\x02\x02>\x1a\xd7\x02\x20If\x20set\x20true\
+    ,\x20then\x20the\x20Java2\x20code\x20generator\x20will\x20generate\x20co\
+    de\x20that\n\x20throws\x20an\x20exception\x20whenever\x20an\x20attempt\
+    \x20is\x20made\x20to\x20assign\x20a\x20non-UTF-8\n\x20byte\x20sequence\
+    \x20to\x20a\x20string\x20field.\n\x20Message\x20reflection\x20will\x20do\
+    \x20the\x20same.\n\x20However,\x20an\x20extension\x20field\x20still\x20a\
+    ccepts\x20non-UTF-8\x20byte\x20sequences.\n\x20This\x20option\x20has\x20\
+    no\x20effect\x20on\x20when\x20used\x20with\x20the\x20lite\x20runtime.\n\
+    \n\r\n\x05\x04\n\x02\x04\x04\x12\x04\xf6\x02\x02\n\n\r\n\x05\x04\n\x02\
+    \x04\x05\x12\x04\xf6\x02\x0b\x0f\n\r\n\x05\x04\n\x02\x04\x01\x12\x04\xf6\
+    \x02\x10&\n\r\n\x05\x04\n\x02\x04\x03\x12\x04\xf6\x02)+\n\r\n\x05\x04\n\
+    \x02\x04\x08\x12\x04\xf6\x02,=\n\r\n\x05\x04\n\x02\x04\x07\x12\x04\xf6\
+    \x027<\nL\n\x04\x04\n\x04\0\x12\x06\xfa\x02\x02\xff\x02\x03\x1a<\x20Gene\
+    rated\x20classes\x20can\x20be\x20optimized\x20for\x20speed\x20or\x20code\
+    \x20size.\n\n\r\n\x05\x04\n\x04\0\x01\x12\x04\xfa\x02\x07\x13\nD\n\x06\
+    \x04\n\x04\0\x02\0\x12\x04\xfb\x02\x04\x0e\"4\x20Generate\x20complete\
+    \x20code\x20for\x20parsing,\x20serialization,\n\n\x0f\n\x07\x04\n\x04\0\
     \x02\0\x01\x12\x04\xfb\x02\x04\t\n\x0f\n\x07\x04\n\x04\0\x02\0\x02\x12\
     \x04\xfb\x02\x0c\r\nG\n\x06\x04\n\x04\0\x02\x01\x12\x04\xfd\x02\x04\x12\
     \x1a\x06\x20etc.\n\"/\x20Use\x20ReflectionOps\x20to\x20implement\x20thes\
@@ -10254,7 +8969,7 @@
     \xcd\x03\r\x11\n\r\n\x05\x04\n\x05\0\x02\x12\x04\xcd\x03\x15\x18\n\x0b\n\
     \x03\x04\n\t\x12\x04\xcf\x03\x02\x0e\n\x0c\n\x04\x04\n\t\0\x12\x04\xcf\
     \x03\x0b\r\n\r\n\x05\x04\n\t\0\x01\x12\x04\xcf\x03\x0b\r\n\r\n\x05\x04\n\
-    \t\0\x02\x12\x04\xcf\x03\x0b\r\n\x0c\n\x02\x04\x0b\x12\x06\xd2\x03\0\x92\
+    \t\0\x02\x12\x04\xcf\x03\x0b\r\n\x0c\n\x02\x04\x0b\x12\x06\xd2\x03\0\x94\
     \x04\x01\n\x0b\n\x03\x04\x0b\x01\x12\x04\xd2\x03\x08\x16\n\xd8\x05\n\x04\
     \x04\x0b\x02\0\x12\x04\xe5\x03\x02>\x1a\xc9\x05\x20Set\x20true\x20to\x20\
     use\x20the\x20old\x20proto1\x20MessageSet\x20wire\x20format\x20for\x20ex\
@@ -10295,68 +9010,75 @@
     \x03\x02\n\n\r\n\x05\x04\x0b\x02\x02\x05\x12\x04\xf0\x03\x0b\x0f\n\r\n\
     \x05\x04\x0b\x02\x02\x01\x12\x04\xf0\x03\x10\x1a\n\r\n\x05\x04\x0b\x02\
     \x02\x03\x12\x04\xf0\x03\x1d\x1e\n\r\n\x05\x04\x0b\x02\x02\x08\x12\x04\
-    \xf0\x03\x1f0\n\r\n\x05\x04\x0b\x02\x02\x07\x12\x04\xf0\x03*/\n\xa0\x06\
-    \n\x04\x04\x0b\x02\x03\x12\x04\x87\x04\x02\x1e\x1a\x91\x06\x20Whether\
-    \x20the\x20message\x20is\x20an\x20automatically\x20generated\x20map\x20e\
-    ntry\x20type\x20for\x20the\n\x20maps\x20field.\n\n\x20For\x20maps\x20fie\
-    lds:\n\x20\x20\x20\x20\x20map<KeyType,\x20ValueType>\x20map_field\x20=\
-    \x201;\n\x20The\x20parsed\x20descriptor\x20looks\x20like:\n\x20\x20\x20\
-    \x20\x20message\x20MapFieldEntry\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\
-    \x20option\x20map_entry\x20=\x20true;\n\x20\x20\x20\x20\x20\x20\x20\x20\
-    \x20optional\x20KeyType\x20key\x20=\x201;\n\x20\x20\x20\x20\x20\x20\x20\
-    \x20\x20optional\x20ValueType\x20value\x20=\x202;\n\x20\x20\x20\x20\x20}\
-    \n\x20\x20\x20\x20\x20repeated\x20MapFieldEntry\x20map_field\x20=\x201;\
-    \n\n\x20Implementations\x20may\x20choose\x20not\x20to\x20generate\x20the\
-    \x20map_entry=true\x20message,\x20but\n\x20use\x20a\x20native\x20map\x20\
-    in\x20the\x20target\x20language\x20to\x20hold\x20the\x20keys\x20and\x20v\
-    alues.\n\x20The\x20reflection\x20APIs\x20in\x20such\x20implementations\
-    \x20still\x20need\x20to\x20work\x20as\n\x20if\x20the\x20field\x20is\x20a\
-    \x20repeated\x20message\x20field.\n\n\x20NOTE:\x20Do\x20not\x20set\x20th\
-    e\x20option\x20in\x20.proto\x20files.\x20Always\x20use\x20the\x20maps\
-    \x20syntax\n\x20instead.\x20The\x20option\x20should\x20only\x20be\x20imp\
-    licitly\x20set\x20by\x20the\x20proto\x20compiler\n\x20parser.\n\n\r\n\
-    \x05\x04\x0b\x02\x03\x04\x12\x04\x87\x04\x02\n\n\r\n\x05\x04\x0b\x02\x03\
-    \x05\x12\x04\x87\x04\x0b\x0f\n\r\n\x05\x04\x0b\x02\x03\x01\x12\x04\x87\
-    \x04\x10\x19\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\x87\x04\x1c\x1d\n$\n\
-    \x03\x04\x0b\t\x12\x04\x89\x04\x02\r\"\x17\x20javalite_serializable\n\n\
-    \x0c\n\x04\x04\x0b\t\0\x12\x04\x89\x04\x0b\x0c\n\r\n\x05\x04\x0b\t\0\x01\
-    \x12\x04\x89\x04\x0b\x0c\n\r\n\x05\x04\x0b\t\0\x02\x12\x04\x89\x04\x0b\
-    \x0c\n\x1f\n\x03\x04\x0b\t\x12\x04\x8a\x04\x02\r\"\x12\x20javanano_as_li\
-    te\n\n\x0c\n\x04\x04\x0b\t\x01\x12\x04\x8a\x04\x0b\x0c\n\r\n\x05\x04\x0b\
-    \t\x01\x01\x12\x04\x8a\x04\x0b\x0c\n\r\n\x05\x04\x0b\t\x01\x02\x12\x04\
-    \x8a\x04\x0b\x0c\nO\n\x04\x04\x0b\x02\x04\x12\x04\x8e\x04\x02:\x1aA\x20T\
-    he\x20parser\x20stores\x20options\x20it\x20doesn't\x20recognize\x20here.\
-    \x20See\x20above.\n\n\r\n\x05\x04\x0b\x02\x04\x04\x12\x04\x8e\x04\x02\n\
-    \n\r\n\x05\x04\x0b\x02\x04\x06\x12\x04\x8e\x04\x0b\x1e\n\r\n\x05\x04\x0b\
-    \x02\x04\x01\x12\x04\x8e\x04\x1f3\n\r\n\x05\x04\x0b\x02\x04\x03\x12\x04\
-    \x8e\x0469\nZ\n\x03\x04\x0b\x05\x12\x04\x91\x04\x02\x19\x1aM\x20Clients\
-    \x20can\x20define\x20custom\x20options\x20in\x20extensions\x20of\x20this\
-    \x20message.\x20See\x20above.\n\n\x0c\n\x04\x04\x0b\x05\0\x12\x04\x91\
-    \x04\r\x18\n\r\n\x05\x04\x0b\x05\0\x01\x12\x04\x91\x04\r\x11\n\r\n\x05\
-    \x04\x0b\x05\0\x02\x12\x04\x91\x04\x15\x18\n\x0c\n\x02\x04\x0c\x12\x06\
-    \x94\x04\0\xef\x04\x01\n\x0b\n\x03\x04\x0c\x01\x12\x04\x94\x04\x08\x14\n\
-    \xa3\x02\n\x04\x04\x0c\x02\0\x12\x04\x99\x04\x02.\x1a\x94\x02\x20The\x20\
-    ctype\x20option\x20instructs\x20the\x20C++\x20code\x20generator\x20to\
-    \x20use\x20a\x20different\n\x20representation\x20of\x20the\x20field\x20t\
-    han\x20it\x20normally\x20would.\x20\x20See\x20the\x20specific\n\x20optio\
-    ns\x20below.\x20\x20This\x20option\x20is\x20not\x20yet\x20implemented\
-    \x20in\x20the\x20open\x20source\n\x20release\x20--\x20sorry,\x20we'll\
-    \x20try\x20to\x20include\x20it\x20in\x20a\x20future\x20version!\n\n\r\n\
-    \x05\x04\x0c\x02\0\x04\x12\x04\x99\x04\x02\n\n\r\n\x05\x04\x0c\x02\0\x06\
-    \x12\x04\x99\x04\x0b\x10\n\r\n\x05\x04\x0c\x02\0\x01\x12\x04\x99\x04\x11\
-    \x16\n\r\n\x05\x04\x0c\x02\0\x03\x12\x04\x99\x04\x19\x1a\n\r\n\x05\x04\
-    \x0c\x02\0\x08\x12\x04\x99\x04\x1b-\n\r\n\x05\x04\x0c\x02\0\x07\x12\x04\
-    \x99\x04&,\n\x0e\n\x04\x04\x0c\x04\0\x12\x06\x9a\x04\x02\xa1\x04\x03\n\r\
-    \n\x05\x04\x0c\x04\0\x01\x12\x04\x9a\x04\x07\x0c\n\x1f\n\x06\x04\x0c\x04\
-    \0\x02\0\x12\x04\x9c\x04\x04\x0f\x1a\x0f\x20Default\x20mode.\n\n\x0f\n\
-    \x07\x04\x0c\x04\0\x02\0\x01\x12\x04\x9c\x04\x04\n\n\x0f\n\x07\x04\x0c\
-    \x04\0\x02\0\x02\x12\x04\x9c\x04\r\x0e\n\x0e\n\x06\x04\x0c\x04\0\x02\x01\
-    \x12\x04\x9e\x04\x04\r\n\x0f\n\x07\x04\x0c\x04\0\x02\x01\x01\x12\x04\x9e\
-    \x04\x04\x08\n\x0f\n\x07\x04\x0c\x04\0\x02\x01\x02\x12\x04\x9e\x04\x0b\
-    \x0c\n\x0e\n\x06\x04\x0c\x04\0\x02\x02\x12\x04\xa0\x04\x04\x15\n\x0f\n\
-    \x07\x04\x0c\x04\0\x02\x02\x01\x12\x04\xa0\x04\x04\x10\n\x0f\n\x07\x04\
-    \x0c\x04\0\x02\x02\x02\x12\x04\xa0\x04\x13\x14\n\xda\x02\n\x04\x04\x0c\
-    \x02\x01\x12\x04\xa7\x04\x02\x1b\x1a\xcb\x02\x20The\x20packed\x20option\
+    \xf0\x03\x1f0\n\r\n\x05\x04\x0b\x02\x02\x07\x12\x04\xf0\x03*/\n\x0b\n\
+    \x03\x04\x0b\t\x12\x04\xf2\x03\x02\x13\n\x0c\n\x04\x04\x0b\t\0\x12\x04\
+    \xf2\x03\x0b\x0c\n\r\n\x05\x04\x0b\t\0\x01\x12\x04\xf2\x03\x0b\x0c\n\r\n\
+    \x05\x04\x0b\t\0\x02\x12\x04\xf2\x03\x0b\x0c\n\x0c\n\x04\x04\x0b\t\x01\
+    \x12\x04\xf2\x03\x0e\x0f\n\r\n\x05\x04\x0b\t\x01\x01\x12\x04\xf2\x03\x0e\
+    \x0f\n\r\n\x05\x04\x0b\t\x01\x02\x12\x04\xf2\x03\x0e\x0f\n\x0c\n\x04\x04\
+    \x0b\t\x02\x12\x04\xf2\x03\x11\x12\n\r\n\x05\x04\x0b\t\x02\x01\x12\x04\
+    \xf2\x03\x11\x12\n\r\n\x05\x04\x0b\t\x02\x02\x12\x04\xf2\x03\x11\x12\n\
+    \xa0\x06\n\x04\x04\x0b\x02\x03\x12\x04\x89\x04\x02\x1e\x1a\x91\x06\x20Wh\
+    ether\x20the\x20message\x20is\x20an\x20automatically\x20generated\x20map\
+    \x20entry\x20type\x20for\x20the\n\x20maps\x20field.\n\n\x20For\x20maps\
+    \x20fields:\n\x20\x20\x20\x20\x20map<KeyType,\x20ValueType>\x20map_field\
+    \x20=\x201;\n\x20The\x20parsed\x20descriptor\x20looks\x20like:\n\x20\x20\
+    \x20\x20\x20message\x20MapFieldEntry\x20{\n\x20\x20\x20\x20\x20\x20\x20\
+    \x20\x20option\x20map_entry\x20=\x20true;\n\x20\x20\x20\x20\x20\x20\x20\
+    \x20\x20optional\x20KeyType\x20key\x20=\x201;\n\x20\x20\x20\x20\x20\x20\
+    \x20\x20\x20optional\x20ValueType\x20value\x20=\x202;\n\x20\x20\x20\x20\
+    \x20}\n\x20\x20\x20\x20\x20repeated\x20MapFieldEntry\x20map_field\x20=\
+    \x201;\n\n\x20Implementations\x20may\x20choose\x20not\x20to\x20generate\
+    \x20the\x20map_entry=true\x20message,\x20but\n\x20use\x20a\x20native\x20\
+    map\x20in\x20the\x20target\x20language\x20to\x20hold\x20the\x20keys\x20a\
+    nd\x20values.\n\x20The\x20reflection\x20APIs\x20in\x20such\x20implementa\
+    tions\x20still\x20need\x20to\x20work\x20as\n\x20if\x20the\x20field\x20is\
+    \x20a\x20repeated\x20message\x20field.\n\n\x20NOTE:\x20Do\x20not\x20set\
+    \x20the\x20option\x20in\x20.proto\x20files.\x20Always\x20use\x20the\x20m\
+    aps\x20syntax\n\x20instead.\x20The\x20option\x20should\x20only\x20be\x20\
+    implicitly\x20set\x20by\x20the\x20proto\x20compiler\n\x20parser.\n\n\r\n\
+    \x05\x04\x0b\x02\x03\x04\x12\x04\x89\x04\x02\n\n\r\n\x05\x04\x0b\x02\x03\
+    \x05\x12\x04\x89\x04\x0b\x0f\n\r\n\x05\x04\x0b\x02\x03\x01\x12\x04\x89\
+    \x04\x10\x19\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\x89\x04\x1c\x1d\n$\n\
+    \x03\x04\x0b\t\x12\x04\x8b\x04\x02\r\"\x17\x20javalite_serializable\n\n\
+    \x0c\n\x04\x04\x0b\t\x03\x12\x04\x8b\x04\x0b\x0c\n\r\n\x05\x04\x0b\t\x03\
+    \x01\x12\x04\x8b\x04\x0b\x0c\n\r\n\x05\x04\x0b\t\x03\x02\x12\x04\x8b\x04\
+    \x0b\x0c\n\x1f\n\x03\x04\x0b\t\x12\x04\x8c\x04\x02\r\"\x12\x20javanano_a\
+    s_lite\n\n\x0c\n\x04\x04\x0b\t\x04\x12\x04\x8c\x04\x0b\x0c\n\r\n\x05\x04\
+    \x0b\t\x04\x01\x12\x04\x8c\x04\x0b\x0c\n\r\n\x05\x04\x0b\t\x04\x02\x12\
+    \x04\x8c\x04\x0b\x0c\nO\n\x04\x04\x0b\x02\x04\x12\x04\x90\x04\x02:\x1aA\
+    \x20The\x20parser\x20stores\x20options\x20it\x20doesn't\x20recognize\x20\
+    here.\x20See\x20above.\n\n\r\n\x05\x04\x0b\x02\x04\x04\x12\x04\x90\x04\
+    \x02\n\n\r\n\x05\x04\x0b\x02\x04\x06\x12\x04\x90\x04\x0b\x1e\n\r\n\x05\
+    \x04\x0b\x02\x04\x01\x12\x04\x90\x04\x1f3\n\r\n\x05\x04\x0b\x02\x04\x03\
+    \x12\x04\x90\x0469\nZ\n\x03\x04\x0b\x05\x12\x04\x93\x04\x02\x19\x1aM\x20\
+    Clients\x20can\x20define\x20custom\x20options\x20in\x20extensions\x20of\
+    \x20this\x20message.\x20See\x20above.\n\n\x0c\n\x04\x04\x0b\x05\0\x12\
+    \x04\x93\x04\r\x18\n\r\n\x05\x04\x0b\x05\0\x01\x12\x04\x93\x04\r\x11\n\r\
+    \n\x05\x04\x0b\x05\0\x02\x12\x04\x93\x04\x15\x18\n\x0c\n\x02\x04\x0c\x12\
+    \x06\x96\x04\0\xf1\x04\x01\n\x0b\n\x03\x04\x0c\x01\x12\x04\x96\x04\x08\
+    \x14\n\xa3\x02\n\x04\x04\x0c\x02\0\x12\x04\x9b\x04\x02.\x1a\x94\x02\x20T\
+    he\x20ctype\x20option\x20instructs\x20the\x20C++\x20code\x20generator\
+    \x20to\x20use\x20a\x20different\n\x20representation\x20of\x20the\x20fiel\
+    d\x20than\x20it\x20normally\x20would.\x20\x20See\x20the\x20specific\n\
+    \x20options\x20below.\x20\x20This\x20option\x20is\x20not\x20yet\x20imple\
+    mented\x20in\x20the\x20open\x20source\n\x20release\x20--\x20sorry,\x20we\
+    'll\x20try\x20to\x20include\x20it\x20in\x20a\x20future\x20version!\n\n\r\
+    \n\x05\x04\x0c\x02\0\x04\x12\x04\x9b\x04\x02\n\n\r\n\x05\x04\x0c\x02\0\
+    \x06\x12\x04\x9b\x04\x0b\x10\n\r\n\x05\x04\x0c\x02\0\x01\x12\x04\x9b\x04\
+    \x11\x16\n\r\n\x05\x04\x0c\x02\0\x03\x12\x04\x9b\x04\x19\x1a\n\r\n\x05\
+    \x04\x0c\x02\0\x08\x12\x04\x9b\x04\x1b-\n\r\n\x05\x04\x0c\x02\0\x07\x12\
+    \x04\x9b\x04&,\n\x0e\n\x04\x04\x0c\x04\0\x12\x06\x9c\x04\x02\xa3\x04\x03\
+    \n\r\n\x05\x04\x0c\x04\0\x01\x12\x04\x9c\x04\x07\x0c\n\x1f\n\x06\x04\x0c\
+    \x04\0\x02\0\x12\x04\x9e\x04\x04\x0f\x1a\x0f\x20Default\x20mode.\n\n\x0f\
+    \n\x07\x04\x0c\x04\0\x02\0\x01\x12\x04\x9e\x04\x04\n\n\x0f\n\x07\x04\x0c\
+    \x04\0\x02\0\x02\x12\x04\x9e\x04\r\x0e\n\x0e\n\x06\x04\x0c\x04\0\x02\x01\
+    \x12\x04\xa0\x04\x04\r\n\x0f\n\x07\x04\x0c\x04\0\x02\x01\x01\x12\x04\xa0\
+    \x04\x04\x08\n\x0f\n\x07\x04\x0c\x04\0\x02\x01\x02\x12\x04\xa0\x04\x0b\
+    \x0c\n\x0e\n\x06\x04\x0c\x04\0\x02\x02\x12\x04\xa2\x04\x04\x15\n\x0f\n\
+    \x07\x04\x0c\x04\0\x02\x02\x01\x12\x04\xa2\x04\x04\x10\n\x0f\n\x07\x04\
+    \x0c\x04\0\x02\x02\x02\x12\x04\xa2\x04\x13\x14\n\xda\x02\n\x04\x04\x0c\
+    \x02\x01\x12\x04\xa9\x04\x02\x1b\x1a\xcb\x02\x20The\x20packed\x20option\
     \x20can\x20be\x20enabled\x20for\x20repeated\x20primitive\x20fields\x20to\
     \x20enable\n\x20a\x20more\x20efficient\x20representation\x20on\x20the\
     \x20wire.\x20Rather\x20than\x20repeatedly\n\x20writing\x20the\x20tag\x20\
@@ -10364,10 +9086,10 @@
     \x20encoded\x20as\n\x20a\x20single\x20length-delimited\x20blob.\x20In\
     \x20proto3,\x20only\x20explicit\x20setting\x20it\x20to\n\x20false\x20wil\
     l\x20avoid\x20using\x20packed\x20encoding.\n\n\r\n\x05\x04\x0c\x02\x01\
-    \x04\x12\x04\xa7\x04\x02\n\n\r\n\x05\x04\x0c\x02\x01\x05\x12\x04\xa7\x04\
-    \x0b\x0f\n\r\n\x05\x04\x0c\x02\x01\x01\x12\x04\xa7\x04\x10\x16\n\r\n\x05\
-    \x04\x0c\x02\x01\x03\x12\x04\xa7\x04\x19\x1a\n\x9a\x05\n\x04\x04\x0c\x02\
-    \x02\x12\x04\xb4\x04\x023\x1a\x8b\x05\x20The\x20jstype\x20option\x20dete\
+    \x04\x12\x04\xa9\x04\x02\n\n\r\n\x05\x04\x0c\x02\x01\x05\x12\x04\xa9\x04\
+    \x0b\x0f\n\r\n\x05\x04\x0c\x02\x01\x01\x12\x04\xa9\x04\x10\x16\n\r\n\x05\
+    \x04\x0c\x02\x01\x03\x12\x04\xa9\x04\x19\x1a\n\x9a\x05\n\x04\x04\x0c\x02\
+    \x02\x12\x04\xb6\x04\x023\x1a\x8b\x05\x20The\x20jstype\x20option\x20dete\
     rmines\x20the\x20JavaScript\x20type\x20used\x20for\x20values\x20of\x20th\
     e\n\x20field.\x20\x20The\x20option\x20is\x20permitted\x20only\x20for\x20\
     64\x20bit\x20integral\x20and\x20fixed\x20types\n\x20(int64,\x20uint64,\
@@ -10381,23 +9103,23 @@
     of\x20the\x20default\x20option\n\x20JS_NORMAL\x20is\x20implementation\
     \x20dependent.\n\n\x20This\x20option\x20is\x20an\x20enum\x20to\x20permit\
     \x20additional\x20types\x20to\x20be\x20added,\x20e.g.\n\x20goog.math.Int\
-    eger.\n\n\r\n\x05\x04\x0c\x02\x02\x04\x12\x04\xb4\x04\x02\n\n\r\n\x05\
-    \x04\x0c\x02\x02\x06\x12\x04\xb4\x04\x0b\x11\n\r\n\x05\x04\x0c\x02\x02\
-    \x01\x12\x04\xb4\x04\x12\x18\n\r\n\x05\x04\x0c\x02\x02\x03\x12\x04\xb4\
-    \x04\x1b\x1c\n\r\n\x05\x04\x0c\x02\x02\x08\x12\x04\xb4\x04\x1d2\n\r\n\
-    \x05\x04\x0c\x02\x02\x07\x12\x04\xb4\x04(1\n\x0e\n\x04\x04\x0c\x04\x01\
-    \x12\x06\xb5\x04\x02\xbe\x04\x03\n\r\n\x05\x04\x0c\x04\x01\x01\x12\x04\
-    \xb5\x04\x07\r\n'\n\x06\x04\x0c\x04\x01\x02\0\x12\x04\xb7\x04\x04\x12\
+    eger.\n\n\r\n\x05\x04\x0c\x02\x02\x04\x12\x04\xb6\x04\x02\n\n\r\n\x05\
+    \x04\x0c\x02\x02\x06\x12\x04\xb6\x04\x0b\x11\n\r\n\x05\x04\x0c\x02\x02\
+    \x01\x12\x04\xb6\x04\x12\x18\n\r\n\x05\x04\x0c\x02\x02\x03\x12\x04\xb6\
+    \x04\x1b\x1c\n\r\n\x05\x04\x0c\x02\x02\x08\x12\x04\xb6\x04\x1d2\n\r\n\
+    \x05\x04\x0c\x02\x02\x07\x12\x04\xb6\x04(1\n\x0e\n\x04\x04\x0c\x04\x01\
+    \x12\x06\xb7\x04\x02\xc0\x04\x03\n\r\n\x05\x04\x0c\x04\x01\x01\x12\x04\
+    \xb7\x04\x07\r\n'\n\x06\x04\x0c\x04\x01\x02\0\x12\x04\xb9\x04\x04\x12\
     \x1a\x17\x20Use\x20the\x20default\x20type.\n\n\x0f\n\x07\x04\x0c\x04\x01\
-    \x02\0\x01\x12\x04\xb7\x04\x04\r\n\x0f\n\x07\x04\x0c\x04\x01\x02\0\x02\
-    \x12\x04\xb7\x04\x10\x11\n)\n\x06\x04\x0c\x04\x01\x02\x01\x12\x04\xba\
+    \x02\0\x01\x12\x04\xb9\x04\x04\r\n\x0f\n\x07\x04\x0c\x04\x01\x02\0\x02\
+    \x12\x04\xb9\x04\x10\x11\n)\n\x06\x04\x0c\x04\x01\x02\x01\x12\x04\xbc\
     \x04\x04\x12\x1a\x19\x20Use\x20JavaScript\x20strings.\n\n\x0f\n\x07\x04\
-    \x0c\x04\x01\x02\x01\x01\x12\x04\xba\x04\x04\r\n\x0f\n\x07\x04\x0c\x04\
-    \x01\x02\x01\x02\x12\x04\xba\x04\x10\x11\n)\n\x06\x04\x0c\x04\x01\x02\
-    \x02\x12\x04\xbd\x04\x04\x12\x1a\x19\x20Use\x20JavaScript\x20numbers.\n\
-    \n\x0f\n\x07\x04\x0c\x04\x01\x02\x02\x01\x12\x04\xbd\x04\x04\r\n\x0f\n\
-    \x07\x04\x0c\x04\x01\x02\x02\x02\x12\x04\xbd\x04\x10\x11\n\xef\x0c\n\x04\
-    \x04\x0c\x02\x03\x12\x04\xdc\x04\x02+\x1a\xe0\x0c\x20Should\x20this\x20f\
+    \x0c\x04\x01\x02\x01\x01\x12\x04\xbc\x04\x04\r\n\x0f\n\x07\x04\x0c\x04\
+    \x01\x02\x01\x02\x12\x04\xbc\x04\x10\x11\n)\n\x06\x04\x0c\x04\x01\x02\
+    \x02\x12\x04\xbf\x04\x04\x12\x1a\x19\x20Use\x20JavaScript\x20numbers.\n\
+    \n\x0f\n\x07\x04\x0c\x04\x01\x02\x02\x01\x12\x04\xbf\x04\x04\r\n\x0f\n\
+    \x07\x04\x0c\x04\x01\x02\x02\x02\x12\x04\xbf\x04\x10\x11\n\xef\x0c\n\x04\
+    \x04\x0c\x02\x03\x12\x04\xde\x04\x02+\x1a\xe0\x0c\x20Should\x20this\x20f\
     ield\x20be\x20parsed\x20lazily?\x20\x20Lazy\x20applies\x20only\x20to\x20\
     message-type\n\x20fields.\x20\x20It\x20means\x20that\x20when\x20the\x20o\
     uter\x20message\x20is\x20initially\x20parsed,\x20the\n\x20inner\x20messa\
@@ -10432,101 +9154,101 @@
     \x20either\x20*always*\x20check\x20its\x20required\x20fields,\x20or\x20*\
     never*\n\x20check\x20its\x20required\x20fields,\x20regardless\x20of\x20w\
     hether\x20or\x20not\x20the\x20message\x20has\n\x20been\x20parsed.\n\n\r\
-    \n\x05\x04\x0c\x02\x03\x04\x12\x04\xdc\x04\x02\n\n\r\n\x05\x04\x0c\x02\
-    \x03\x05\x12\x04\xdc\x04\x0b\x0f\n\r\n\x05\x04\x0c\x02\x03\x01\x12\x04\
-    \xdc\x04\x10\x14\n\r\n\x05\x04\x0c\x02\x03\x03\x12\x04\xdc\x04\x17\x18\n\
-    \r\n\x05\x04\x0c\x02\x03\x08\x12\x04\xdc\x04\x19*\n\r\n\x05\x04\x0c\x02\
-    \x03\x07\x12\x04\xdc\x04$)\n\xe8\x01\n\x04\x04\x0c\x02\x04\x12\x04\xe2\
+    \n\x05\x04\x0c\x02\x03\x04\x12\x04\xde\x04\x02\n\n\r\n\x05\x04\x0c\x02\
+    \x03\x05\x12\x04\xde\x04\x0b\x0f\n\r\n\x05\x04\x0c\x02\x03\x01\x12\x04\
+    \xde\x04\x10\x14\n\r\n\x05\x04\x0c\x02\x03\x03\x12\x04\xde\x04\x17\x18\n\
+    \r\n\x05\x04\x0c\x02\x03\x08\x12\x04\xde\x04\x19*\n\r\n\x05\x04\x0c\x02\
+    \x03\x07\x12\x04\xde\x04$)\n\xe8\x01\n\x04\x04\x0c\x02\x04\x12\x04\xe4\
     \x04\x021\x1a\xd9\x01\x20Is\x20this\x20field\x20deprecated?\n\x20Dependi\
     ng\x20on\x20the\x20target\x20platform,\x20this\x20can\x20emit\x20Depreca\
     ted\x20annotations\n\x20for\x20accessors,\x20or\x20it\x20will\x20be\x20c\
     ompletely\x20ignored;\x20in\x20the\x20very\x20least,\x20this\n\x20is\x20\
     a\x20formalization\x20for\x20deprecating\x20fields.\n\n\r\n\x05\x04\x0c\
-    \x02\x04\x04\x12\x04\xe2\x04\x02\n\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\
-    \xe2\x04\x0b\x0f\n\r\n\x05\x04\x0c\x02\x04\x01\x12\x04\xe2\x04\x10\x1a\n\
-    \r\n\x05\x04\x0c\x02\x04\x03\x12\x04\xe2\x04\x1d\x1e\n\r\n\x05\x04\x0c\
-    \x02\x04\x08\x12\x04\xe2\x04\x1f0\n\r\n\x05\x04\x0c\x02\x04\x07\x12\x04\
-    \xe2\x04*/\n?\n\x04\x04\x0c\x02\x05\x12\x04\xe5\x04\x02,\x1a1\x20For\x20\
+    \x02\x04\x04\x12\x04\xe4\x04\x02\n\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\
+    \xe4\x04\x0b\x0f\n\r\n\x05\x04\x0c\x02\x04\x01\x12\x04\xe4\x04\x10\x1a\n\
+    \r\n\x05\x04\x0c\x02\x04\x03\x12\x04\xe4\x04\x1d\x1e\n\r\n\x05\x04\x0c\
+    \x02\x04\x08\x12\x04\xe4\x04\x1f0\n\r\n\x05\x04\x0c\x02\x04\x07\x12\x04\
+    \xe4\x04*/\n?\n\x04\x04\x0c\x02\x05\x12\x04\xe7\x04\x02,\x1a1\x20For\x20\
     Google-internal\x20migration\x20only.\x20Do\x20not\x20use.\n\n\r\n\x05\
-    \x04\x0c\x02\x05\x04\x12\x04\xe5\x04\x02\n\n\r\n\x05\x04\x0c\x02\x05\x05\
-    \x12\x04\xe5\x04\x0b\x0f\n\r\n\x05\x04\x0c\x02\x05\x01\x12\x04\xe5\x04\
-    \x10\x14\n\r\n\x05\x04\x0c\x02\x05\x03\x12\x04\xe5\x04\x17\x19\n\r\n\x05\
-    \x04\x0c\x02\x05\x08\x12\x04\xe5\x04\x1a+\n\r\n\x05\x04\x0c\x02\x05\x07\
-    \x12\x04\xe5\x04%*\nO\n\x04\x04\x0c\x02\x06\x12\x04\xe9\x04\x02:\x1aA\
+    \x04\x0c\x02\x05\x04\x12\x04\xe7\x04\x02\n\n\r\n\x05\x04\x0c\x02\x05\x05\
+    \x12\x04\xe7\x04\x0b\x0f\n\r\n\x05\x04\x0c\x02\x05\x01\x12\x04\xe7\x04\
+    \x10\x14\n\r\n\x05\x04\x0c\x02\x05\x03\x12\x04\xe7\x04\x17\x19\n\r\n\x05\
+    \x04\x0c\x02\x05\x08\x12\x04\xe7\x04\x1a+\n\r\n\x05\x04\x0c\x02\x05\x07\
+    \x12\x04\xe7\x04%*\nO\n\x04\x04\x0c\x02\x06\x12\x04\xeb\x04\x02:\x1aA\
     \x20The\x20parser\x20stores\x20options\x20it\x20doesn't\x20recognize\x20\
-    here.\x20See\x20above.\n\n\r\n\x05\x04\x0c\x02\x06\x04\x12\x04\xe9\x04\
-    \x02\n\n\r\n\x05\x04\x0c\x02\x06\x06\x12\x04\xe9\x04\x0b\x1e\n\r\n\x05\
-    \x04\x0c\x02\x06\x01\x12\x04\xe9\x04\x1f3\n\r\n\x05\x04\x0c\x02\x06\x03\
-    \x12\x04\xe9\x0469\nZ\n\x03\x04\x0c\x05\x12\x04\xec\x04\x02\x19\x1aM\x20\
+    here.\x20See\x20above.\n\n\r\n\x05\x04\x0c\x02\x06\x04\x12\x04\xeb\x04\
+    \x02\n\n\r\n\x05\x04\x0c\x02\x06\x06\x12\x04\xeb\x04\x0b\x1e\n\r\n\x05\
+    \x04\x0c\x02\x06\x01\x12\x04\xeb\x04\x1f3\n\r\n\x05\x04\x0c\x02\x06\x03\
+    \x12\x04\xeb\x0469\nZ\n\x03\x04\x0c\x05\x12\x04\xee\x04\x02\x19\x1aM\x20\
     Clients\x20can\x20define\x20custom\x20options\x20in\x20extensions\x20of\
     \x20this\x20message.\x20See\x20above.\n\n\x0c\n\x04\x04\x0c\x05\0\x12\
-    \x04\xec\x04\r\x18\n\r\n\x05\x04\x0c\x05\0\x01\x12\x04\xec\x04\r\x11\n\r\
-    \n\x05\x04\x0c\x05\0\x02\x12\x04\xec\x04\x15\x18\n\x1c\n\x03\x04\x0c\t\
-    \x12\x04\xee\x04\x02\r\"\x0f\x20removed\x20jtype\n\n\x0c\n\x04\x04\x0c\t\
-    \0\x12\x04\xee\x04\x0b\x0c\n\r\n\x05\x04\x0c\t\0\x01\x12\x04\xee\x04\x0b\
-    \x0c\n\r\n\x05\x04\x0c\t\0\x02\x12\x04\xee\x04\x0b\x0c\n\x0c\n\x02\x04\r\
-    \x12\x06\xf1\x04\0\xf7\x04\x01\n\x0b\n\x03\x04\r\x01\x12\x04\xf1\x04\x08\
-    \x14\nO\n\x04\x04\r\x02\0\x12\x04\xf3\x04\x02:\x1aA\x20The\x20parser\x20\
+    \x04\xee\x04\r\x18\n\r\n\x05\x04\x0c\x05\0\x01\x12\x04\xee\x04\r\x11\n\r\
+    \n\x05\x04\x0c\x05\0\x02\x12\x04\xee\x04\x15\x18\n\x1c\n\x03\x04\x0c\t\
+    \x12\x04\xf0\x04\x02\r\"\x0f\x20removed\x20jtype\n\n\x0c\n\x04\x04\x0c\t\
+    \0\x12\x04\xf0\x04\x0b\x0c\n\r\n\x05\x04\x0c\t\0\x01\x12\x04\xf0\x04\x0b\
+    \x0c\n\r\n\x05\x04\x0c\t\0\x02\x12\x04\xf0\x04\x0b\x0c\n\x0c\n\x02\x04\r\
+    \x12\x06\xf3\x04\0\xf9\x04\x01\n\x0b\n\x03\x04\r\x01\x12\x04\xf3\x04\x08\
+    \x14\nO\n\x04\x04\r\x02\0\x12\x04\xf5\x04\x02:\x1aA\x20The\x20parser\x20\
     stores\x20options\x20it\x20doesn't\x20recognize\x20here.\x20See\x20above\
-    .\n\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xf3\x04\x02\n\n\r\n\x05\x04\r\x02\
-    \0\x06\x12\x04\xf3\x04\x0b\x1e\n\r\n\x05\x04\r\x02\0\x01\x12\x04\xf3\x04\
-    \x1f3\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xf3\x0469\nZ\n\x03\x04\r\x05\x12\
-    \x04\xf6\x04\x02\x19\x1aM\x20Clients\x20can\x20define\x20custom\x20optio\
+    .\n\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xf5\x04\x02\n\n\r\n\x05\x04\r\x02\
+    \0\x06\x12\x04\xf5\x04\x0b\x1e\n\r\n\x05\x04\r\x02\0\x01\x12\x04\xf5\x04\
+    \x1f3\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xf5\x0469\nZ\n\x03\x04\r\x05\x12\
+    \x04\xf8\x04\x02\x19\x1aM\x20Clients\x20can\x20define\x20custom\x20optio\
     ns\x20in\x20extensions\x20of\x20this\x20message.\x20See\x20above.\n\n\
-    \x0c\n\x04\x04\r\x05\0\x12\x04\xf6\x04\r\x18\n\r\n\x05\x04\r\x05\0\x01\
-    \x12\x04\xf6\x04\r\x11\n\r\n\x05\x04\r\x05\0\x02\x12\x04\xf6\x04\x15\x18\
-    \n\x0c\n\x02\x04\x0e\x12\x06\xf9\x04\0\x8c\x05\x01\n\x0b\n\x03\x04\x0e\
-    \x01\x12\x04\xf9\x04\x08\x13\n`\n\x04\x04\x0e\x02\0\x12\x04\xfd\x04\x02\
+    \x0c\n\x04\x04\r\x05\0\x12\x04\xf8\x04\r\x18\n\r\n\x05\x04\r\x05\0\x01\
+    \x12\x04\xf8\x04\r\x11\n\r\n\x05\x04\r\x05\0\x02\x12\x04\xf8\x04\x15\x18\
+    \n\x0c\n\x02\x04\x0e\x12\x06\xfb\x04\0\x8e\x05\x01\n\x0b\n\x03\x04\x0e\
+    \x01\x12\x04\xfb\x04\x08\x13\n`\n\x04\x04\x0e\x02\0\x12\x04\xff\x04\x02\
     \x20\x1aR\x20Set\x20this\x20option\x20to\x20true\x20to\x20allow\x20mappi\
     ng\x20different\x20tag\x20names\x20to\x20the\x20same\n\x20value.\n\n\r\n\
-    \x05\x04\x0e\x02\0\x04\x12\x04\xfd\x04\x02\n\n\r\n\x05\x04\x0e\x02\0\x05\
-    \x12\x04\xfd\x04\x0b\x0f\n\r\n\x05\x04\x0e\x02\0\x01\x12\x04\xfd\x04\x10\
-    \x1b\n\r\n\x05\x04\x0e\x02\0\x03\x12\x04\xfd\x04\x1e\x1f\n\xe5\x01\n\x04\
-    \x04\x0e\x02\x01\x12\x04\x83\x05\x021\x1a\xd6\x01\x20Is\x20this\x20enum\
+    \x05\x04\x0e\x02\0\x04\x12\x04\xff\x04\x02\n\n\r\n\x05\x04\x0e\x02\0\x05\
+    \x12\x04\xff\x04\x0b\x0f\n\r\n\x05\x04\x0e\x02\0\x01\x12\x04\xff\x04\x10\
+    \x1b\n\r\n\x05\x04\x0e\x02\0\x03\x12\x04\xff\x04\x1e\x1f\n\xe5\x01\n\x04\
+    \x04\x0e\x02\x01\x12\x04\x85\x05\x021\x1a\xd6\x01\x20Is\x20this\x20enum\
     \x20deprecated?\n\x20Depending\x20on\x20the\x20target\x20platform,\x20th\
     is\x20can\x20emit\x20Deprecated\x20annotations\n\x20for\x20the\x20enum,\
     \x20or\x20it\x20will\x20be\x20completely\x20ignored;\x20in\x20the\x20ver\
     y\x20least,\x20this\n\x20is\x20a\x20formalization\x20for\x20deprecating\
-    \x20enums.\n\n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\x83\x05\x02\n\n\r\n\
-    \x05\x04\x0e\x02\x01\x05\x12\x04\x83\x05\x0b\x0f\n\r\n\x05\x04\x0e\x02\
-    \x01\x01\x12\x04\x83\x05\x10\x1a\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\
-    \x83\x05\x1d\x1e\n\r\n\x05\x04\x0e\x02\x01\x08\x12\x04\x83\x05\x1f0\n\r\
-    \n\x05\x04\x0e\x02\x01\x07\x12\x04\x83\x05*/\n\x1f\n\x03\x04\x0e\t\x12\
-    \x04\x85\x05\x02\r\"\x12\x20javanano_as_lite\n\n\x0c\n\x04\x04\x0e\t\0\
-    \x12\x04\x85\x05\x0b\x0c\n\r\n\x05\x04\x0e\t\0\x01\x12\x04\x85\x05\x0b\
-    \x0c\n\r\n\x05\x04\x0e\t\0\x02\x12\x04\x85\x05\x0b\x0c\nO\n\x04\x04\x0e\
-    \x02\x02\x12\x04\x88\x05\x02:\x1aA\x20The\x20parser\x20stores\x20options\
+    \x20enums.\n\n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\x85\x05\x02\n\n\r\n\
+    \x05\x04\x0e\x02\x01\x05\x12\x04\x85\x05\x0b\x0f\n\r\n\x05\x04\x0e\x02\
+    \x01\x01\x12\x04\x85\x05\x10\x1a\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\
+    \x85\x05\x1d\x1e\n\r\n\x05\x04\x0e\x02\x01\x08\x12\x04\x85\x05\x1f0\n\r\
+    \n\x05\x04\x0e\x02\x01\x07\x12\x04\x85\x05*/\n\x1f\n\x03\x04\x0e\t\x12\
+    \x04\x87\x05\x02\r\"\x12\x20javanano_as_lite\n\n\x0c\n\x04\x04\x0e\t\0\
+    \x12\x04\x87\x05\x0b\x0c\n\r\n\x05\x04\x0e\t\0\x01\x12\x04\x87\x05\x0b\
+    \x0c\n\r\n\x05\x04\x0e\t\0\x02\x12\x04\x87\x05\x0b\x0c\nO\n\x04\x04\x0e\
+    \x02\x02\x12\x04\x8a\x05\x02:\x1aA\x20The\x20parser\x20stores\x20options\
     \x20it\x20doesn't\x20recognize\x20here.\x20See\x20above.\n\n\r\n\x05\x04\
-    \x0e\x02\x02\x04\x12\x04\x88\x05\x02\n\n\r\n\x05\x04\x0e\x02\x02\x06\x12\
-    \x04\x88\x05\x0b\x1e\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\x88\x05\x1f3\
-    \n\r\n\x05\x04\x0e\x02\x02\x03\x12\x04\x88\x0569\nZ\n\x03\x04\x0e\x05\
-    \x12\x04\x8b\x05\x02\x19\x1aM\x20Clients\x20can\x20define\x20custom\x20o\
+    \x0e\x02\x02\x04\x12\x04\x8a\x05\x02\n\n\r\n\x05\x04\x0e\x02\x02\x06\x12\
+    \x04\x8a\x05\x0b\x1e\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\x8a\x05\x1f3\
+    \n\r\n\x05\x04\x0e\x02\x02\x03\x12\x04\x8a\x0569\nZ\n\x03\x04\x0e\x05\
+    \x12\x04\x8d\x05\x02\x19\x1aM\x20Clients\x20can\x20define\x20custom\x20o\
     ptions\x20in\x20extensions\x20of\x20this\x20message.\x20See\x20above.\n\
-    \n\x0c\n\x04\x04\x0e\x05\0\x12\x04\x8b\x05\r\x18\n\r\n\x05\x04\x0e\x05\0\
-    \x01\x12\x04\x8b\x05\r\x11\n\r\n\x05\x04\x0e\x05\0\x02\x12\x04\x8b\x05\
-    \x15\x18\n\x0c\n\x02\x04\x0f\x12\x06\x8e\x05\0\x9a\x05\x01\n\x0b\n\x03\
-    \x04\x0f\x01\x12\x04\x8e\x05\x08\x18\n\xf7\x01\n\x04\x04\x0f\x02\0\x12\
-    \x04\x93\x05\x021\x1a\xe8\x01\x20Is\x20this\x20enum\x20value\x20deprecat\
+    \n\x0c\n\x04\x04\x0e\x05\0\x12\x04\x8d\x05\r\x18\n\r\n\x05\x04\x0e\x05\0\
+    \x01\x12\x04\x8d\x05\r\x11\n\r\n\x05\x04\x0e\x05\0\x02\x12\x04\x8d\x05\
+    \x15\x18\n\x0c\n\x02\x04\x0f\x12\x06\x90\x05\0\x9c\x05\x01\n\x0b\n\x03\
+    \x04\x0f\x01\x12\x04\x90\x05\x08\x18\n\xf7\x01\n\x04\x04\x0f\x02\0\x12\
+    \x04\x95\x05\x021\x1a\xe8\x01\x20Is\x20this\x20enum\x20value\x20deprecat\
     ed?\n\x20Depending\x20on\x20the\x20target\x20platform,\x20this\x20can\
     \x20emit\x20Deprecated\x20annotations\n\x20for\x20the\x20enum\x20value,\
     \x20or\x20it\x20will\x20be\x20completely\x20ignored;\x20in\x20the\x20ver\
     y\x20least,\n\x20this\x20is\x20a\x20formalization\x20for\x20deprecating\
-    \x20enum\x20values.\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\x93\x05\x02\n\
-    \n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\x93\x05\x0b\x0f\n\r\n\x05\x04\x0f\
-    \x02\0\x01\x12\x04\x93\x05\x10\x1a\n\r\n\x05\x04\x0f\x02\0\x03\x12\x04\
-    \x93\x05\x1d\x1e\n\r\n\x05\x04\x0f\x02\0\x08\x12\x04\x93\x05\x1f0\n\r\n\
-    \x05\x04\x0f\x02\0\x07\x12\x04\x93\x05*/\nO\n\x04\x04\x0f\x02\x01\x12\
-    \x04\x96\x05\x02:\x1aA\x20The\x20parser\x20stores\x20options\x20it\x20do\
+    \x20enum\x20values.\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\x95\x05\x02\n\
+    \n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\x95\x05\x0b\x0f\n\r\n\x05\x04\x0f\
+    \x02\0\x01\x12\x04\x95\x05\x10\x1a\n\r\n\x05\x04\x0f\x02\0\x03\x12\x04\
+    \x95\x05\x1d\x1e\n\r\n\x05\x04\x0f\x02\0\x08\x12\x04\x95\x05\x1f0\n\r\n\
+    \x05\x04\x0f\x02\0\x07\x12\x04\x95\x05*/\nO\n\x04\x04\x0f\x02\x01\x12\
+    \x04\x98\x05\x02:\x1aA\x20The\x20parser\x20stores\x20options\x20it\x20do\
     esn't\x20recognize\x20here.\x20See\x20above.\n\n\r\n\x05\x04\x0f\x02\x01\
-    \x04\x12\x04\x96\x05\x02\n\n\r\n\x05\x04\x0f\x02\x01\x06\x12\x04\x96\x05\
-    \x0b\x1e\n\r\n\x05\x04\x0f\x02\x01\x01\x12\x04\x96\x05\x1f3\n\r\n\x05\
-    \x04\x0f\x02\x01\x03\x12\x04\x96\x0569\nZ\n\x03\x04\x0f\x05\x12\x04\x99\
+    \x04\x12\x04\x98\x05\x02\n\n\r\n\x05\x04\x0f\x02\x01\x06\x12\x04\x98\x05\
+    \x0b\x1e\n\r\n\x05\x04\x0f\x02\x01\x01\x12\x04\x98\x05\x1f3\n\r\n\x05\
+    \x04\x0f\x02\x01\x03\x12\x04\x98\x0569\nZ\n\x03\x04\x0f\x05\x12\x04\x9b\
     \x05\x02\x19\x1aM\x20Clients\x20can\x20define\x20custom\x20options\x20in\
     \x20extensions\x20of\x20this\x20message.\x20See\x20above.\n\n\x0c\n\x04\
-    \x04\x0f\x05\0\x12\x04\x99\x05\r\x18\n\r\n\x05\x04\x0f\x05\0\x01\x12\x04\
-    \x99\x05\r\x11\n\r\n\x05\x04\x0f\x05\0\x02\x12\x04\x99\x05\x15\x18\n\x0c\
-    \n\x02\x04\x10\x12\x06\x9c\x05\0\xae\x05\x01\n\x0b\n\x03\x04\x10\x01\x12\
-    \x04\x9c\x05\x08\x16\n\xd9\x03\n\x04\x04\x10\x02\0\x12\x04\xa7\x05\x022\
+    \x04\x0f\x05\0\x12\x04\x9b\x05\r\x18\n\r\n\x05\x04\x0f\x05\0\x01\x12\x04\
+    \x9b\x05\r\x11\n\r\n\x05\x04\x0f\x05\0\x02\x12\x04\x9b\x05\x15\x18\n\x0c\
+    \n\x02\x04\x10\x12\x06\x9e\x05\0\xb0\x05\x01\n\x0b\n\x03\x04\x10\x01\x12\
+    \x04\x9e\x05\x08\x16\n\xd9\x03\n\x04\x04\x10\x02\0\x12\x04\xa9\x05\x022\
     \x1a\xdf\x01\x20Is\x20this\x20service\x20deprecated?\n\x20Depending\x20o\
     n\x20the\x20target\x20platform,\x20this\x20can\x20emit\x20Deprecated\x20\
     annotations\n\x20for\x20the\x20service,\x20or\x20it\x20will\x20be\x20com\
@@ -10537,22 +9259,22 @@
     logize\x20for\x20hoarding\x20these\x20numbers\x20to\x20ourselves,\x20but\
     \n\x20\x20\x20we\x20were\x20already\x20using\x20them\x20long\x20before\
     \x20we\x20decided\x20to\x20release\x20Protocol\n\x20\x20\x20Buffers.\n\n\
-    \r\n\x05\x04\x10\x02\0\x04\x12\x04\xa7\x05\x02\n\n\r\n\x05\x04\x10\x02\0\
-    \x05\x12\x04\xa7\x05\x0b\x0f\n\r\n\x05\x04\x10\x02\0\x01\x12\x04\xa7\x05\
-    \x10\x1a\n\r\n\x05\x04\x10\x02\0\x03\x12\x04\xa7\x05\x1d\x1f\n\r\n\x05\
-    \x04\x10\x02\0\x08\x12\x04\xa7\x05\x201\n\r\n\x05\x04\x10\x02\0\x07\x12\
-    \x04\xa7\x05+0\nO\n\x04\x04\x10\x02\x01\x12\x04\xaa\x05\x02:\x1aA\x20The\
+    \r\n\x05\x04\x10\x02\0\x04\x12\x04\xa9\x05\x02\n\n\r\n\x05\x04\x10\x02\0\
+    \x05\x12\x04\xa9\x05\x0b\x0f\n\r\n\x05\x04\x10\x02\0\x01\x12\x04\xa9\x05\
+    \x10\x1a\n\r\n\x05\x04\x10\x02\0\x03\x12\x04\xa9\x05\x1d\x1f\n\r\n\x05\
+    \x04\x10\x02\0\x08\x12\x04\xa9\x05\x201\n\r\n\x05\x04\x10\x02\0\x07\x12\
+    \x04\xa9\x05+0\nO\n\x04\x04\x10\x02\x01\x12\x04\xac\x05\x02:\x1aA\x20The\
     \x20parser\x20stores\x20options\x20it\x20doesn't\x20recognize\x20here.\
-    \x20See\x20above.\n\n\r\n\x05\x04\x10\x02\x01\x04\x12\x04\xaa\x05\x02\n\
-    \n\r\n\x05\x04\x10\x02\x01\x06\x12\x04\xaa\x05\x0b\x1e\n\r\n\x05\x04\x10\
-    \x02\x01\x01\x12\x04\xaa\x05\x1f3\n\r\n\x05\x04\x10\x02\x01\x03\x12\x04\
-    \xaa\x0569\nZ\n\x03\x04\x10\x05\x12\x04\xad\x05\x02\x19\x1aM\x20Clients\
+    \x20See\x20above.\n\n\r\n\x05\x04\x10\x02\x01\x04\x12\x04\xac\x05\x02\n\
+    \n\r\n\x05\x04\x10\x02\x01\x06\x12\x04\xac\x05\x0b\x1e\n\r\n\x05\x04\x10\
+    \x02\x01\x01\x12\x04\xac\x05\x1f3\n\r\n\x05\x04\x10\x02\x01\x03\x12\x04\
+    \xac\x0569\nZ\n\x03\x04\x10\x05\x12\x04\xaf\x05\x02\x19\x1aM\x20Clients\
     \x20can\x20define\x20custom\x20options\x20in\x20extensions\x20of\x20this\
-    \x20message.\x20See\x20above.\n\n\x0c\n\x04\x04\x10\x05\0\x12\x04\xad\
-    \x05\r\x18\n\r\n\x05\x04\x10\x05\0\x01\x12\x04\xad\x05\r\x11\n\r\n\x05\
-    \x04\x10\x05\0\x02\x12\x04\xad\x05\x15\x18\n\x0c\n\x02\x04\x11\x12\x06\
-    \xb0\x05\0\xcd\x05\x01\n\x0b\n\x03\x04\x11\x01\x12\x04\xb0\x05\x08\x15\n\
-    \xd6\x03\n\x04\x04\x11\x02\0\x12\x04\xbb\x05\x022\x1a\xdc\x01\x20Is\x20t\
+    \x20message.\x20See\x20above.\n\n\x0c\n\x04\x04\x10\x05\0\x12\x04\xaf\
+    \x05\r\x18\n\r\n\x05\x04\x10\x05\0\x01\x12\x04\xaf\x05\r\x11\n\r\n\x05\
+    \x04\x10\x05\0\x02\x12\x04\xaf\x05\x15\x18\n\x0c\n\x02\x04\x11\x12\x06\
+    \xb2\x05\0\xcf\x05\x01\n\x0b\n\x03\x04\x11\x01\x12\x04\xb2\x05\x08\x15\n\
+    \xd6\x03\n\x04\x04\x11\x02\0\x12\x04\xbd\x05\x022\x1a\xdc\x01\x20Is\x20t\
     his\x20method\x20deprecated?\n\x20Depending\x20on\x20the\x20target\x20pl\
     atform,\x20this\x20can\x20emit\x20Deprecated\x20annotations\n\x20for\x20\
     the\x20method,\x20or\x20it\x20will\x20be\x20completely\x20ignored;\x20in\
@@ -10563,41 +9285,41 @@
     g\x20these\x20numbers\x20to\x20ourselves,\x20but\n\x20\x20\x20we\x20were\
     \x20already\x20using\x20them\x20long\x20before\x20we\x20decided\x20to\
     \x20release\x20Protocol\n\x20\x20\x20Buffers.\n\n\r\n\x05\x04\x11\x02\0\
-    \x04\x12\x04\xbb\x05\x02\n\n\r\n\x05\x04\x11\x02\0\x05\x12\x04\xbb\x05\
-    \x0b\x0f\n\r\n\x05\x04\x11\x02\0\x01\x12\x04\xbb\x05\x10\x1a\n\r\n\x05\
-    \x04\x11\x02\0\x03\x12\x04\xbb\x05\x1d\x1f\n\r\n\x05\x04\x11\x02\0\x08\
-    \x12\x04\xbb\x05\x201\n\r\n\x05\x04\x11\x02\0\x07\x12\x04\xbb\x05+0\n\
-    \xf0\x01\n\x04\x04\x11\x04\0\x12\x06\xc0\x05\x02\xc4\x05\x03\x1a\xdf\x01\
+    \x04\x12\x04\xbd\x05\x02\n\n\r\n\x05\x04\x11\x02\0\x05\x12\x04\xbd\x05\
+    \x0b\x0f\n\r\n\x05\x04\x11\x02\0\x01\x12\x04\xbd\x05\x10\x1a\n\r\n\x05\
+    \x04\x11\x02\0\x03\x12\x04\xbd\x05\x1d\x1f\n\r\n\x05\x04\x11\x02\0\x08\
+    \x12\x04\xbd\x05\x201\n\r\n\x05\x04\x11\x02\0\x07\x12\x04\xbd\x05+0\n\
+    \xf0\x01\n\x04\x04\x11\x04\0\x12\x06\xc2\x05\x02\xc6\x05\x03\x1a\xdf\x01\
     \x20Is\x20this\x20method\x20side-effect-free\x20(or\x20safe\x20in\x20HTT\
     P\x20parlance),\x20or\x20idempotent,\n\x20or\x20neither?\x20HTTP\x20base\
     d\x20RPC\x20implementation\x20may\x20choose\x20GET\x20verb\x20for\x20saf\
     e\n\x20methods,\x20and\x20PUT\x20verb\x20for\x20idempotent\x20methods\
     \x20instead\x20of\x20the\x20default\x20POST.\n\n\r\n\x05\x04\x11\x04\0\
-    \x01\x12\x04\xc0\x05\x07\x17\n\x0e\n\x06\x04\x11\x04\0\x02\0\x12\x04\xc1\
-    \x05\x04\x1c\n\x0f\n\x07\x04\x11\x04\0\x02\0\x01\x12\x04\xc1\x05\x04\x17\
-    \n\x0f\n\x07\x04\x11\x04\0\x02\0\x02\x12\x04\xc1\x05\x1a\x1b\n$\n\x06\
-    \x04\x11\x04\0\x02\x01\x12\x04\xc2\x05\x04\x18\"\x14\x20implies\x20idemp\
-    otent\n\n\x0f\n\x07\x04\x11\x04\0\x02\x01\x01\x12\x04\xc2\x05\x04\x13\n\
-    \x0f\n\x07\x04\x11\x04\0\x02\x01\x02\x12\x04\xc2\x05\x16\x17\n7\n\x06\
-    \x04\x11\x04\0\x02\x02\x12\x04\xc3\x05\x04\x13\"'\x20idempotent,\x20but\
+    \x01\x12\x04\xc2\x05\x07\x17\n\x0e\n\x06\x04\x11\x04\0\x02\0\x12\x04\xc3\
+    \x05\x04\x1c\n\x0f\n\x07\x04\x11\x04\0\x02\0\x01\x12\x04\xc3\x05\x04\x17\
+    \n\x0f\n\x07\x04\x11\x04\0\x02\0\x02\x12\x04\xc3\x05\x1a\x1b\n$\n\x06\
+    \x04\x11\x04\0\x02\x01\x12\x04\xc4\x05\x04\x18\"\x14\x20implies\x20idemp\
+    otent\n\n\x0f\n\x07\x04\x11\x04\0\x02\x01\x01\x12\x04\xc4\x05\x04\x13\n\
+    \x0f\n\x07\x04\x11\x04\0\x02\x01\x02\x12\x04\xc4\x05\x16\x17\n7\n\x06\
+    \x04\x11\x04\0\x02\x02\x12\x04\xc5\x05\x04\x13\"'\x20idempotent,\x20but\
     \x20may\x20have\x20side\x20effects\n\n\x0f\n\x07\x04\x11\x04\0\x02\x02\
-    \x01\x12\x04\xc3\x05\x04\x0e\n\x0f\n\x07\x04\x11\x04\0\x02\x02\x02\x12\
-    \x04\xc3\x05\x11\x12\n\x0e\n\x04\x04\x11\x02\x01\x12\x06\xc5\x05\x02\xc6\
-    \x05&\n\r\n\x05\x04\x11\x02\x01\x04\x12\x04\xc5\x05\x02\n\n\r\n\x05\x04\
-    \x11\x02\x01\x06\x12\x04\xc5\x05\x0b\x1b\n\r\n\x05\x04\x11\x02\x01\x01\
-    \x12\x04\xc5\x05\x1c-\n\r\n\x05\x04\x11\x02\x01\x03\x12\x04\xc5\x0502\n\
-    \r\n\x05\x04\x11\x02\x01\x08\x12\x04\xc6\x05\x06%\n\r\n\x05\x04\x11\x02\
-    \x01\x07\x12\x04\xc6\x05\x11$\nO\n\x04\x04\x11\x02\x02\x12\x04\xc9\x05\
+    \x01\x12\x04\xc5\x05\x04\x0e\n\x0f\n\x07\x04\x11\x04\0\x02\x02\x02\x12\
+    \x04\xc5\x05\x11\x12\n\x0e\n\x04\x04\x11\x02\x01\x12\x06\xc7\x05\x02\xc8\
+    \x05&\n\r\n\x05\x04\x11\x02\x01\x04\x12\x04\xc7\x05\x02\n\n\r\n\x05\x04\
+    \x11\x02\x01\x06\x12\x04\xc7\x05\x0b\x1b\n\r\n\x05\x04\x11\x02\x01\x01\
+    \x12\x04\xc7\x05\x1c-\n\r\n\x05\x04\x11\x02\x01\x03\x12\x04\xc7\x0502\n\
+    \r\n\x05\x04\x11\x02\x01\x08\x12\x04\xc8\x05\x06%\n\r\n\x05\x04\x11\x02\
+    \x01\x07\x12\x04\xc8\x05\x11$\nO\n\x04\x04\x11\x02\x02\x12\x04\xcb\x05\
     \x02:\x1aA\x20The\x20parser\x20stores\x20options\x20it\x20doesn't\x20rec\
     ognize\x20here.\x20See\x20above.\n\n\r\n\x05\x04\x11\x02\x02\x04\x12\x04\
-    \xc9\x05\x02\n\n\r\n\x05\x04\x11\x02\x02\x06\x12\x04\xc9\x05\x0b\x1e\n\r\
-    \n\x05\x04\x11\x02\x02\x01\x12\x04\xc9\x05\x1f3\n\r\n\x05\x04\x11\x02\
-    \x02\x03\x12\x04\xc9\x0569\nZ\n\x03\x04\x11\x05\x12\x04\xcc\x05\x02\x19\
+    \xcb\x05\x02\n\n\r\n\x05\x04\x11\x02\x02\x06\x12\x04\xcb\x05\x0b\x1e\n\r\
+    \n\x05\x04\x11\x02\x02\x01\x12\x04\xcb\x05\x1f3\n\r\n\x05\x04\x11\x02\
+    \x02\x03\x12\x04\xcb\x0569\nZ\n\x03\x04\x11\x05\x12\x04\xce\x05\x02\x19\
     \x1aM\x20Clients\x20can\x20define\x20custom\x20options\x20in\x20extensio\
     ns\x20of\x20this\x20message.\x20See\x20above.\n\n\x0c\n\x04\x04\x11\x05\
-    \0\x12\x04\xcc\x05\r\x18\n\r\n\x05\x04\x11\x05\0\x01\x12\x04\xcc\x05\r\
-    \x11\n\r\n\x05\x04\x11\x05\0\x02\x12\x04\xcc\x05\x15\x18\n\x8b\x03\n\x02\
-    \x04\x12\x12\x06\xd6\x05\0\xea\x05\x01\x1a\xfc\x02\x20A\x20message\x20re\
+    \0\x12\x04\xce\x05\r\x18\n\r\n\x05\x04\x11\x05\0\x01\x12\x04\xce\x05\r\
+    \x11\n\r\n\x05\x04\x11\x05\0\x02\x12\x04\xce\x05\x15\x18\n\x8b\x03\n\x02\
+    \x04\x12\x12\x06\xd8\x05\0\xec\x05\x01\x1a\xfc\x02\x20A\x20message\x20re\
     presenting\x20a\x20option\x20the\x20parser\x20does\x20not\x20recognize.\
     \x20This\x20only\n\x20appears\x20in\x20options\x20protos\x20created\x20b\
     y\x20the\x20compiler::Parser\x20class.\n\x20DescriptorPool\x20resolves\
@@ -10605,58 +9327,58 @@
     \x20options\x20protos\x20in\x20descriptor\x20objects\x20(e.g.\x20returne\
     d\x20by\x20Descriptor::options(),\n\x20or\x20produced\x20by\x20Descripto\
     r::CopyTo())\x20will\x20never\x20have\x20UninterpretedOptions\n\x20in\
-    \x20them.\n\n\x0b\n\x03\x04\x12\x01\x12\x04\xd6\x05\x08\x1b\n\xcb\x02\n\
-    \x04\x04\x12\x03\0\x12\x06\xdc\x05\x02\xdf\x05\x03\x1a\xba\x02\x20The\
+    \x20them.\n\n\x0b\n\x03\x04\x12\x01\x12\x04\xd8\x05\x08\x1b\n\xcb\x02\n\
+    \x04\x04\x12\x03\0\x12\x06\xde\x05\x02\xe1\x05\x03\x1a\xba\x02\x20The\
     \x20name\x20of\x20the\x20uninterpreted\x20option.\x20\x20Each\x20string\
     \x20represents\x20a\x20segment\x20in\n\x20a\x20dot-separated\x20name.\
     \x20\x20is_extension\x20is\x20true\x20iff\x20a\x20segment\x20represents\
     \x20an\n\x20extension\x20(denoted\x20with\x20parentheses\x20in\x20option\
     s\x20specs\x20in\x20.proto\x20files).\n\x20E.g.,{\x20[\"foo\",\x20false]\
     ,\x20[\"bar.baz\",\x20true],\x20[\"qux\",\x20false]\x20}\x20represents\n\
-    \x20\"foo.(bar.baz).qux\".\n\n\r\n\x05\x04\x12\x03\0\x01\x12\x04\xdc\x05\
-    \n\x12\n\x0e\n\x06\x04\x12\x03\0\x02\0\x12\x04\xdd\x05\x04\"\n\x0f\n\x07\
-    \x04\x12\x03\0\x02\0\x04\x12\x04\xdd\x05\x04\x0c\n\x0f\n\x07\x04\x12\x03\
-    \0\x02\0\x05\x12\x04\xdd\x05\r\x13\n\x0f\n\x07\x04\x12\x03\0\x02\0\x01\
-    \x12\x04\xdd\x05\x14\x1d\n\x0f\n\x07\x04\x12\x03\0\x02\0\x03\x12\x04\xdd\
-    \x05\x20!\n\x0e\n\x06\x04\x12\x03\0\x02\x01\x12\x04\xde\x05\x04#\n\x0f\n\
-    \x07\x04\x12\x03\0\x02\x01\x04\x12\x04\xde\x05\x04\x0c\n\x0f\n\x07\x04\
-    \x12\x03\0\x02\x01\x05\x12\x04\xde\x05\r\x11\n\x0f\n\x07\x04\x12\x03\0\
-    \x02\x01\x01\x12\x04\xde\x05\x12\x1e\n\x0f\n\x07\x04\x12\x03\0\x02\x01\
-    \x03\x12\x04\xde\x05!\"\n\x0c\n\x04\x04\x12\x02\0\x12\x04\xe0\x05\x02\
-    \x1d\n\r\n\x05\x04\x12\x02\0\x04\x12\x04\xe0\x05\x02\n\n\r\n\x05\x04\x12\
-    \x02\0\x06\x12\x04\xe0\x05\x0b\x13\n\r\n\x05\x04\x12\x02\0\x01\x12\x04\
-    \xe0\x05\x14\x18\n\r\n\x05\x04\x12\x02\0\x03\x12\x04\xe0\x05\x1b\x1c\n\
-    \x9c\x01\n\x04\x04\x12\x02\x01\x12\x04\xe4\x05\x02'\x1a\x8d\x01\x20The\
+    \x20\"foo.(bar.baz).qux\".\n\n\r\n\x05\x04\x12\x03\0\x01\x12\x04\xde\x05\
+    \n\x12\n\x0e\n\x06\x04\x12\x03\0\x02\0\x12\x04\xdf\x05\x04\"\n\x0f\n\x07\
+    \x04\x12\x03\0\x02\0\x04\x12\x04\xdf\x05\x04\x0c\n\x0f\n\x07\x04\x12\x03\
+    \0\x02\0\x05\x12\x04\xdf\x05\r\x13\n\x0f\n\x07\x04\x12\x03\0\x02\0\x01\
+    \x12\x04\xdf\x05\x14\x1d\n\x0f\n\x07\x04\x12\x03\0\x02\0\x03\x12\x04\xdf\
+    \x05\x20!\n\x0e\n\x06\x04\x12\x03\0\x02\x01\x12\x04\xe0\x05\x04#\n\x0f\n\
+    \x07\x04\x12\x03\0\x02\x01\x04\x12\x04\xe0\x05\x04\x0c\n\x0f\n\x07\x04\
+    \x12\x03\0\x02\x01\x05\x12\x04\xe0\x05\r\x11\n\x0f\n\x07\x04\x12\x03\0\
+    \x02\x01\x01\x12\x04\xe0\x05\x12\x1e\n\x0f\n\x07\x04\x12\x03\0\x02\x01\
+    \x03\x12\x04\xe0\x05!\"\n\x0c\n\x04\x04\x12\x02\0\x12\x04\xe2\x05\x02\
+    \x1d\n\r\n\x05\x04\x12\x02\0\x04\x12\x04\xe2\x05\x02\n\n\r\n\x05\x04\x12\
+    \x02\0\x06\x12\x04\xe2\x05\x0b\x13\n\r\n\x05\x04\x12\x02\0\x01\x12\x04\
+    \xe2\x05\x14\x18\n\r\n\x05\x04\x12\x02\0\x03\x12\x04\xe2\x05\x1b\x1c\n\
+    \x9c\x01\n\x04\x04\x12\x02\x01\x12\x04\xe6\x05\x02'\x1a\x8d\x01\x20The\
     \x20value\x20of\x20the\x20uninterpreted\x20option,\x20in\x20whatever\x20\
     type\x20the\x20tokenizer\n\x20identified\x20it\x20as\x20during\x20parsin\
     g.\x20Exactly\x20one\x20of\x20these\x20should\x20be\x20set.\n\n\r\n\x05\
-    \x04\x12\x02\x01\x04\x12\x04\xe4\x05\x02\n\n\r\n\x05\x04\x12\x02\x01\x05\
-    \x12\x04\xe4\x05\x0b\x11\n\r\n\x05\x04\x12\x02\x01\x01\x12\x04\xe4\x05\
-    \x12\"\n\r\n\x05\x04\x12\x02\x01\x03\x12\x04\xe4\x05%&\n\x0c\n\x04\x04\
-    \x12\x02\x02\x12\x04\xe5\x05\x02)\n\r\n\x05\x04\x12\x02\x02\x04\x12\x04\
-    \xe5\x05\x02\n\n\r\n\x05\x04\x12\x02\x02\x05\x12\x04\xe5\x05\x0b\x11\n\r\
-    \n\x05\x04\x12\x02\x02\x01\x12\x04\xe5\x05\x12$\n\r\n\x05\x04\x12\x02\
-    \x02\x03\x12\x04\xe5\x05'(\n\x0c\n\x04\x04\x12\x02\x03\x12\x04\xe6\x05\
-    \x02(\n\r\n\x05\x04\x12\x02\x03\x04\x12\x04\xe6\x05\x02\n\n\r\n\x05\x04\
-    \x12\x02\x03\x05\x12\x04\xe6\x05\x0b\x10\n\r\n\x05\x04\x12\x02\x03\x01\
-    \x12\x04\xe6\x05\x11#\n\r\n\x05\x04\x12\x02\x03\x03\x12\x04\xe6\x05&'\n\
-    \x0c\n\x04\x04\x12\x02\x04\x12\x04\xe7\x05\x02#\n\r\n\x05\x04\x12\x02\
-    \x04\x04\x12\x04\xe7\x05\x02\n\n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\xe7\
-    \x05\x0b\x11\n\r\n\x05\x04\x12\x02\x04\x01\x12\x04\xe7\x05\x12\x1e\n\r\n\
-    \x05\x04\x12\x02\x04\x03\x12\x04\xe7\x05!\"\n\x0c\n\x04\x04\x12\x02\x05\
-    \x12\x04\xe8\x05\x02\"\n\r\n\x05\x04\x12\x02\x05\x04\x12\x04\xe8\x05\x02\
-    \n\n\r\n\x05\x04\x12\x02\x05\x05\x12\x04\xe8\x05\x0b\x10\n\r\n\x05\x04\
-    \x12\x02\x05\x01\x12\x04\xe8\x05\x11\x1d\n\r\n\x05\x04\x12\x02\x05\x03\
-    \x12\x04\xe8\x05\x20!\n\x0c\n\x04\x04\x12\x02\x06\x12\x04\xe9\x05\x02&\n\
-    \r\n\x05\x04\x12\x02\x06\x04\x12\x04\xe9\x05\x02\n\n\r\n\x05\x04\x12\x02\
-    \x06\x05\x12\x04\xe9\x05\x0b\x11\n\r\n\x05\x04\x12\x02\x06\x01\x12\x04\
-    \xe9\x05\x12!\n\r\n\x05\x04\x12\x02\x06\x03\x12\x04\xe9\x05$%\n\xda\x01\
-    \n\x02\x04\x13\x12\x06\xf1\x05\0\xf2\x06\x01\x1aj\x20Encapsulates\x20inf\
+    \x04\x12\x02\x01\x04\x12\x04\xe6\x05\x02\n\n\r\n\x05\x04\x12\x02\x01\x05\
+    \x12\x04\xe6\x05\x0b\x11\n\r\n\x05\x04\x12\x02\x01\x01\x12\x04\xe6\x05\
+    \x12\"\n\r\n\x05\x04\x12\x02\x01\x03\x12\x04\xe6\x05%&\n\x0c\n\x04\x04\
+    \x12\x02\x02\x12\x04\xe7\x05\x02)\n\r\n\x05\x04\x12\x02\x02\x04\x12\x04\
+    \xe7\x05\x02\n\n\r\n\x05\x04\x12\x02\x02\x05\x12\x04\xe7\x05\x0b\x11\n\r\
+    \n\x05\x04\x12\x02\x02\x01\x12\x04\xe7\x05\x12$\n\r\n\x05\x04\x12\x02\
+    \x02\x03\x12\x04\xe7\x05'(\n\x0c\n\x04\x04\x12\x02\x03\x12\x04\xe8\x05\
+    \x02(\n\r\n\x05\x04\x12\x02\x03\x04\x12\x04\xe8\x05\x02\n\n\r\n\x05\x04\
+    \x12\x02\x03\x05\x12\x04\xe8\x05\x0b\x10\n\r\n\x05\x04\x12\x02\x03\x01\
+    \x12\x04\xe8\x05\x11#\n\r\n\x05\x04\x12\x02\x03\x03\x12\x04\xe8\x05&'\n\
+    \x0c\n\x04\x04\x12\x02\x04\x12\x04\xe9\x05\x02#\n\r\n\x05\x04\x12\x02\
+    \x04\x04\x12\x04\xe9\x05\x02\n\n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\xe9\
+    \x05\x0b\x11\n\r\n\x05\x04\x12\x02\x04\x01\x12\x04\xe9\x05\x12\x1e\n\r\n\
+    \x05\x04\x12\x02\x04\x03\x12\x04\xe9\x05!\"\n\x0c\n\x04\x04\x12\x02\x05\
+    \x12\x04\xea\x05\x02\"\n\r\n\x05\x04\x12\x02\x05\x04\x12\x04\xea\x05\x02\
+    \n\n\r\n\x05\x04\x12\x02\x05\x05\x12\x04\xea\x05\x0b\x10\n\r\n\x05\x04\
+    \x12\x02\x05\x01\x12\x04\xea\x05\x11\x1d\n\r\n\x05\x04\x12\x02\x05\x03\
+    \x12\x04\xea\x05\x20!\n\x0c\n\x04\x04\x12\x02\x06\x12\x04\xeb\x05\x02&\n\
+    \r\n\x05\x04\x12\x02\x06\x04\x12\x04\xeb\x05\x02\n\n\r\n\x05\x04\x12\x02\
+    \x06\x05\x12\x04\xeb\x05\x0b\x11\n\r\n\x05\x04\x12\x02\x06\x01\x12\x04\
+    \xeb\x05\x12!\n\r\n\x05\x04\x12\x02\x06\x03\x12\x04\xeb\x05$%\n\xda\x01\
+    \n\x02\x04\x13\x12\x06\xf3\x05\0\xf4\x06\x01\x1aj\x20Encapsulates\x20inf\
     ormation\x20about\x20the\x20original\x20source\x20file\x20from\x20which\
     \x20a\n\x20FileDescriptorProto\x20was\x20generated.\n2`\x20=============\
     ======================================================\n\x20Optional\x20\
-    source\x20code\x20info\n\n\x0b\n\x03\x04\x13\x01\x12\x04\xf1\x05\x08\x16\
-    \n\x82\x11\n\x04\x04\x13\x02\0\x12\x04\x9d\x06\x02!\x1a\xf3\x10\x20A\x20\
+    source\x20code\x20info\n\n\x0b\n\x03\x04\x13\x01\x12\x04\xf3\x05\x08\x16\
+    \n\x82\x11\n\x04\x04\x13\x02\0\x12\x04\x9f\x06\x02!\x1a\xf3\x10\x20A\x20\
     Location\x20identifies\x20a\x20piece\x20of\x20source\x20code\x20in\x20a\
     \x20.proto\x20file\x20which\n\x20corresponds\x20to\x20a\x20particular\
     \x20definition.\x20\x20This\x20information\x20is\x20intended\n\x20to\x20\
@@ -10709,11 +9431,11 @@
     o\n\x20\x20\x20ignore\x20those\x20that\x20it\x20doesn't\x20understand,\
     \x20as\x20more\x20types\x20of\x20locations\x20could\n\x20\x20\x20be\x20r\
     ecorded\x20in\x20the\x20future.\n\n\r\n\x05\x04\x13\x02\0\x04\x12\x04\
-    \x9d\x06\x02\n\n\r\n\x05\x04\x13\x02\0\x06\x12\x04\x9d\x06\x0b\x13\n\r\n\
-    \x05\x04\x13\x02\0\x01\x12\x04\x9d\x06\x14\x1c\n\r\n\x05\x04\x13\x02\0\
-    \x03\x12\x04\x9d\x06\x1f\x20\n\x0e\n\x04\x04\x13\x03\0\x12\x06\x9e\x06\
-    \x02\xf1\x06\x03\n\r\n\x05\x04\x13\x03\0\x01\x12\x04\x9e\x06\n\x12\n\x83\
-    \x07\n\x06\x04\x13\x03\0\x02\0\x12\x04\xb6\x06\x04,\x1a\xf2\x06\x20Ident\
+    \x9f\x06\x02\n\n\r\n\x05\x04\x13\x02\0\x06\x12\x04\x9f\x06\x0b\x13\n\r\n\
+    \x05\x04\x13\x02\0\x01\x12\x04\x9f\x06\x14\x1c\n\r\n\x05\x04\x13\x02\0\
+    \x03\x12\x04\x9f\x06\x1f\x20\n\x0e\n\x04\x04\x13\x03\0\x12\x06\xa0\x06\
+    \x02\xf3\x06\x03\n\r\n\x05\x04\x13\x03\0\x01\x12\x04\xa0\x06\n\x12\n\x83\
+    \x07\n\x06\x04\x13\x03\0\x02\0\x12\x04\xb8\x06\x04,\x1a\xf2\x06\x20Ident\
     ifies\x20which\x20part\x20of\x20the\x20FileDescriptorProto\x20was\x20def\
     ined\x20at\x20this\n\x20location.\n\n\x20Each\x20element\x20is\x20a\x20f\
     ield\x20number\x20or\x20an\x20index.\x20\x20They\x20form\x20a\x20path\
@@ -10734,12 +9456,12 @@
     lement:\n\x20\x20\x20[\x204,\x203,\x202,\x207\x20]\n\x20this\x20path\x20\
     refers\x20to\x20the\x20whole\x20field\x20declaration\x20(from\x20the\x20\
     beginning\n\x20of\x20the\x20label\x20to\x20the\x20terminating\x20semicol\
-    on).\n\n\x0f\n\x07\x04\x13\x03\0\x02\0\x04\x12\x04\xb6\x06\x04\x0c\n\x0f\
-    \n\x07\x04\x13\x03\0\x02\0\x05\x12\x04\xb6\x06\r\x12\n\x0f\n\x07\x04\x13\
-    \x03\0\x02\0\x01\x12\x04\xb6\x06\x13\x17\n\x0f\n\x07\x04\x13\x03\0\x02\0\
-    \x03\x12\x04\xb6\x06\x1a\x1b\n\x0f\n\x07\x04\x13\x03\0\x02\0\x08\x12\x04\
-    \xb6\x06\x1c+\n\x10\n\x08\x04\x13\x03\0\x02\0\x08\x02\x12\x04\xb6\x06\
-    \x1d*\n\xd2\x02\n\x06\x04\x13\x03\0\x02\x01\x12\x04\xbd\x06\x04,\x1a\xc1\
+    on).\n\n\x0f\n\x07\x04\x13\x03\0\x02\0\x04\x12\x04\xb8\x06\x04\x0c\n\x0f\
+    \n\x07\x04\x13\x03\0\x02\0\x05\x12\x04\xb8\x06\r\x12\n\x0f\n\x07\x04\x13\
+    \x03\0\x02\0\x01\x12\x04\xb8\x06\x13\x17\n\x0f\n\x07\x04\x13\x03\0\x02\0\
+    \x03\x12\x04\xb8\x06\x1a\x1b\n\x0f\n\x07\x04\x13\x03\0\x02\0\x08\x12\x04\
+    \xb8\x06\x1c+\n\x10\n\x08\x04\x13\x03\0\x02\0\x08\x02\x12\x04\xb8\x06\
+    \x1d*\n\xd2\x02\n\x06\x04\x13\x03\0\x02\x01\x12\x04\xbf\x06\x04,\x1a\xc1\
     \x02\x20Always\x20has\x20exactly\x20three\x20or\x20four\x20elements:\x20\
     start\x20line,\x20start\x20column,\n\x20end\x20line\x20(optional,\x20oth\
     erwise\x20assumed\x20same\x20as\x20start\x20line),\x20end\x20column.\n\
@@ -10747,12 +9469,12 @@
     iciency.\x20\x20Note\x20that\x20line\n\x20and\x20column\x20numbers\x20ar\
     e\x20zero-based\x20--\x20typically\x20you\x20will\x20want\x20to\x20add\n\
     \x201\x20to\x20each\x20before\x20displaying\x20to\x20a\x20user.\n\n\x0f\
-    \n\x07\x04\x13\x03\0\x02\x01\x04\x12\x04\xbd\x06\x04\x0c\n\x0f\n\x07\x04\
-    \x13\x03\0\x02\x01\x05\x12\x04\xbd\x06\r\x12\n\x0f\n\x07\x04\x13\x03\0\
-    \x02\x01\x01\x12\x04\xbd\x06\x13\x17\n\x0f\n\x07\x04\x13\x03\0\x02\x01\
-    \x03\x12\x04\xbd\x06\x1a\x1b\n\x0f\n\x07\x04\x13\x03\0\x02\x01\x08\x12\
-    \x04\xbd\x06\x1c+\n\x10\n\x08\x04\x13\x03\0\x02\x01\x08\x02\x12\x04\xbd\
-    \x06\x1d*\n\xa5\x0c\n\x06\x04\x13\x03\0\x02\x02\x12\x04\xee\x06\x04)\x1a\
+    \n\x07\x04\x13\x03\0\x02\x01\x04\x12\x04\xbf\x06\x04\x0c\n\x0f\n\x07\x04\
+    \x13\x03\0\x02\x01\x05\x12\x04\xbf\x06\r\x12\n\x0f\n\x07\x04\x13\x03\0\
+    \x02\x01\x01\x12\x04\xbf\x06\x13\x17\n\x0f\n\x07\x04\x13\x03\0\x02\x01\
+    \x03\x12\x04\xbf\x06\x1a\x1b\n\x0f\n\x07\x04\x13\x03\0\x02\x01\x08\x12\
+    \x04\xbf\x06\x1c+\n\x10\n\x08\x04\x13\x03\0\x02\x01\x08\x02\x12\x04\xbf\
+    \x06\x1d*\n\xa5\x0c\n\x06\x04\x13\x03\0\x02\x02\x12\x04\xf0\x06\x04)\x1a\
     \x94\x0c\x20If\x20this\x20SourceCodeInfo\x20represents\x20a\x20complete\
     \x20declaration,\x20these\x20are\x20any\n\x20comments\x20appearing\x20be\
     fore\x20and\x20after\x20the\x20declaration\x20which\x20appear\x20to\x20b\
@@ -10788,71 +9510,120 @@
     \x20removed.\x20*/\n\x20\x20\x20/*\x20Block\x20comment\x20attached\x20to\
     \n\x20\x20\x20\x20*\x20grault.\x20*/\n\x20\x20\x20optional\x20int32\x20g\
     rault\x20=\x206;\n\n\x20\x20\x20//\x20ignored\x20detached\x20comments.\n\
-    \n\x0f\n\x07\x04\x13\x03\0\x02\x02\x04\x12\x04\xee\x06\x04\x0c\n\x0f\n\
-    \x07\x04\x13\x03\0\x02\x02\x05\x12\x04\xee\x06\r\x13\n\x0f\n\x07\x04\x13\
-    \x03\0\x02\x02\x01\x12\x04\xee\x06\x14$\n\x0f\n\x07\x04\x13\x03\0\x02\
-    \x02\x03\x12\x04\xee\x06'(\n\x0e\n\x06\x04\x13\x03\0\x02\x03\x12\x04\xef\
-    \x06\x04*\n\x0f\n\x07\x04\x13\x03\0\x02\x03\x04\x12\x04\xef\x06\x04\x0c\
-    \n\x0f\n\x07\x04\x13\x03\0\x02\x03\x05\x12\x04\xef\x06\r\x13\n\x0f\n\x07\
-    \x04\x13\x03\0\x02\x03\x01\x12\x04\xef\x06\x14%\n\x0f\n\x07\x04\x13\x03\
-    \0\x02\x03\x03\x12\x04\xef\x06()\n\x0e\n\x06\x04\x13\x03\0\x02\x04\x12\
-    \x04\xf0\x06\x042\n\x0f\n\x07\x04\x13\x03\0\x02\x04\x04\x12\x04\xf0\x06\
-    \x04\x0c\n\x0f\n\x07\x04\x13\x03\0\x02\x04\x05\x12\x04\xf0\x06\r\x13\n\
-    \x0f\n\x07\x04\x13\x03\0\x02\x04\x01\x12\x04\xf0\x06\x14-\n\x0f\n\x07\
-    \x04\x13\x03\0\x02\x04\x03\x12\x04\xf0\x0601\n\xee\x01\n\x02\x04\x14\x12\
-    \x06\xf7\x06\0\x8c\x07\x01\x1a\xdf\x01\x20Describes\x20the\x20relationsh\
+    \n\x0f\n\x07\x04\x13\x03\0\x02\x02\x04\x12\x04\xf0\x06\x04\x0c\n\x0f\n\
+    \x07\x04\x13\x03\0\x02\x02\x05\x12\x04\xf0\x06\r\x13\n\x0f\n\x07\x04\x13\
+    \x03\0\x02\x02\x01\x12\x04\xf0\x06\x14$\n\x0f\n\x07\x04\x13\x03\0\x02\
+    \x02\x03\x12\x04\xf0\x06'(\n\x0e\n\x06\x04\x13\x03\0\x02\x03\x12\x04\xf1\
+    \x06\x04*\n\x0f\n\x07\x04\x13\x03\0\x02\x03\x04\x12\x04\xf1\x06\x04\x0c\
+    \n\x0f\n\x07\x04\x13\x03\0\x02\x03\x05\x12\x04\xf1\x06\r\x13\n\x0f\n\x07\
+    \x04\x13\x03\0\x02\x03\x01\x12\x04\xf1\x06\x14%\n\x0f\n\x07\x04\x13\x03\
+    \0\x02\x03\x03\x12\x04\xf1\x06()\n\x0e\n\x06\x04\x13\x03\0\x02\x04\x12\
+    \x04\xf2\x06\x042\n\x0f\n\x07\x04\x13\x03\0\x02\x04\x04\x12\x04\xf2\x06\
+    \x04\x0c\n\x0f\n\x07\x04\x13\x03\0\x02\x04\x05\x12\x04\xf2\x06\r\x13\n\
+    \x0f\n\x07\x04\x13\x03\0\x02\x04\x01\x12\x04\xf2\x06\x14-\n\x0f\n\x07\
+    \x04\x13\x03\0\x02\x04\x03\x12\x04\xf2\x0601\n\xee\x01\n\x02\x04\x14\x12\
+    \x06\xf9\x06\0\x8e\x07\x01\x1a\xdf\x01\x20Describes\x20the\x20relationsh\
     ip\x20between\x20generated\x20code\x20and\x20its\x20original\x20source\n\
     \x20file.\x20A\x20GeneratedCodeInfo\x20message\x20is\x20associated\x20wi\
     th\x20only\x20one\x20generated\n\x20source\x20file,\x20but\x20may\x20con\
     tain\x20references\x20to\x20different\x20source\x20.proto\x20files.\n\n\
-    \x0b\n\x03\x04\x14\x01\x12\x04\xf7\x06\x08\x19\nx\n\x04\x04\x14\x02\0\
-    \x12\x04\xfa\x06\x02%\x1aj\x20An\x20Annotation\x20connects\x20some\x20sp\
+    \x0b\n\x03\x04\x14\x01\x12\x04\xf9\x06\x08\x19\nx\n\x04\x04\x14\x02\0\
+    \x12\x04\xfc\x06\x02%\x1aj\x20An\x20Annotation\x20connects\x20some\x20sp\
     an\x20of\x20text\x20in\x20generated\x20code\x20to\x20an\x20element\n\x20\
     of\x20its\x20generating\x20.proto\x20file.\n\n\r\n\x05\x04\x14\x02\0\x04\
-    \x12\x04\xfa\x06\x02\n\n\r\n\x05\x04\x14\x02\0\x06\x12\x04\xfa\x06\x0b\
-    \x15\n\r\n\x05\x04\x14\x02\0\x01\x12\x04\xfa\x06\x16\x20\n\r\n\x05\x04\
-    \x14\x02\0\x03\x12\x04\xfa\x06#$\n\x0e\n\x04\x04\x14\x03\0\x12\x06\xfb\
-    \x06\x02\x8b\x07\x03\n\r\n\x05\x04\x14\x03\0\x01\x12\x04\xfb\x06\n\x14\n\
-    \x8f\x01\n\x06\x04\x14\x03\0\x02\0\x12\x04\xfe\x06\x04,\x1a\x7f\x20Ident\
+    \x12\x04\xfc\x06\x02\n\n\r\n\x05\x04\x14\x02\0\x06\x12\x04\xfc\x06\x0b\
+    \x15\n\r\n\x05\x04\x14\x02\0\x01\x12\x04\xfc\x06\x16\x20\n\r\n\x05\x04\
+    \x14\x02\0\x03\x12\x04\xfc\x06#$\n\x0e\n\x04\x04\x14\x03\0\x12\x06\xfd\
+    \x06\x02\x8d\x07\x03\n\r\n\x05\x04\x14\x03\0\x01\x12\x04\xfd\x06\n\x14\n\
+    \x8f\x01\n\x06\x04\x14\x03\0\x02\0\x12\x04\x80\x07\x04,\x1a\x7f\x20Ident\
     ifies\x20the\x20element\x20in\x20the\x20original\x20source\x20.proto\x20\
     file.\x20This\x20field\n\x20is\x20formatted\x20the\x20same\x20as\x20Sour\
     ceCodeInfo.Location.path.\n\n\x0f\n\x07\x04\x14\x03\0\x02\0\x04\x12\x04\
-    \xfe\x06\x04\x0c\n\x0f\n\x07\x04\x14\x03\0\x02\0\x05\x12\x04\xfe\x06\r\
-    \x12\n\x0f\n\x07\x04\x14\x03\0\x02\0\x01\x12\x04\xfe\x06\x13\x17\n\x0f\n\
-    \x07\x04\x14\x03\0\x02\0\x03\x12\x04\xfe\x06\x1a\x1b\n\x0f\n\x07\x04\x14\
-    \x03\0\x02\0\x08\x12\x04\xfe\x06\x1c+\n\x10\n\x08\x04\x14\x03\0\x02\0\
-    \x08\x02\x12\x04\xfe\x06\x1d*\nO\n\x06\x04\x14\x03\0\x02\x01\x12\x04\x81\
+    \x80\x07\x04\x0c\n\x0f\n\x07\x04\x14\x03\0\x02\0\x05\x12\x04\x80\x07\r\
+    \x12\n\x0f\n\x07\x04\x14\x03\0\x02\0\x01\x12\x04\x80\x07\x13\x17\n\x0f\n\
+    \x07\x04\x14\x03\0\x02\0\x03\x12\x04\x80\x07\x1a\x1b\n\x0f\n\x07\x04\x14\
+    \x03\0\x02\0\x08\x12\x04\x80\x07\x1c+\n\x10\n\x08\x04\x14\x03\0\x02\0\
+    \x08\x02\x12\x04\x80\x07\x1d*\nO\n\x06\x04\x14\x03\0\x02\x01\x12\x04\x83\
     \x07\x04$\x1a?\x20Identifies\x20the\x20filesystem\x20path\x20to\x20the\
     \x20original\x20source\x20.proto.\n\n\x0f\n\x07\x04\x14\x03\0\x02\x01\
-    \x04\x12\x04\x81\x07\x04\x0c\n\x0f\n\x07\x04\x14\x03\0\x02\x01\x05\x12\
-    \x04\x81\x07\r\x13\n\x0f\n\x07\x04\x14\x03\0\x02\x01\x01\x12\x04\x81\x07\
-    \x14\x1f\n\x0f\n\x07\x04\x14\x03\0\x02\x01\x03\x12\x04\x81\x07\"#\nw\n\
-    \x06\x04\x14\x03\0\x02\x02\x12\x04\x85\x07\x04\x1d\x1ag\x20Identifies\
+    \x04\x12\x04\x83\x07\x04\x0c\n\x0f\n\x07\x04\x14\x03\0\x02\x01\x05\x12\
+    \x04\x83\x07\r\x13\n\x0f\n\x07\x04\x14\x03\0\x02\x01\x01\x12\x04\x83\x07\
+    \x14\x1f\n\x0f\n\x07\x04\x14\x03\0\x02\x01\x03\x12\x04\x83\x07\"#\nw\n\
+    \x06\x04\x14\x03\0\x02\x02\x12\x04\x87\x07\x04\x1d\x1ag\x20Identifies\
     \x20the\x20starting\x20offset\x20in\x20bytes\x20in\x20the\x20generated\
     \x20code\n\x20that\x20relates\x20to\x20the\x20identified\x20object.\n\n\
-    \x0f\n\x07\x04\x14\x03\0\x02\x02\x04\x12\x04\x85\x07\x04\x0c\n\x0f\n\x07\
-    \x04\x14\x03\0\x02\x02\x05\x12\x04\x85\x07\r\x12\n\x0f\n\x07\x04\x14\x03\
-    \0\x02\x02\x01\x12\x04\x85\x07\x13\x18\n\x0f\n\x07\x04\x14\x03\0\x02\x02\
-    \x03\x12\x04\x85\x07\x1b\x1c\n\xdb\x01\n\x06\x04\x14\x03\0\x02\x03\x12\
-    \x04\x8a\x07\x04\x1b\x1a\xca\x01\x20Identifies\x20the\x20ending\x20offse\
+    \x0f\n\x07\x04\x14\x03\0\x02\x02\x04\x12\x04\x87\x07\x04\x0c\n\x0f\n\x07\
+    \x04\x14\x03\0\x02\x02\x05\x12\x04\x87\x07\r\x12\n\x0f\n\x07\x04\x14\x03\
+    \0\x02\x02\x01\x12\x04\x87\x07\x13\x18\n\x0f\n\x07\x04\x14\x03\0\x02\x02\
+    \x03\x12\x04\x87\x07\x1b\x1c\n\xdb\x01\n\x06\x04\x14\x03\0\x02\x03\x12\
+    \x04\x8c\x07\x04\x1b\x1a\xca\x01\x20Identifies\x20the\x20ending\x20offse\
     t\x20in\x20bytes\x20in\x20the\x20generated\x20code\x20that\n\x20relates\
     \x20to\x20the\x20identified\x20offset.\x20The\x20end\x20offset\x20should\
     \x20be\x20one\x20past\n\x20the\x20last\x20relevant\x20byte\x20(so\x20the\
     \x20length\x20of\x20the\x20text\x20=\x20end\x20-\x20begin).\n\n\x0f\n\
-    \x07\x04\x14\x03\0\x02\x03\x04\x12\x04\x8a\x07\x04\x0c\n\x0f\n\x07\x04\
-    \x14\x03\0\x02\x03\x05\x12\x04\x8a\x07\r\x12\n\x0f\n\x07\x04\x14\x03\0\
-    \x02\x03\x01\x12\x04\x8a\x07\x13\x16\n\x0f\n\x07\x04\x14\x03\0\x02\x03\
-    \x03\x12\x04\x8a\x07\x19\x1a\
+    \x07\x04\x14\x03\0\x02\x03\x04\x12\x04\x8c\x07\x04\x0c\n\x0f\n\x07\x04\
+    \x14\x03\0\x02\x03\x05\x12\x04\x8c\x07\r\x12\n\x0f\n\x07\x04\x14\x03\0\
+    \x02\x03\x01\x12\x04\x8c\x07\x13\x16\n\x0f\n\x07\x04\x14\x03\0\x02\x03\
+    \x03\x12\x04\x8c\x07\x19\x1a\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(27);
+            messages.push(FileDescriptorSet::generated_message_descriptor_data());
+            messages.push(FileDescriptorProto::generated_message_descriptor_data());
+            messages.push(DescriptorProto::generated_message_descriptor_data());
+            messages.push(ExtensionRangeOptions::generated_message_descriptor_data());
+            messages.push(FieldDescriptorProto::generated_message_descriptor_data());
+            messages.push(OneofDescriptorProto::generated_message_descriptor_data());
+            messages.push(EnumDescriptorProto::generated_message_descriptor_data());
+            messages.push(EnumValueDescriptorProto::generated_message_descriptor_data());
+            messages.push(ServiceDescriptorProto::generated_message_descriptor_data());
+            messages.push(MethodDescriptorProto::generated_message_descriptor_data());
+            messages.push(FileOptions::generated_message_descriptor_data());
+            messages.push(MessageOptions::generated_message_descriptor_data());
+            messages.push(FieldOptions::generated_message_descriptor_data());
+            messages.push(OneofOptions::generated_message_descriptor_data());
+            messages.push(EnumOptions::generated_message_descriptor_data());
+            messages.push(EnumValueOptions::generated_message_descriptor_data());
+            messages.push(ServiceOptions::generated_message_descriptor_data());
+            messages.push(MethodOptions::generated_message_descriptor_data());
+            messages.push(UninterpretedOption::generated_message_descriptor_data());
+            messages.push(SourceCodeInfo::generated_message_descriptor_data());
+            messages.push(GeneratedCodeInfo::generated_message_descriptor_data());
+            messages.push(descriptor_proto::ExtensionRange::generated_message_descriptor_data());
+            messages.push(descriptor_proto::ReservedRange::generated_message_descriptor_data());
+            messages.push(enum_descriptor_proto::EnumReservedRange::generated_message_descriptor_data());
+            messages.push(uninterpreted_option::NamePart::generated_message_descriptor_data());
+            messages.push(source_code_info::Location::generated_message_descriptor_data());
+            messages.push(generated_code_info::Annotation::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(6);
+            enums.push(field_descriptor_proto::Type::generated_enum_descriptor_data());
+            enums.push(field_descriptor_proto::Label::generated_enum_descriptor_data());
+            enums.push(file_options::OptimizeMode::generated_enum_descriptor_data());
+            enums.push(field_options::CType::generated_enum_descriptor_data());
+            enums.push(field_options::JSType::generated_enum_descriptor_data());
+            enums.push(method_options::IdempotencyLevel::generated_enum_descriptor_data());
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/descriptorx.rs b/src/descriptorx.rs
deleted file mode 100644
index 7b046ec..0000000
--- a/src/descriptorx.rs
+++ /dev/null
@@ -1,656 +0,0 @@
-// Should not be a part of public API
-#![doc(hidden)]
-
-use crate::descriptor::DescriptorProto;
-use crate::descriptor::EnumDescriptorProto;
-use crate::descriptor::EnumValueDescriptorProto;
-use crate::descriptor::FieldDescriptorProto;
-/// utilities to work with descriptor
-use crate::descriptor::FileDescriptorProto;
-use crate::descriptor::OneofDescriptorProto;
-use crate::rust;
-use crate::strx;
-
-// Copy-pasted from libsyntax.
-fn ident_start(c: char) -> bool {
-    (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'
-}
-
-// Copy-pasted from libsyntax.
-fn ident_continue(c: char) -> bool {
-    (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'
-}
-
-pub fn proto_path_to_rust_mod(path: &str) -> String {
-    let without_dir = strx::remove_to(path, '/');
-    let without_suffix = strx::remove_suffix(without_dir, ".proto");
-
-    let name = without_suffix
-        .chars()
-        .enumerate()
-        .map(|(i, c)| {
-            let valid = if i == 0 {
-                ident_start(c)
-            } else {
-                ident_continue(c)
-            };
-            if valid {
-                c
-            } else {
-                '_'
-            }
-        })
-        .collect::<String>();
-
-    let name = if rust::is_rust_keyword(&name) {
-        format!("{}_pb", name)
-    } else {
-        name
-    };
-    name
-}
-
-pub struct RootScope<'a> {
-    pub file_descriptors: &'a [FileDescriptorProto],
-}
-
-impl<'a> RootScope<'a> {
-    fn packages(&'a self) -> Vec<FileScope<'a>> {
-        self.file_descriptors
-            .iter()
-            .map(|fd| FileScope {
-                file_descriptor: fd,
-            })
-            .collect()
-    }
-
-    // find enum by fully qualified name
-    pub fn find_enum(&'a self, fqn: &str) -> EnumWithScope<'a> {
-        match self.find_message_or_enum(fqn) {
-            MessageOrEnumWithScope::Enum(e) => e,
-            _ => panic!("not an enum: {}", fqn),
-        }
-    }
-
-    // find message by fully qualified name
-    pub fn find_message(&'a self, fqn: &str) -> MessageWithScope<'a> {
-        match self.find_message_or_enum(fqn) {
-            MessageOrEnumWithScope::Message(m) => m,
-            _ => panic!("not a message: {}", fqn),
-        }
-    }
-
-    // find message or enum by fully qualified name
-    pub fn find_message_or_enum(&'a self, fqn: &str) -> MessageOrEnumWithScope<'a> {
-        assert!(fqn.starts_with("."), "name must start with dot: {}", fqn);
-        let fqn1 = &fqn[1..];
-        self.packages()
-            .into_iter()
-            .flat_map(|p| {
-                (if p.get_package().is_empty() {
-                    p.find_message_or_enum(fqn1)
-                } else if fqn1.starts_with(&(p.get_package().to_string() + ".")) {
-                    let remaining = &fqn1[(p.get_package().len() + 1)..];
-                    p.find_message_or_enum(remaining)
-                } else {
-                    None
-                })
-                .into_iter()
-            })
-            .next()
-            .expect(&format!("enum not found by name: {}", fqn))
-    }
-}
-
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-pub enum Syntax {
-    PROTO2,
-    PROTO3,
-}
-
-impl Syntax {
-    pub fn parse(s: &str) -> Self {
-        match s {
-            "" | "proto2" => Syntax::PROTO2,
-            "proto3" => Syntax::PROTO3,
-            _ => panic!("unsupported syntax value: {:?}", s),
-        }
-    }
-}
-
-#[derive(Clone)]
-pub struct FileScope<'a> {
-    pub file_descriptor: &'a FileDescriptorProto,
-}
-
-impl<'a> FileScope<'a> {
-    fn get_package(&self) -> &'a str {
-        self.file_descriptor.get_package()
-    }
-
-    pub fn syntax(&self) -> Syntax {
-        Syntax::parse(self.file_descriptor.get_syntax())
-    }
-
-    pub fn to_scope(&self) -> Scope<'a> {
-        Scope {
-            file_scope: self.clone(),
-            path: Vec::new(),
-        }
-    }
-
-    fn find_message_or_enum(&self, name: &str) -> Option<MessageOrEnumWithScope<'a>> {
-        assert!(!name.starts_with("."));
-        self.find_messages_and_enums()
-            .into_iter()
-            .filter(|e| e.name_to_package() == name)
-            .next()
-    }
-
-    // find all enums in given file descriptor
-    pub fn find_enums(&self) -> Vec<EnumWithScope<'a>> {
-        let mut r = Vec::new();
-
-        self.to_scope().walk_scopes(|scope| {
-            r.extend(scope.get_enums());
-        });
-
-        r
-    }
-
-    // find all messages in given file descriptor
-    pub fn find_messages(&self) -> Vec<MessageWithScope<'a>> {
-        let mut r = Vec::new();
-
-        self.to_scope().walk_scopes(|scope| {
-            r.extend(scope.get_messages());
-        });
-
-        r
-    }
-
-    // find all messages and enums in given file descriptor
-    pub fn find_messages_and_enums(&self) -> Vec<MessageOrEnumWithScope<'a>> {
-        let mut r = Vec::new();
-
-        self.to_scope().walk_scopes(|scope| {
-            r.extend(scope.get_messages_and_enums());
-        });
-
-        r
-    }
-}
-
-#[derive(Clone)]
-pub struct Scope<'a> {
-    pub file_scope: FileScope<'a>,
-    pub path: Vec<&'a DescriptorProto>,
-}
-
-impl<'a> Scope<'a> {
-    pub fn get_file_descriptor(&self) -> &'a FileDescriptorProto {
-        self.file_scope.file_descriptor
-    }
-
-    // get message descriptors in this scope
-    fn get_message_descriptors(&self) -> &'a [DescriptorProto] {
-        if self.path.is_empty() {
-            self.file_scope.file_descriptor.get_message_type()
-        } else {
-            self.path.last().unwrap().get_nested_type()
-        }
-    }
-
-    // get enum descriptors in this scope
-    fn get_enum_descriptors(&self) -> &'a [EnumDescriptorProto] {
-        if self.path.is_empty() {
-            self.file_scope.file_descriptor.get_enum_type()
-        } else {
-            self.path.last().unwrap().get_enum_type()
-        }
-    }
-
-    // get messages with attached scopes in this scope
-    pub fn get_messages(&self) -> Vec<MessageWithScope<'a>> {
-        self.get_message_descriptors()
-            .iter()
-            .map(|m| MessageWithScope {
-                scope: self.clone(),
-                message: m,
-            })
-            .collect()
-    }
-
-    // get enums with attached scopes in this scope
-    pub fn get_enums(&self) -> Vec<EnumWithScope<'a>> {
-        self.get_enum_descriptors()
-            .iter()
-            .map(|e| EnumWithScope {
-                scope: self.clone(),
-                en: e,
-            })
-            .collect()
-    }
-
-    // get messages and enums with attached scopes in this scope
-    pub fn get_messages_and_enums(&self) -> Vec<MessageOrEnumWithScope<'a>> {
-        self.get_messages()
-            .into_iter()
-            .map(|m| MessageOrEnumWithScope::Message(m))
-            .chain(
-                self.get_enums()
-                    .into_iter()
-                    .map(|m| MessageOrEnumWithScope::Enum(m)),
-            )
-            .collect()
-    }
-
-    // nested scopes, i. e. scopes of nested messages
-    fn nested_scopes(&self) -> Vec<Scope<'a>> {
-        self.get_message_descriptors()
-            .iter()
-            .map(|m| {
-                let mut nested = self.clone();
-                nested.path.push(m);
-                nested
-            })
-            .collect()
-    }
-
-    fn walk_scopes_impl<F: FnMut(&Scope<'a>)>(&self, callback: &mut F) {
-        (*callback)(self);
-
-        for nested in self.nested_scopes() {
-            nested.walk_scopes_impl(callback);
-        }
-    }
-
-    // apply callback for this scope and all nested scopes
-    fn walk_scopes<F>(&self, mut callback: F)
-    where
-        F: FnMut(&Scope<'a>),
-    {
-        self.walk_scopes_impl(&mut callback);
-    }
-
-    pub fn prefix(&self) -> String {
-        if self.path.is_empty() {
-            "".to_string()
-        } else {
-            let v: Vec<&'a str> = self.path.iter().map(|m| m.get_name()).collect();
-            let mut r = v.join(".");
-            r.push_str(".");
-            r
-        }
-    }
-
-    // rust type name prefix for this scope
-    pub fn rust_prefix(&self) -> String {
-        self.prefix().replace(".", "_")
-    }
-}
-
-pub trait WithScope<'a> {
-    fn get_scope(&self) -> &Scope<'a>;
-
-    fn get_file_descriptor(&self) -> &'a FileDescriptorProto {
-        self.get_scope().get_file_descriptor()
-    }
-
-    // message or enum name
-    fn get_name(&self) -> &'a str;
-
-    fn escape_prefix(&self) -> &'static str;
-
-    fn name_to_package(&self) -> String {
-        let mut r = self.get_scope().prefix();
-        r.push_str(self.get_name());
-        r
-    }
-
-    /// Return absolute name starting with dot
-    fn name_absolute(&self) -> String {
-        let mut r = String::new();
-        r.push_str(".");
-        let package = self.get_file_descriptor().get_package();
-        if !package.is_empty() {
-            r.push_str(package);
-            r.push_str(".");
-        }
-        r.push_str(&self.name_to_package());
-        r
-    }
-
-    // rust type name of this descriptor
-    fn rust_name(&self) -> String {
-        let mut r = self.get_scope().rust_prefix();
-        // Only escape if prefix is not empty
-        if r.is_empty() && rust::is_rust_keyword(self.get_name()) {
-            r.push_str(self.escape_prefix());
-        }
-        r.push_str(self.get_name());
-        r
-    }
-
-    // fully-qualified name of this type
-    fn rust_fq_name(&self) -> String {
-        format!(
-            "{}::{}",
-            proto_path_to_rust_mod(self.get_scope().get_file_descriptor().get_name()),
-            self.rust_name()
-        )
-    }
-}
-
-#[derive(Clone)]
-pub struct MessageWithScope<'a> {
-    pub scope: Scope<'a>,
-    pub message: &'a DescriptorProto,
-}
-
-impl<'a> WithScope<'a> for MessageWithScope<'a> {
-    fn get_scope(&self) -> &Scope<'a> {
-        &self.scope
-    }
-
-    fn escape_prefix(&self) -> &'static str {
-        "message_"
-    }
-
-    fn get_name(&self) -> &'a str {
-        self.message.get_name()
-    }
-}
-
-impl<'a> MessageWithScope<'a> {
-    pub fn into_scope(mut self) -> Scope<'a> {
-        self.scope.path.push(self.message);
-        self.scope
-    }
-
-    pub fn to_scope(&self) -> Scope<'a> {
-        self.clone().into_scope()
-    }
-
-    pub fn fields(&self) -> Vec<FieldWithContext<'a>> {
-        self.message
-            .get_field()
-            .iter()
-            .map(|f| FieldWithContext {
-                field: f,
-                message: self.clone(),
-            })
-            .collect()
-    }
-
-    pub fn oneofs(&self) -> Vec<OneofWithContext<'a>> {
-        self.message
-            .get_oneof_decl()
-            .iter()
-            .enumerate()
-            .map(|(index, oneof)| OneofWithContext {
-                message: self.clone(),
-                oneof: &oneof,
-                index: index as u32,
-            })
-            .collect()
-    }
-
-    pub fn oneof_by_index(&self, index: u32) -> OneofWithContext<'a> {
-        self.oneofs().swap_remove(index as usize)
-    }
-
-    /// Pair of (key, value) if this message is map entry
-    pub fn map_entry(&'a self) -> Option<(FieldWithContext<'a>, FieldWithContext<'a>)> {
-        if self.message.get_options().get_map_entry() {
-            let key = self
-                .fields()
-                .into_iter()
-                .find(|f| f.field.get_number() == 1)
-                .unwrap();
-            let value = self
-                .fields()
-                .into_iter()
-                .find(|f| f.field.get_number() == 2)
-                .unwrap();
-            Some((key, value))
-        } else {
-            None
-        }
-    }
-}
-
-#[derive(Clone)]
-pub struct EnumWithScope<'a> {
-    pub scope: Scope<'a>,
-    pub en: &'a EnumDescriptorProto,
-}
-
-impl<'a> EnumWithScope<'a> {
-    // enum values
-    pub fn values(&'a self) -> &'a [EnumValueDescriptorProto] {
-        self.en.get_value()
-    }
-
-    // find enum value by name
-    pub fn value_by_name(&'a self, name: &str) -> &'a EnumValueDescriptorProto {
-        self.en
-            .get_value()
-            .into_iter()
-            .find(|v| v.get_name() == name)
-            .unwrap()
-    }
-}
-
-pub trait EnumValueDescriptorEx {
-    fn rust_name(&self) -> String;
-}
-
-impl EnumValueDescriptorEx for EnumValueDescriptorProto {
-    fn rust_name(&self) -> String {
-        let mut r = String::new();
-        if rust::is_rust_keyword(self.get_name()) {
-            r.push_str("value_");
-        }
-        r.push_str(self.get_name());
-        r
-    }
-}
-
-impl<'a> WithScope<'a> for EnumWithScope<'a> {
-    fn get_scope(&self) -> &Scope<'a> {
-        &self.scope
-    }
-
-    fn escape_prefix(&self) -> &'static str {
-        "enum_"
-    }
-
-    fn get_name(&self) -> &'a str {
-        self.en.get_name()
-    }
-}
-
-pub enum MessageOrEnumWithScope<'a> {
-    Message(MessageWithScope<'a>),
-    Enum(EnumWithScope<'a>),
-}
-
-impl<'a> WithScope<'a> for MessageOrEnumWithScope<'a> {
-    fn get_scope(&self) -> &Scope<'a> {
-        match self {
-            &MessageOrEnumWithScope::Message(ref m) => m.get_scope(),
-            &MessageOrEnumWithScope::Enum(ref e) => e.get_scope(),
-        }
-    }
-
-    fn escape_prefix(&self) -> &'static str {
-        match self {
-            &MessageOrEnumWithScope::Message(ref m) => m.escape_prefix(),
-            &MessageOrEnumWithScope::Enum(ref e) => e.escape_prefix(),
-        }
-    }
-
-    fn get_name(&self) -> &'a str {
-        match self {
-            &MessageOrEnumWithScope::Message(ref m) => m.get_name(),
-            &MessageOrEnumWithScope::Enum(ref e) => e.get_name(),
-        }
-    }
-}
-
-pub trait FieldDescriptorProtoExt {
-    fn rust_name(&self) -> String;
-}
-
-impl FieldDescriptorProtoExt for FieldDescriptorProto {
-    fn rust_name(&self) -> String {
-        if rust::is_rust_keyword(self.get_name()) {
-            format!("field_{}", self.get_name())
-        } else {
-            self.get_name().to_string()
-        }
-    }
-}
-
-#[derive(Clone)]
-pub struct FieldWithContext<'a> {
-    pub field: &'a FieldDescriptorProto,
-    pub message: MessageWithScope<'a>,
-}
-
-impl<'a> FieldWithContext<'a> {
-    #[doc(hidden)]
-    pub fn is_oneof(&self) -> bool {
-        self.field.has_oneof_index()
-    }
-
-    pub fn oneof(&self) -> Option<OneofWithContext<'a>> {
-        if self.is_oneof() {
-            Some(
-                self.message
-                    .oneof_by_index(self.field.get_oneof_index() as u32),
-            )
-        } else {
-            None
-        }
-    }
-
-    pub fn number(&self) -> u32 {
-        self.field.get_number() as u32
-    }
-
-    /// Shortcut
-    pub fn name(&self) -> &str {
-        self.field.get_name()
-    }
-
-    // field name in generated code
-    #[deprecated]
-    pub fn rust_name(&self) -> String {
-        self.field.rust_name()
-    }
-
-    // From field to file root
-    pub fn containing_messages(&self) -> Vec<&'a DescriptorProto> {
-        let mut r = Vec::new();
-        r.push(self.message.message);
-        r.extend(self.message.scope.path.iter().rev());
-        r
-    }
-}
-
-#[derive(Clone)]
-pub struct OneofVariantWithContext<'a> {
-    pub oneof: &'a OneofWithContext<'a>,
-    pub field: &'a FieldDescriptorProto,
-}
-
-#[derive(Clone)]
-pub struct OneofWithContext<'a> {
-    pub oneof: &'a OneofDescriptorProto,
-    pub index: u32,
-    pub message: MessageWithScope<'a>,
-}
-
-impl<'a> OneofWithContext<'a> {
-    /// Oneof rust name
-    pub fn name(&'a self) -> &'a str {
-        match self.oneof.get_name() {
-            "type" => "field_type",
-            "box" => "field_box",
-            x => x,
-        }
-    }
-
-    /// rust type name of enum
-    pub fn rust_name(&self) -> String {
-        format!(
-            "{}_oneof_{}",
-            self.message.rust_name(),
-            self.oneof.get_name()
-        )
-    }
-
-    /// Oneof variants
-    pub fn variants(&'a self) -> Vec<OneofVariantWithContext<'a>> {
-        self.message
-            .fields()
-            .iter()
-            .filter(|f| f.field.has_oneof_index() && f.field.get_oneof_index() == self.index as i32)
-            .map(|f| OneofVariantWithContext {
-                oneof: self,
-                field: &f.field,
-            })
-            .collect()
-    }
-}
-
-/// Find message by rust type name
-pub fn find_message_by_rust_name<'a>(
-    fd: &'a FileDescriptorProto,
-    rust_name: &str,
-) -> MessageWithScope<'a> {
-    FileScope {
-        file_descriptor: fd,
-    }
-    .find_messages()
-    .into_iter()
-    .find(|m| m.rust_name() == rust_name)
-    .unwrap()
-}
-
-/// Find enum by rust type name
-pub fn find_enum_by_rust_name<'a>(
-    fd: &'a FileDescriptorProto,
-    rust_name: &str,
-) -> EnumWithScope<'a> {
-    FileScope {
-        file_descriptor: fd,
-    }
-    .find_enums()
-    .into_iter()
-    .find(|e| e.rust_name() == rust_name)
-    .unwrap()
-}
-
-#[cfg(test)]
-mod test {
-
-    use super::proto_path_to_rust_mod;
-
-    #[test]
-    fn test_mod_path_proto_ext() {
-        assert_eq!("proto", proto_path_to_rust_mod("proto.proto"));
-    }
-
-    #[test]
-    fn test_mod_path_unknown_ext() {
-        assert_eq!("proto_proto3", proto_path_to_rust_mod("proto.proto3"));
-    }
-
-    #[test]
-    fn test_mod_path_empty_ext() {
-        assert_eq!("proto", proto_path_to_rust_mod("proto"));
-    }
-}
diff --git a/src/doctest_pb.rs b/src/doctest_pb.rs
new file mode 100644
index 0000000..327ffe4
--- /dev/null
+++ b/src/doctest_pb.rs
@@ -0,0 +1,161 @@
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
+// @generated
+
+// https://github.com/rust-lang/rust-clippy/issues/702
+#![allow(unknown_lints)]
+#![allow(clippy::all)]
+
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
+
+#![allow(box_pointers)]
+#![allow(dead_code)]
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+#![allow(trivial_casts)]
+#![allow(unused_results)]
+#![allow(unused_mut)]
+
+//! Generated file from `doctest_pb.proto`
+
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:MyMessage)
+pub struct MyMessage {
+    // special fields
+    // @@protoc_insertion_point(special_field:MyMessage.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a MyMessage {
+    fn default() -> &'a MyMessage {
+        <MyMessage as crate::Message>::default_instance()
+    }
+}
+
+impl MyMessage {
+    pub fn new() -> MyMessage {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(0);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<MyMessage>(
+            "MyMessage",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for MyMessage {
+    const NAME: &'static str = "MyMessage";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> MyMessage {
+        MyMessage::new()
+    }
+
+    fn clear(&mut self) {
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static MyMessage {
+        static instance: MyMessage = MyMessage {
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for MyMessage {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("MyMessage").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for MyMessage {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for MyMessage {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+static file_descriptor_proto_data: &'static [u8] = b"\
+    \n\x10doctest_pb.proto\"\x0b\n\tMyMessageJG\n\x06\x12\x04\x02\0\x05\x01\
+    \n%\n\x01\x0c\x12\x03\x02\0\x122\x1b\x20Messages\x20used\x20in\x20doctes\
+    ts\n\n\n\n\x02\x04\0\x12\x04\x04\0\x05\x01\n\n\n\x03\x04\0\x01\x12\x03\
+    \x04\x08\x11b\x06proto3\
+";
+
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
+}
+
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(MyMessage::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
+    })
+}
diff --git a/src/enum_full.rs b/src/enum_full.rs
new file mode 100644
index 0000000..36184f3
--- /dev/null
+++ b/src/enum_full.rs
@@ -0,0 +1,14 @@
+use crate::reflect::EnumDescriptor;
+use crate::reflect::EnumValueDescriptor;
+use crate::Enum;
+
+/// Trait is implemented for all enum types if lite runtime is not requested.
+///
+/// This trait provides access to runtime reflection.
+pub trait EnumFull: Enum {
+    /// Get enum value descriptor.
+    fn descriptor(&self) -> EnumValueDescriptor;
+
+    /// Get enum descriptor by type.
+    fn enum_descriptor() -> EnumDescriptor;
+}
diff --git a/src/enum_or_unknown.rs b/src/enum_or_unknown.rs
new file mode 100644
index 0000000..d042fba
--- /dev/null
+++ b/src/enum_or_unknown.rs
@@ -0,0 +1,104 @@
+use std::fmt;
+use std::marker::PhantomData;
+use std::mem;
+
+use crate::reflect::runtime_types::RuntimeTypeEnumOrUnknown;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::ProtobufValue;
+use crate::Enum;
+use crate::EnumFull;
+
+/// Protobuf enums with possibly unknown values are preserved in this struct.
+#[derive(Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
+#[repr(transparent)]
+// This should be <E: ProtobufEnum> when it no longer prevents using const fns.
+pub struct EnumOrUnknown<E> {
+    value: i32,
+    _marker: PhantomData<E>,
+}
+
+// Move into <E: ProtobufEnum> when no longer:
+// > trait bounds other than `Sized` on const fn parameters are unstable.
+impl<E> EnumOrUnknown<E> {
+    /// Construct from any `i32` value.
+    ///
+    /// Note passed value is not required to be a valid enum value.
+    pub const fn from_i32(value: i32) -> EnumOrUnknown<E> {
+        EnumOrUnknown {
+            value,
+            _marker: PhantomData,
+        }
+    }
+}
+
+impl<E: Enum> EnumOrUnknown<E> {
+    /// Construct from typed enum
+    pub fn new(e: E) -> EnumOrUnknown<E> {
+        EnumOrUnknown::from_i32(e.value())
+    }
+
+    /// Get contained `i32` value of enum
+    pub fn value(&self) -> i32 {
+        self.value
+    }
+
+    /// Get `i32` value as typed enum. Return `None` is value is unknown.
+    pub fn enum_value(&self) -> Result<E, i32> {
+        E::from_i32(self.value).ok_or(self.value)
+    }
+
+    /// Get contained enum, panic if value is unknown.
+    pub fn unwrap(&self) -> E {
+        self.enum_value().unwrap()
+    }
+
+    /// Get `i32` value as typed enum.
+    /// Return default enum value (first value) if value is unknown.
+    pub fn enum_value_or_default(&self) -> E {
+        self.enum_value().unwrap_or_default()
+    }
+
+    /// Get `i32` value as typed enum.
+    /// Return given enum value if value is unknown.
+    pub fn enum_value_or(&self, map_unknown: E) -> E {
+        self.enum_value().unwrap_or(map_unknown)
+    }
+
+    pub(crate) fn cast_to_values(enums: &[EnumOrUnknown<E>]) -> &[i32] {
+        assert_eq!(mem::size_of::<EnumOrUnknown<E>>(), mem::size_of::<i32>());
+        // SAFETY: `EnumOrUnknown` is `repr(C)`.
+        unsafe { std::slice::from_raw_parts(enums.as_ptr() as *const i32, enums.len()) }
+    }
+}
+
+impl<E: EnumFull> EnumOrUnknown<E> {
+    /// Get enum descriptor by type.
+    pub fn enum_descriptor() -> EnumDescriptor {
+        E::enum_descriptor()
+    }
+}
+
+impl<E: Enum> From<E> for EnumOrUnknown<E> {
+    fn from(e: E) -> Self {
+        EnumOrUnknown::new(e)
+    }
+}
+
+impl<E: Enum> Default for EnumOrUnknown<E> {
+    fn default() -> EnumOrUnknown<E> {
+        EnumOrUnknown::new(E::default())
+    }
+}
+
+impl<E: Enum + fmt::Debug> fmt::Debug for EnumOrUnknown<E> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.enum_value() {
+            Ok(e) => fmt::Debug::fmt(&e, f),
+            Err(e) => fmt::Debug::fmt(&e, f),
+        }
+    }
+}
+
+impl<E: EnumFull> ProtobufValue for EnumOrUnknown<E> {
+    type RuntimeType = RuntimeTypeEnumOrUnknown<E>;
+}
diff --git a/src/enums.rs b/src/enums.rs
index 558d6ff..125559b 100644
--- a/src/enums.rs
+++ b/src/enums.rs
@@ -1,8 +1,17 @@
-use crate::reflect::EnumDescriptor;
-use crate::reflect::EnumValueDescriptor;
+use std::fmt;
 
 /// Trait implemented by all protobuf enum types.
-pub trait ProtobufEnum: Eq + Sized + Copy + 'static {
+///
+/// Additionally, generated enums also implement [`EnumFull`](crate::EnumFull) trait,
+/// which provides access to reflection.
+pub trait Enum: Eq + Sized + Copy + fmt::Debug + Default + Send + Sync + 'static {
+    /// Enum name as specified in `.proto` file.
+    ///
+    /// There's full reflection when non-lite runtime code generation is used,
+    /// and enums implement [`EnumFull`](crate::EnumFull) trait.
+    /// This operation is for lite runtime.
+    const NAME: &'static str;
+
     /// Get enum `i32` value.
     fn value(&self) -> i32;
 
@@ -10,23 +19,6 @@
     /// Return `None` if value is unknown.
     fn from_i32(v: i32) -> Option<Self>;
 
-    /// Get all enum values for enum type.
-    fn values() -> &'static [Self] {
-        panic!();
-    }
-
-    /// Get enum value descriptor.
-    fn descriptor(&self) -> &'static EnumValueDescriptor {
-        self.enum_descriptor().value_by_number(self.value())
-    }
-
-    /// Get enum descriptor.
-    fn enum_descriptor(&self) -> &'static EnumDescriptor {
-        Self::enum_descriptor_static()
-    }
-
-    /// Get enum descriptor by type.
-    fn enum_descriptor_static() -> &'static EnumDescriptor {
-        panic!();
-    }
+    /// All enum values for enum type.
+    const VALUES: &'static [Self] = &[];
 }
diff --git a/src/error.rs b/src/error.rs
index 3f06909..38b68fb 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,151 +1,133 @@
-//! Protobuf error type
-
-use std::error::Error;
-use std::fmt;
 use std::io;
 use std::str;
 
+use crate::reflect::error::ReflectError;
 use crate::wire_format::WireType;
 
-/// `Result` alias for `ProtobufError`
-pub type ProtobufResult<T> = Result<T, ProtobufError>;
+/// [`Result`] alias for [`Error`].
+pub type Result<T> = std::result::Result<T, crate::Error>;
 
 /// Enum values added here for diagnostic purposes.
 /// Users should not depend on specific values.
-#[derive(Debug)]
-pub enum WireError {
-    /// Could not read complete message because stream is EOF
+#[derive(Debug, thiserror::Error)]
+pub(crate) enum WireError {
+    #[error("Unexpected EOF")]
     UnexpectedEof,
-    /// Wrong wire type for given field
+    #[error("Unexpected wire type")]
     UnexpectedWireType(WireType),
-    /// Incorrect tag value
+    #[error("Incorrect tag")]
     IncorrectTag(u32),
-    /// Malformed map field
-    IncompleteMap,
-    /// Malformed varint
+    #[error("Incorrect varint")]
     IncorrectVarint,
-    /// String is not valid UTD-8
+    #[error("Invalid UTF-8 sequence")]
     Utf8Error,
-    /// Enum value is unknown
-    InvalidEnumValue(i32),
-    /// Message is too nested
+    #[error("Invalid enum `{}` value: {}", .0, .1)]
+    InvalidEnumValue(&'static str, i32),
+    #[error("Over recursion limit")]
     OverRecursionLimit,
-    /// Could not read complete message because stream is EOF
+    #[error("Truncated message")]
     TruncatedMessage,
-    /// Other error
-    Other,
-}
-
-impl fmt::Display for WireError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        match self {
-            WireError::Utf8Error => write!(f, "invalid UTF-8 sequence"),
-            WireError::UnexpectedWireType(..) => write!(f, "unexpected wire type"),
-            WireError::InvalidEnumValue(..) => write!(f, "invalid enum value"),
-            WireError::IncorrectTag(..) => write!(f, "incorrect tag"),
-            WireError::IncorrectVarint => write!(f, "incorrect varint"),
-            WireError::IncompleteMap => write!(f, "incomplete map"),
-            WireError::UnexpectedEof => write!(f, "unexpected EOF"),
-            WireError::OverRecursionLimit => write!(f, "over recursion limit"),
-            WireError::TruncatedMessage => write!(f, "truncated message"),
-            WireError::Other => write!(f, "other error"),
-        }
-    }
+    // not really possible
+    #[error("Limit overflow")]
+    LimitOverflow,
+    #[error("New limit must not be greater than current limit")]
+    LimitIncrease,
+    #[error("Encoded message size {0} is too large")]
+    MessageTooLarge(u64),
+    #[error("Value too large for u32: {}", .0)]
+    U32Overflow(u64),
+    #[error("Value too large for i32: {}", .0)]
+    I32Overflow(i64),
 }
 
 /// Generic protobuf error
-#[derive(Debug)]
-pub enum ProtobufError {
+#[derive(Debug, thiserror::Error)]
+pub(crate) enum ProtobufError {
     /// I/O error when reading or writing
-    IoError(io::Error),
+    #[error(transparent)]
+    IoError(#[from] io::Error),
     /// Malformed input
-    WireError(WireError),
+    #[error(transparent)]
+    WireError(#[from] WireError),
+    #[error(transparent)]
+    Reflect(#[from] ReflectError),
     /// Protocol contains a string which is not valid UTF-8 string
-    Utf8(str::Utf8Error),
-    /// Not all required fields set
-    MessageNotInitialized {
-        /// Message name
-        message: &'static str,
-    },
+    #[error("UTF-8 decode error")]
+    Utf8(
+        #[source]
+        #[from]
+        str::Utf8Error,
+    ),
+    /// Not all required fields of message set.
+    #[error("Message `{}` is missing required fields", .0)]
+    MessageNotInitialized(String),
+    /// Message is too large.
+    #[error("Provided buffer has not enough capacity to write message `{0}`")]
+    BufferHasNotEnoughCapacity(String),
+    /// Protobuf type and runtime types mismatch.
+    #[error("Protobuf type and runtime types are not compatible")]
+    IncompatibleProtobufTypeAndRuntimeType,
+    /// Group field type not implemented.
+    #[error("Group field is not supported")]
+    GroupIsNotImplemented,
 }
 
-impl ProtobufError {
-    /// Create message not initialized error.
-    #[doc(hidden)]
-    pub fn message_not_initialized(message: &'static str) -> ProtobufError {
-        ProtobufError::MessageNotInitialized { message: message }
+/// Error type for protobuf operations.
+#[derive(Debug, thiserror::Error)]
+#[error(transparent)]
+pub struct Error(pub(crate) Box<ProtobufError>);
+
+impl From<ProtobufError> for Error {
+    #[cold]
+    fn from(e: ProtobufError) -> Self {
+        Self(Box::new(e))
     }
 }
 
-impl fmt::Display for ProtobufError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            // not sure that cause should be included in message
-            &ProtobufError::IoError(ref e) => write!(f, "IO error: {}", e),
-            &ProtobufError::WireError(ref e) => fmt::Display::fmt(e, f),
-            &ProtobufError::Utf8(ref e) => write!(f, "{}", e),
-            &ProtobufError::MessageNotInitialized { .. } => write!(f, "not all message fields set"),
-        }
+impl From<WireError> for Error {
+    #[cold]
+    fn from(e: WireError) -> Self {
+        Self(Box::new(ProtobufError::WireError(e)))
     }
 }
 
-impl Error for ProtobufError {
-    #[allow(deprecated)] // call to `description`
-    fn description(&self) -> &str {
-        match self {
-            // not sure that cause should be included in message
-            &ProtobufError::IoError(ref e) => e.description(),
-            &ProtobufError::WireError(ref e) => match *e {
-                WireError::Utf8Error => "invalid UTF-8 sequence",
-                WireError::UnexpectedWireType(..) => "unexpected wire type",
-                WireError::InvalidEnumValue(..) => "invalid enum value",
-                WireError::IncorrectTag(..) => "incorrect tag",
-                WireError::IncorrectVarint => "incorrect varint",
-                WireError::IncompleteMap => "incomplete map",
-                WireError::UnexpectedEof => "unexpected EOF",
-                WireError::OverRecursionLimit => "over recursion limit",
-                WireError::TruncatedMessage => "truncated message",
-                WireError::Other => "other error",
-            },
-            &ProtobufError::Utf8(ref e) => &e.description(),
-            &ProtobufError::MessageNotInitialized { .. } => "not all message fields set",
-        }
-    }
-
-    fn cause(&self) -> Option<&dyn Error> {
-        match self {
-            &ProtobufError::IoError(ref e) => Some(e),
-            &ProtobufError::Utf8(ref e) => Some(e),
-            &ProtobufError::WireError(..) => None,
-            &ProtobufError::MessageNotInitialized { .. } => None,
-        }
+impl From<ReflectError> for Error {
+    #[cold]
+    fn from(e: ReflectError) -> Self {
+        Self(Box::new(ProtobufError::Reflect(e)))
     }
 }
 
-impl From<io::Error> for ProtobufError {
-    fn from(err: io::Error) -> Self {
-        ProtobufError::IoError(err)
-    }
-}
-
-impl From<str::Utf8Error> for ProtobufError {
-    fn from(err: str::Utf8Error) -> Self {
-        ProtobufError::Utf8(err)
-    }
-}
-
-impl From<ProtobufError> for io::Error {
-    fn from(err: ProtobufError) -> Self {
-        match err {
+impl From<Error> for io::Error {
+    #[cold]
+    fn from(err: Error) -> Self {
+        match *err.0 {
             ProtobufError::IoError(e) => e,
             ProtobufError::WireError(e) => {
                 io::Error::new(io::ErrorKind::InvalidData, ProtobufError::WireError(e))
             }
-            ProtobufError::MessageNotInitialized { message: msg } => io::Error::new(
+            ProtobufError::MessageNotInitialized(message) => io::Error::new(
                 io::ErrorKind::InvalidInput,
-                ProtobufError::MessageNotInitialized { message: msg },
+                ProtobufError::MessageNotInitialized(message),
             ),
             e => io::Error::new(io::ErrorKind::Other, Box::new(e)),
         }
     }
 }
+
+impl From<io::Error> for Error {
+    #[cold]
+    fn from(err: io::Error) -> Self {
+        Error(Box::new(ProtobufError::IoError(err)))
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::mem;
+
+    #[test]
+    fn error_size() {
+        assert_eq!(mem::size_of::<usize>(), mem::size_of::<crate::Error>());
+    }
+}
diff --git a/src/ext.rs b/src/ext.rs
index a1c18f6..b037ade 100644
--- a/src/ext.rs
+++ b/src/ext.rs
@@ -1,47 +1,81 @@
 //! Utilities to support "extension" fields.
 //!
+//! This is a stopgap implementation, it only allows to fetch basic singular values,
+//! and that's it. Anything similar to extension registry is not implemented yet.
+//!
 //! Extensions are [described in the official protobuf documentation][exts].
 //!
 //! [exts]: https://developers.google.com/protocol-buffers/docs/proto#extensions
 
 use std::marker::PhantomData;
 
-use crate::message::Message;
-use crate::types::ProtobufType;
+use crate::descriptor::field_descriptor_proto::Type;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::Message;
 
 /// Optional ext field
-pub struct ExtFieldOptional<M: Message, T: ProtobufType> {
-    /// Extension field number
-    pub field_number: u32,
+///
+/// This is initialized from generated code, do not instantiate directly.
+pub struct ExtFieldOptional<M, T> {
+    /// Extension field number.
+    field_number: u32,
+    /// Extension field type.
+    field_type: Type,
     /// Marker
-    // TODO: hide
-    pub phantom: PhantomData<(M, T)>,
+    phantom: PhantomData<(M, T)>,
 }
 
 /// Repeated ext field
-pub struct ExtFieldRepeated<M: Message, T: ProtobufType> {
+///
+/// This is initialized from generated code, do not instantiate directly.
+pub struct ExtFieldRepeated<M, V> {
     /// Extension field number
-    pub field_number: u32,
+    #[allow(dead_code)]
+    field_number: u32,
+    /// Field type.
+    #[allow(dead_code)]
+    field_type: Type,
     /// Extension field number
-    // TODO: hide
-    pub phantom: PhantomData<(M, T)>,
+    phantom: PhantomData<(M, V)>,
 }
 
-impl<M: Message, T: ProtobufType> ExtFieldOptional<M, T> {
-    /// Get a copy of value from a message.
-    ///
-    /// Extension data is stored in [`UnknownFields`](crate::UnknownFields).
-    pub fn get(&self, m: &M) -> Option<T::Value> {
-        m.get_unknown_fields()
-            .get(self.field_number)
-            .and_then(T::get_from_unknown)
+impl<M, V> ExtFieldOptional<M, V> {
+    /// Constructor. Called from generated code.
+    pub const fn new(field_number: u32, field_type: Type) -> Self {
+        ExtFieldOptional {
+            field_number,
+            field_type,
+            phantom: PhantomData,
+        }
     }
 }
 
-impl<M: Message, T: ProtobufType> ExtFieldRepeated<M, T> {
+impl<M: Message, V: ProtobufValue> ExtFieldOptional<M, V> {
+    /// Get a copy of value from a message.
+    ///
+    /// Extension data is stored in [`UnknownFields`](crate::UnknownFields).
+    pub fn get(&self, m: &M) -> Option<V> {
+        m.unknown_fields()
+            .get(self.field_number)
+            .and_then(|u| V::RuntimeType::get_from_unknown(u, self.field_type))
+    }
+}
+
+impl<M, V> ExtFieldRepeated<M, V> {
+    /// Constructor. Called from generated code.
+    pub const fn new(field_number: u32, field_type: Type) -> Self {
+        ExtFieldRepeated {
+            field_number,
+            field_type,
+            phantom: PhantomData,
+        }
+    }
+}
+
+impl<M: Message, V: ProtobufValue> ExtFieldRepeated<M, V> {
     /// Get a copy of value from a message (**not implemented**).
-    pub fn get(&self, _m: &M) -> Vec<T::Value> {
-        // TODO
-        unimplemented!()
+    pub fn get(&self, _m: &M) -> Vec<V> {
+        unimplemented!("extension fields implementation in rust-protobuf is stopgap")
     }
 }
diff --git a/src/fixed.rs b/src/fixed.rs
new file mode 100644
index 0000000..fe12770
--- /dev/null
+++ b/src/fixed.rs
@@ -0,0 +1,35 @@
+/// Fixed size integers.
+pub(crate) trait ProtobufFixed {
+    /// Size of this fixed type in bytes.
+    const LEN: u32;
+}
+
+impl ProtobufFixed for u32 {
+    const LEN: u32 = 4;
+}
+
+impl ProtobufFixed for i32 {
+    const LEN: u32 = 4;
+}
+
+impl ProtobufFixed for u64 {
+    const LEN: u32 = 8;
+}
+
+impl ProtobufFixed for i64 {
+    const LEN: u32 = 8;
+}
+
+impl ProtobufFixed for f32 {
+    const LEN: u32 = 4;
+}
+
+impl ProtobufFixed for f64 {
+    const LEN: u32 = 8;
+}
+
+/// Technically `bool` is not fixed, but it can be considered as fixed
+/// for the purpose of encoding.
+impl ProtobufFixed for bool {
+    const LEN: u32 = 1;
+}
diff --git a/src/json/json_name.rs b/src/json/json_name.rs
deleted file mode 100644
index f5c9364..0000000
--- a/src/json/json_name.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-/// Implementation must match exactly
-/// `ToJsonName()` function in C++ `descriptor.cc`.
-pub fn json_name(input: &str) -> String {
-    let mut capitalize_next = false;
-    let mut result = String::with_capacity(input.len());
-
-    for c in input.chars() {
-        if c == '_' {
-            capitalize_next = true;
-        } else if capitalize_next {
-            result.extend(c.to_uppercase());
-            capitalize_next = false;
-        } else {
-            result.push(c);
-        }
-    }
-
-    result
-}
diff --git a/src/json/mod.rs b/src/json/mod.rs
deleted file mode 100644
index 2755aad..0000000
--- a/src/json/mod.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-//! JSON serialization and deserialization.
-//!
-//! (Implemented in master, but not ported to stable branch yet).
-
-mod json_name;
-
-#[doc(hidden)]
-pub use self::json_name::json_name;
diff --git a/src/lazy.rs b/src/lazy.rs
index 3575dd0..217f759 100644
--- a/src/lazy.rs
+++ b/src/lazy.rs
@@ -1,113 +1,24 @@
-//! Lazily initialized data.
-//! Used in generated code.
+use once_cell::sync::OnceCell;
 
-// Avoid deprecation warnings when compiling rust-protobuf
-#![allow(deprecated)]
-
-use std::mem;
-use std::sync;
-
-/// Lasily initialized data.
-#[deprecated(
-    since = "2.16",
-    note = "Please regenerate .rs files from .proto files to use newer APIs"
-)]
+/// Lazily initialized static variable.
+///
+/// Used in generated code.
+///
+/// Currently a wrapper around `once_cell`s `OnceCell`.
 pub struct Lazy<T> {
-    #[doc(hidden)]
-    pub lock: sync::Once,
-    #[doc(hidden)]
-    pub ptr: *const T,
+    once_cell: OnceCell<T>,
 }
 
 impl<T> Lazy<T> {
-    /// Uninitialized `Lazy` object.
-    ///
-    /// The initializer is added in rust-protobuf 2.11, for compatibility with
-    /// previously generated code, existing fields are kept public.
-    pub const INIT: Lazy<T> = Lazy {
-        lock: sync::Once::new(),
-        ptr: 0 as *const T,
-    };
-
-    /// Get lazy field value, initialize it with given function if not yet.
-    pub fn get<F>(&'static mut self, init: F) -> &'static T
-    where
-        F: FnOnce() -> T,
-    {
-        // ~ decouple the lifetimes of 'self' and 'self.lock' such we
-        // can initialize self.ptr in the call_once closure (note: we
-        // do have to initialize self.ptr in the closure to guarantee
-        // the ptr is valid for all calling threads at any point in
-        // time)
-        let lock: &sync::Once = unsafe { mem::transmute(&self.lock) };
-        lock.call_once(|| unsafe {
-            self.ptr = mem::transmute(Box::new(init()));
-        });
-        unsafe { &*self.ptr }
-    }
-}
-
-/// Used to initialize `lock` field in `Lazy` struct.
-#[deprecated(
-    since = "2.11",
-    note = "Regenerate .proto files to use safer initializer"
-)]
-pub const ONCE_INIT: sync::Once = sync::Once::new();
-
-#[cfg(test)]
-mod test {
-    use std::sync::atomic::AtomicIsize;
-    use std::sync::atomic::Ordering;
-    use std::sync::Arc;
-    use std::sync::Barrier;
-    use std::thread;
-
-    use super::Lazy;
-
-    #[test]
-    fn many_threads_calling_get() {
-        const N_THREADS: usize = 32;
-        const N_ITERS_IN_THREAD: usize = 32;
-        const N_ITERS: usize = 16;
-
-        static mut LAZY: Lazy<String> = Lazy::INIT;
-        static CALL_COUNT: AtomicIsize = AtomicIsize::new(0);
-
-        let value = "Hello, world!".to_owned();
-
-        for _ in 0..N_ITERS {
-            // Reset mutable state.
-            unsafe {
-                LAZY = Lazy::INIT;
-            }
-            CALL_COUNT.store(0, Ordering::SeqCst);
-
-            // Create a bunch of threads, all calling .get() at the same time.
-            let mut threads = vec![];
-            let barrier = Arc::new(Barrier::new(N_THREADS));
-
-            for _ in 0..N_THREADS {
-                let cloned_value_thread = value.clone();
-                let cloned_barrier = barrier.clone();
-                threads.push(thread::spawn(move || {
-                    // Ensure all threads start at once to maximise contention.
-                    cloned_barrier.wait();
-                    for _ in 0..N_ITERS_IN_THREAD {
-                        assert_eq!(&cloned_value_thread, unsafe {
-                            LAZY.get(|| {
-                                CALL_COUNT.fetch_add(1, Ordering::SeqCst);
-                                cloned_value_thread.clone()
-                            })
-                        });
-                    }
-                }));
-            }
-
-            for thread in threads {
-                thread.join().unwrap();
-            }
-
-            assert_eq!(CALL_COUNT.load(Ordering::SeqCst), 1);
+    /// Uninitialized state.
+    pub const fn new() -> Lazy<T> {
+        Lazy {
+            once_cell: OnceCell::new(),
         }
     }
+
+    /// Lazily initialize the value.
+    pub fn get(&self, f: impl FnOnce() -> T) -> &T {
+        self.once_cell.get_or_init(f)
+    }
 }
diff --git a/src/lazy_v2.rs b/src/lazy_v2.rs
deleted file mode 100644
index 6f9ac1e..0000000
--- a/src/lazy_v2.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-//! Lazily initialized data.
-//! Used in generated code.
-
-use std::cell::UnsafeCell;
-use std::sync;
-
-/// Lazily initialized data.
-pub struct LazyV2<T: Sync> {
-    lock: sync::Once,
-    ptr: UnsafeCell<*const T>,
-}
-
-unsafe impl<T: Sync> Sync for LazyV2<T> {}
-
-impl<T: Sync> LazyV2<T> {
-    /// Uninitialized `Lazy` object.
-    pub const INIT: LazyV2<T> = LazyV2 {
-        lock: sync::Once::new(),
-        ptr: UnsafeCell::new(0 as *const T),
-    };
-
-    /// Get lazy field value, initialize it with given function if not yet.
-    pub fn get<F>(&'static self, init: F) -> &'static T
-    where
-        F: FnOnce() -> T,
-    {
-        self.lock.call_once(|| unsafe {
-            *self.ptr.get() = Box::into_raw(Box::new(init()));
-        });
-        unsafe { &**self.ptr.get() }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use std::sync::atomic::AtomicIsize;
-    use std::sync::atomic::Ordering;
-    use std::sync::Arc;
-    use std::sync::Barrier;
-    use std::thread;
-
-    use super::LazyV2;
-
-    #[test]
-    fn many_threads_calling_get() {
-        const N_THREADS: usize = 32;
-        const N_ITERS_IN_THREAD: usize = 32;
-        const N_ITERS: usize = 16;
-
-        static mut LAZY: LazyV2<String> = LazyV2::INIT;
-        static CALL_COUNT: AtomicIsize = AtomicIsize::new(0);
-
-        let value = "Hello, world!".to_owned();
-
-        for _ in 0..N_ITERS {
-            // Reset mutable state.
-            unsafe {
-                LAZY = LazyV2::INIT;
-            }
-            CALL_COUNT.store(0, Ordering::SeqCst);
-
-            // Create a bunch of threads, all calling .get() at the same time.
-            let mut threads = vec![];
-            let barrier = Arc::new(Barrier::new(N_THREADS));
-
-            for _ in 0..N_THREADS {
-                let cloned_value_thread = value.clone();
-                let cloned_barrier = barrier.clone();
-                threads.push(thread::spawn(move || {
-                    // Ensure all threads start at once to maximise contention.
-                    cloned_barrier.wait();
-                    for _ in 0..N_ITERS_IN_THREAD {
-                        assert_eq!(&cloned_value_thread, unsafe {
-                            LAZY.get(|| {
-                                CALL_COUNT.fetch_add(1, Ordering::SeqCst);
-                                cloned_value_thread.clone()
-                            })
-                        });
-                    }
-                }));
-            }
-
-            for thread in threads {
-                thread.join().unwrap();
-            }
-
-            assert_eq!(CALL_COUNT.load(Ordering::SeqCst), 1);
-        }
-    }
-}
diff --git a/src/lib.rs b/src/lib.rs
index d88e029..c054337 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,186 +1,102 @@
 //! # Library to read and write protocol buffers data
 //!
-//! # Version 2 is stable
+//! ## Features
 //!
-//! Currently developed branch of rust-protobuf [is 3](https://docs.rs/protobuf/%3E=3.0.0-alpha).
-//! It has the same spirit as version 2, but contains numerous improvements like:
-//! * runtime reflection for mutability, not just for access
-//! * protobuf text format and JSON parsing (which rely on reflection)
-//! * dynamic message support: work with protobuf data without generating code from schema
+//! This crate has one feature, which is `with-bytes`.
 //!
-//! Stable version of rust-protobuf will be supported until version 3 released.
+//! `with-bytes` enables `protobuf` crate support for
+//! [`bytes` crate](https://github.com/tokio-rs/bytes):
+//! when parsing bytes or strings from `bytes::Bytes`,
+//! `protobuf` will be able to reference the input instead of allocating subarrays.
 //!
-//! [Tracking issue for version 3](https://github.com/stepancheg/rust-protobuf/issues/518).
+//! Note, codegen also need to be instructed to generate `Bytes` or `Chars` for
+//! `bytes` or `string` protobuf types instead of default `Vec<u8>` or `String`,
+//! just enabling option on this crate is not enough.
 //!
-//! # How to generate rust code
+//! See `Customize` struct in [`protobuf-codegen` crate](https://docs.rs/protobuf-codegen).
 //!
-//! There are several ways to generate rust code from `.proto` files
+//! ## Accompanying crates
 //!
-//! ## Invoke `protoc` programmatically with protoc-rust crate (recommended)
-//!
-//! Have a look at readme in [protoc-rust crate](https://docs.rs/protoc-rust/=2).
-//!
-//! ## Use pure rust protobuf parser and code generator
-//!
-//! Readme should be in
-//! [protobuf-codegen-pure crate](https://docs.rs/protobuf-codegen-pure/=2).
-//!
-//! ## Use protoc-gen-rust plugin
-//!
-//! Readme is [here](https://docs.rs/protobuf-codegen/=2).
-//!
-//! ## Generated code
-//!
-//! Have a look at generated files (for current development version),
-//! used internally in rust-protobuf:
-//!
-//! * [descriptor.rs](https://github.com/stepancheg/rust-protobuf/blob/master/protobuf/src/descriptor.rs)
-//!   for [descriptor.proto](https://github.com/stepancheg/rust-protobuf/blob/master/protoc-bin-vendored/include/google/protobuf/descriptor.proto)
-//!   (that is part of Google protobuf)
-//!
-//! # Copy on write
-//!
-//! Rust-protobuf can be used with [bytes crate](https://github.com/tokio-rs/bytes).
-//!
-//! To enable `Bytes` you need to:
-//!
-//! 1. Enable `with-bytes` feature in rust-protobuf:
-//!
-//! ```
-//! [dependencies]
-//! protobuf = { version = "~2.0", features = ["with-bytes"] }
-//! ```
-//!
-//! 2. Enable bytes option
-//!
-//! with `Customize` when codegen is invoked programmatically:
-//!
-//! ```ignore
-//! protoc_rust::run(protoc_rust::Args {
-//!     ...
-//!     customize: Customize {
-//!         carllerche_bytes_for_bytes: Some(true),
-//!         carllerche_bytes_for_string: Some(true),
-//!         ..Default::default()
-//!     },
-//! });
-//! ```
-//!
-//! or in `.proto` file:
-//!
-//! ```ignore
-//! import "rustproto.proto";
-//!
-//! option (rustproto.carllerche_bytes_for_bytes_all) = true;
-//! option (rustproto.carllerche_bytes_for_string_all) = true;
-//! ```
-//!
-//! With these options enabled, fields of type `bytes` or `string` are
-//! generated as `Bytes` or `Chars` respectively. When `CodedInputStream` is constructed
-//! from `Bytes` object, fields of these types get subslices of original `Bytes` object,
-//! instead of being allocated on heap.
-//!
-//! # Accompanying crates
-//!
-//! * [`protoc-rust`](https://docs.rs/protoc-rust/=2)
-//!   and [`protobuf-codegen-pure`](https://docs.rs/protobuf-codegen-pure/=2)
+//! * [`protobuf-json-mapping`](https://docs.rs/protobuf-json-mapping)
+//!   implements JSON parsing and serialization for protobuf messages.
+//! * [`protobuf-codegen`](https://docs.rs/protobuf-codegen)
 //!   can be used to rust code from `.proto` crates.
-//! * [`protobuf-codegen`](https://docs.rs/protobuf-codegen/=2) for `protoc-gen-rust` protoc plugin.
-//! * [`protoc`](https://docs.rs/protoc/=2) crate can be used to invoke `protoc` programmatically.
-//! * [`protoc-bin-vendored`](https://docs.rs/protoc-bin-vendored/=2) contains `protoc` command
-//!   packed into the crate.
+//! * [`protoc-bin-vendored`](https://docs.rs/protoc-bin-vendored)
+//!   contains `protoc` command packed into the crate.
+//! * [`protobuf-parse`](https://docs.rs/protobuf-parse) contains
+//!   `.proto` file parser. Rarely need to be used directly,
+//!   but can be used for mechanical processing of `.proto` files.
 
 #![deny(missing_docs)]
 #![deny(rustdoc::broken_intra_doc_links)]
 
-#[cfg(feature = "bytes")]
-extern crate bytes;
-#[cfg(feature = "with-serde")]
-extern crate serde;
-#[macro_use]
-#[cfg(feature = "with-serde")]
-extern crate serde_derive;
-pub use crate::cached_size::CachedSize;
-#[cfg(feature = "bytes")]
-pub use crate::chars::Chars;
-pub use crate::clear::Clear;
 pub use crate::coded_input_stream::CodedInputStream;
 pub use crate::coded_output_stream::CodedOutputStream;
-pub use crate::enums::ProtobufEnum;
-pub use crate::error::ProtobufError;
-pub use crate::error::ProtobufResult;
-#[allow(deprecated)]
-pub use crate::message::parse_from_bytes;
-#[cfg(feature = "bytes")]
-#[allow(deprecated)]
-pub use crate::message::parse_from_carllerche_bytes;
-#[allow(deprecated)]
-pub use crate::message::parse_from_reader;
-#[allow(deprecated)]
-pub use crate::message::parse_length_delimited_from;
-#[allow(deprecated)]
-pub use crate::message::parse_length_delimited_from_bytes;
-#[allow(deprecated)]
-pub use crate::message::parse_length_delimited_from_reader;
+pub use crate::enum_full::EnumFull;
+pub use crate::enum_or_unknown::EnumOrUnknown;
+pub use crate::enums::Enum;
 pub use crate::message::Message;
-pub use crate::repeated::RepeatedField;
-pub use crate::singular::SingularField;
-pub use crate::singular::SingularPtrField;
+pub use crate::message_dyn::MessageDyn;
+pub use crate::message_field::MessageField;
+pub use crate::message_full::MessageFull;
+pub use crate::oneof::Oneof;
+pub use crate::oneof_full::OneofFull;
+pub use crate::special::SpecialFields;
 pub use crate::unknown::UnknownFields;
 pub use crate::unknown::UnknownFieldsIter;
 pub use crate::unknown::UnknownValue;
 pub use crate::unknown::UnknownValueRef;
-pub use crate::unknown::UnknownValues;
-pub use crate::unknown::UnknownValuesIter;
+pub(crate) mod wire_format;
+#[cfg(feature = "bytes")]
+pub use crate::chars::Chars;
+pub use crate::error::Error;
+pub use crate::error::Result;
 
 // generated
 pub mod descriptor;
 pub mod plugin;
 pub mod rustproto;
 
-pub mod wire_format;
-
-mod clear;
+mod byteorder;
 mod coded_input_stream;
 mod coded_output_stream;
-pub mod compiler_plugin;
+mod enum_full;
+mod enum_or_unknown;
 mod enums;
-pub mod error;
+mod error;
 pub mod ext;
-pub mod json;
-pub mod lazy;
-mod lazy_v2;
+mod lazy;
 mod message;
+mod message_dyn;
+mod message_field;
+mod message_full;
+mod oneof;
+mod oneof_full;
+mod owning_ref;
 pub mod reflect;
-mod repeated;
 pub mod rt;
-mod singular;
 pub mod text_format;
-pub mod types;
 pub mod well_known_types;
 mod well_known_types_util;
 
 // used by test
 #[cfg(test)]
-#[path = "../../protobuf-test-common/src/hex.rs"]
+#[path = "../../test-crates/protobuf-test-common/src/hex.rs"]
 mod hex;
 
-// used by rust-grpc
-pub mod descriptorx;
-
 mod cached_size;
 mod chars;
-#[doc(hidden)] // used by codegen
-pub mod rust;
-mod strx;
+mod fixed;
+mod special;
 mod unknown;
 mod varint;
 mod zigzag;
 
 mod misc;
 
-mod buf_read_iter;
-mod buf_read_or_reader;
+// This does not work: https://github.com/rust-lang/rust/issues/67295
+#[cfg(doctest)]
+mod doctest_pb;
 
 /// This symbol is in generated `version.rs`, include here for IDE
 #[cfg(never)]
diff --git a/src/message.rs b/src/message.rs
index e9d6b30..9d7d429 100644
--- a/src/message.rs
+++ b/src/message.rs
@@ -1,42 +1,36 @@
-use std::any::Any;
-use std::any::TypeId;
-use std::fmt;
 use std::io::Read;
 use std::io::Write;
 
-#[cfg(feature = "bytes")]
-use bytes::Bytes;
-
-use crate::clear::Clear;
-use crate::coded_input_stream::CodedInputStream;
-use crate::coded_input_stream::WithCodedInputStream;
-use crate::coded_output_stream::with_coded_output_stream_to_bytes;
-use crate::coded_output_stream::CodedOutputStream;
-use crate::coded_output_stream::WithCodedOutputStream;
+use crate::coded_output_stream::with::WithCodedOutputStream;
 use crate::error::ProtobufError;
-use crate::error::ProtobufResult;
-use crate::reflect::MessageDescriptor;
-use crate::unknown::UnknownFields;
+use crate::wire_format::check_message_size;
+use crate::CodedInputStream;
+use crate::CodedOutputStream;
+use crate::SpecialFields;
+use crate::UnknownFields;
 
-/// Trait implemented for all generated structs for protobuf messages.
+/// Trait which is implemented by all generated message.
 ///
-/// Also, generated messages implement `Clone + Default + PartialEq`
-pub trait Message: fmt::Debug + Clear + Any + Send + Sync {
-    /// Message descriptor for this message, used for reflection.
-    fn descriptor(&self) -> &'static MessageDescriptor;
+/// Note, by default all generated messages also implement [`MessageFull`](crate::MessageFull)
+/// trait which provides access to reflection and features which depend on reflection
+/// (text format and JSON serialization).
+pub trait Message: Default + Clone + Send + Sync + Sized + PartialEq + 'static {
+    /// Message name as specified in `.proto` file.
+    ///
+    /// Message name can be accessed using
+    /// [`MessageFull::descriptor`](crate::MessageFull::descriptor),
+    /// but when lite runtime is requested, this field can be used.
+    const NAME: &'static str;
 
     /// True iff all required fields are initialized.
     /// Always returns `true` for protobuf 3.
     fn is_initialized(&self) -> bool;
 
     /// Update this message object with fields read from given stream.
-    fn merge_from(&mut self, is: &mut CodedInputStream) -> ProtobufResult<()>;
+    fn merge_from(&mut self, is: &mut CodedInputStream) -> crate::Result<()>;
 
     /// Parse message from stream.
-    fn parse_from(is: &mut CodedInputStream) -> ProtobufResult<Self>
-    where
-        Self: Sized,
-    {
+    fn parse_from(is: &mut CodedInputStream) -> crate::Result<Self> {
         let mut r: Self = Message::new();
         r.merge_from(is)?;
         r.check_initialized()?;
@@ -47,23 +41,30 @@
     ///
     /// Sizes of this messages and nested messages must be cached
     /// by calling `compute_size` prior to this call.
-    fn write_to_with_cached_sizes(&self, os: &mut CodedOutputStream) -> ProtobufResult<()>;
+    fn write_to_with_cached_sizes(&self, os: &mut CodedOutputStream) -> crate::Result<()>;
 
-    /// Compute and cache size of this message and all nested messages
-    fn compute_size(&self) -> u32;
+    /// Compute and cache size of this message and all nested messages.
+    ///
+    /// Note if the computation overflows u32, the cached size is stored truncated.
+    fn compute_size(&self) -> u64;
 
     /// Get size previously computed by `compute_size`.
-    fn get_cached_size(&self) -> u32;
+    ///
+    /// Note if message size exceeds u32, the cached size is stored truncated.
+    fn cached_size(&self) -> u32 {
+        self.special_fields().cached_size().get()
+    }
 
     /// Write the message to the stream.
     ///
     /// Results in error if message is not fully initialized.
-    fn write_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()> {
+    fn write_to(&self, os: &mut CodedOutputStream) -> crate::Result<()> {
         self.check_initialized()?;
 
         // cache sizes
-        self.compute_size();
-        // TODO: reserve additional
+        let size = self.compute_size();
+        let size = check_message_size(size)?;
+        os.reserve_additional(size as u32, Self::NAME)?;
         self.write_to_with_cached_sizes(os)?;
 
         Ok(())
@@ -71,19 +72,33 @@
 
     /// Write the message to the stream prepending the message with message length
     /// encoded as varint.
-    fn write_length_delimited_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()> {
+    fn write_length_delimited_to(&self, os: &mut CodedOutputStream) -> crate::Result<()> {
         let size = self.compute_size();
+        let size = check_message_size(size)?;
+
+        os.reserve_additional_for_length_delimited(size, Self::NAME)?;
+
         os.write_raw_varint32(size)?;
+
+        let written = os.total_bytes_written();
+
         self.write_to_with_cached_sizes(os)?;
 
-        // TODO: assert we've written same number of bytes as computed
+        // Self-check.
+        assert_eq!(
+            written + size as u64,
+            os.total_bytes_written(),
+            "Expected to write {}, actually wrote {}",
+            size,
+            os.total_bytes_written() - written
+        );
 
         Ok(())
     }
 
     /// Write the message to the vec, prepend the message with message length
     /// encoded as varint.
-    fn write_length_delimited_to_vec(&self, vec: &mut Vec<u8>) -> ProtobufResult<()> {
+    fn write_length_delimited_to_vec(&self, vec: &mut Vec<u8>) -> crate::Result<()> {
         let mut os = CodedOutputStream::vec(vec);
         self.write_length_delimited_to(&mut os)?;
         os.flush()?;
@@ -91,17 +106,14 @@
     }
 
     /// Update this message object with fields read from given stream.
-    fn merge_from_bytes(&mut self, bytes: &[u8]) -> ProtobufResult<()> {
+    fn merge_from_bytes(&mut self, bytes: &[u8]) -> crate::Result<()> {
         let mut is = CodedInputStream::from_bytes(bytes);
         self.merge_from(&mut is)
     }
 
     /// Parse message from reader.
     /// Parse stops on EOF or when error encountered.
-    fn parse_from_reader(reader: &mut dyn Read) -> ProtobufResult<Self>
-    where
-        Self: Sized,
-    {
+    fn parse_from_reader(reader: &mut dyn Read) -> crate::Result<Self> {
         let mut is = CodedInputStream::new(reader);
         let r = Message::parse_from(&mut is)?;
         is.check_eof()?;
@@ -109,10 +121,7 @@
     }
 
     /// Parse message from byte array.
-    fn parse_from_bytes(bytes: &[u8]) -> ProtobufResult<Self>
-    where
-        Self: Sized,
-    {
+    fn parse_from_bytes(bytes: &[u8]) -> crate::Result<Self> {
         let mut is = CodedInputStream::from_bytes(bytes);
         let r = Message::parse_from(&mut is)?;
         is.check_eof()?;
@@ -122,191 +131,98 @@
     /// Parse message from `Bytes` object.
     /// Resulting message may share references to the passed bytes object.
     #[cfg(feature = "bytes")]
-    fn parse_from_carllerche_bytes(bytes: &Bytes) -> ProtobufResult<Self>
-    where
-        Self: Sized,
-    {
-        let mut is = CodedInputStream::from_carllerche_bytes(bytes);
+    fn parse_from_tokio_bytes(bytes: &bytes::Bytes) -> crate::Result<Self> {
+        let mut is = CodedInputStream::from_tokio_bytes(bytes);
         let r = Self::parse_from(&mut is)?;
         is.check_eof()?;
         Ok(r)
     }
 
     /// Check if all required fields of this object are initialized.
-    fn check_initialized(&self) -> ProtobufResult<()> {
+    fn check_initialized(&self) -> crate::Result<()> {
         if !self.is_initialized() {
-            Err(ProtobufError::message_not_initialized(
-                self.descriptor().name(),
-            ))
+            Err(ProtobufError::MessageNotInitialized(Self::NAME.to_owned()).into())
         } else {
             Ok(())
         }
     }
 
     /// Write the message to the writer.
-    fn write_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()> {
+    fn write_to_writer(&self, w: &mut dyn Write) -> crate::Result<()> {
         w.with_coded_output_stream(|os| self.write_to(os))
     }
 
     /// Write the message to bytes vec.
-    fn write_to_vec(&self, v: &mut Vec<u8>) -> ProtobufResult<()> {
+    fn write_to_vec(&self, v: &mut Vec<u8>) -> crate::Result<()> {
         v.with_coded_output_stream(|os| self.write_to(os))
     }
 
     /// Write the message to bytes vec.
-    fn write_to_bytes(&self) -> ProtobufResult<Vec<u8>> {
+    ///
+    /// > **Note**: You can use [`Message::parse_from_bytes`]
+    /// to do the reverse.
+    fn write_to_bytes(&self) -> crate::Result<Vec<u8>> {
         self.check_initialized()?;
 
         let size = self.compute_size() as usize;
         let mut v = Vec::with_capacity(size);
-        // skip zerofill
-        unsafe {
-            v.set_len(size);
-        }
-        {
-            let mut os = CodedOutputStream::bytes(&mut v);
-            self.write_to_with_cached_sizes(&mut os)?;
-            os.check_eof();
-        }
+        let mut os = CodedOutputStream::vec(&mut v);
+        self.write_to_with_cached_sizes(&mut os)?;
+        os.flush()?;
+        drop(os);
         Ok(v)
     }
 
     /// Write the message to the writer, prepend the message with message length
     /// encoded as varint.
-    fn write_length_delimited_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()> {
+    fn write_length_delimited_to_writer(&self, w: &mut dyn Write) -> crate::Result<()> {
         w.with_coded_output_stream(|os| self.write_length_delimited_to(os))
     }
 
     /// Write the message to the bytes vec, prepend the message with message length
     /// encoded as varint.
-    fn write_length_delimited_to_bytes(&self) -> ProtobufResult<Vec<u8>> {
-        with_coded_output_stream_to_bytes(|os| self.write_length_delimited_to(os))
+    fn write_length_delimited_to_bytes(&self) -> crate::Result<Vec<u8>> {
+        let mut v = Vec::new();
+        v.with_coded_output_stream(|os| self.write_length_delimited_to(os))?;
+        Ok(v)
     }
 
+    /// Special fields (unknown fields and cached size).
+    fn special_fields(&self) -> &SpecialFields;
+    /// Special fields (unknown fields and cached size).
+    fn mut_special_fields(&mut self) -> &mut SpecialFields;
+
     /// Get a reference to unknown fields.
-    fn get_unknown_fields<'s>(&'s self) -> &'s UnknownFields;
+    fn unknown_fields(&self) -> &UnknownFields {
+        &self.special_fields().unknown_fields()
+    }
     /// Get a mutable reference to unknown fields.
-    fn mut_unknown_fields<'s>(&'s mut self) -> &'s mut UnknownFields;
-
-    /// Get type id for downcasting.
-    fn type_id(&self) -> TypeId {
-        TypeId::of::<Self>()
+    fn mut_unknown_fields(&mut self) -> &mut UnknownFields {
+        self.mut_special_fields().mut_unknown_fields()
     }
 
-    /// View self as `Any`.
-    fn as_any(&self) -> &dyn Any;
-
-    /// View self as mutable `Any`.
-    fn as_any_mut(&mut self) -> &mut dyn Any {
-        panic!()
-    }
-
-    /// Convert boxed self to boxed `Any`.
-    fn into_any(self: Box<Self>) -> Box<dyn Any> {
-        panic!()
-    }
-
-    // Rust does not allow implementation of trait for trait:
-    // impl<M : Message> fmt::Debug for M {
-    // ...
-    // }
-
     /// Create an empty message object.
     ///
-    ///
     /// ```
-    /// # use protobuf::Message;
-    /// # fn foo<MyMessage: Message>() {
+    /// # use protobuf::MessageFull;
+    /// # fn foo<MyMessage: MessageFull>() {
     /// let m = MyMessage::new();
     /// # }
     /// ```
-    fn new() -> Self
-    where
-        Self: Sized;
+    fn new() -> Self;
 
-    /// Get message descriptor for message type.
-    ///
-    /// ```
-    /// # use protobuf::Message;
-    /// # fn foo<MyMessage: Message>() {
-    /// let descriptor = MyMessage::descriptor_static();
-    /// assert_eq!("MyMessage", descriptor.name());
-    /// # }
-    /// ```
-    fn descriptor_static() -> &'static MessageDescriptor
-    where
-        Self: Sized,
-    {
-        panic!(
-            "descriptor_static is not implemented for message, \
-             LITE_RUNTIME must be used"
-        );
+    /// Reset all fields.
+    fn clear(&mut self) {
+        *self = Self::new();
     }
 
     /// Return a pointer to default immutable message with static lifetime.
     ///
     /// ```
-    /// # use protobuf::Message;
-    /// # fn foo<MyMessage: Message>() {
+    /// # use protobuf::MessageFull;
+    /// # fn foo<MyMessage: MessageFull>() {
     /// let m: &MyMessage = MyMessage::default_instance();
     /// # }
     /// ```
-    fn default_instance() -> &'static Self
-    where
-        Self: Sized;
-}
-
-pub fn message_down_cast<'a, M: Message + 'a>(m: &'a dyn Message) -> &'a M {
-    m.as_any().downcast_ref::<M>().unwrap()
-}
-
-/// Parse message from reader.
-/// Parse stops on EOF or when error encountered.
-#[deprecated(since = "2.19", note = "Use Message::parse_from_reader instead")]
-pub fn parse_from_reader<M: Message>(reader: &mut dyn Read) -> ProtobufResult<M> {
-    M::parse_from_reader(reader)
-}
-
-/// Parse message from byte array.
-#[deprecated(since = "2.19", note = "Use Message::parse_from_bytes instead")]
-pub fn parse_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M> {
-    M::parse_from_bytes(bytes)
-}
-
-/// Parse message from `Bytes` object.
-/// Resulting message may share references to the passed bytes object.
-#[cfg(feature = "bytes")]
-#[deprecated(
-    since = "2.19",
-    note = "Use Message::parse_from_carllerche_bytes instead"
-)]
-pub fn parse_from_carllerche_bytes<M: Message>(bytes: &Bytes) -> ProtobufResult<M> {
-    M::parse_from_carllerche_bytes(bytes)
-}
-
-/// Parse length-delimited message from stream.
-///
-/// Read varint length first, and read messages of that length then.
-///
-/// This function is deprecated and will be removed in the next major release.
-#[deprecated]
-pub fn parse_length_delimited_from<M: Message>(is: &mut CodedInputStream) -> ProtobufResult<M> {
-    is.read_message::<M>()
-}
-
-/// Parse length-delimited message from `Read`.
-///
-/// This function is deprecated and will be removed in the next major release.
-#[deprecated]
-pub fn parse_length_delimited_from_reader<M: Message>(r: &mut dyn Read) -> ProtobufResult<M> {
-    // TODO: wrong: we may read length first, and then read exact number of bytes needed
-    r.with_coded_input_stream(|is| is.read_message::<M>())
-}
-
-/// Parse length-delimited message from bytes.
-///
-/// This function is deprecated and will be removed in the next major release.
-#[deprecated]
-pub fn parse_length_delimited_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M> {
-    bytes.with_coded_input_stream(|is| is.read_message::<M>())
+    fn default_instance() -> &'static Self;
 }
diff --git a/src/message_dyn.rs b/src/message_dyn.rs
new file mode 100644
index 0000000..1b8c36b
--- /dev/null
+++ b/src/message_dyn.rs
@@ -0,0 +1,299 @@
+use std::any::Any;
+use std::any::TypeId;
+use std::fmt;
+use std::io::Write;
+
+use crate::coded_output_stream::with::WithCodedOutputStream;
+use crate::error::ProtobufError;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ReflectEqMode;
+use crate::wire_format::check_message_size;
+use crate::CodedInputStream;
+use crate::CodedOutputStream;
+use crate::MessageFull;
+use crate::SpecialFields;
+use crate::UnknownFields;
+
+/// Dynamic-dispatch version of either generated message or dynamic message.
+///
+/// Generated messages implement [`MessageFull`](crate::MessageFull) unless lite runtime requested.
+/// Dynamic messages can be created with
+/// [`FileDescriptor::new_dynamic`](crate::reflect::FileDescriptor::new_dynamic).
+pub trait MessageDyn: Any + fmt::Debug + fmt::Display + Send + Sync + 'static {
+    /// Message descriptor for this message, used for reflection.
+    fn descriptor_dyn(&self) -> MessageDescriptor;
+
+    /// Update this message fields with contents of given stream.
+    fn merge_from_dyn(&mut self, is: &mut CodedInputStream) -> crate::Result<()>;
+
+    /// Write the message.
+    fn write_to_with_cached_sizes_dyn(&self, os: &mut CodedOutputStream) -> crate::Result<()>;
+
+    /// Compute (and cache) the message size.
+    fn compute_size_dyn(&self) -> u64;
+
+    /// True iff all required fields are initialized.
+    /// Always returns `true` for protobuf 3.
+    fn is_initialized_dyn(&self) -> bool;
+
+    /// Get a reference to special fields.
+    fn special_fields_dyn(&self) -> &SpecialFields;
+    /// Get a mutable reference to special fields.
+    fn mut_special_fields_dyn(&mut self) -> &mut SpecialFields;
+}
+
+impl<M: MessageFull> MessageDyn for M {
+    fn descriptor_dyn(&self) -> MessageDescriptor {
+        M::descriptor()
+    }
+
+    fn merge_from_dyn(&mut self, is: &mut CodedInputStream) -> crate::Result<()> {
+        self.merge_from(is)
+    }
+
+    fn write_to_with_cached_sizes_dyn(&self, os: &mut CodedOutputStream) -> crate::Result<()> {
+        self.write_to_with_cached_sizes(os)
+    }
+
+    fn compute_size_dyn(&self) -> u64 {
+        self.compute_size()
+    }
+
+    fn is_initialized_dyn(&self) -> bool {
+        self.is_initialized()
+    }
+
+    fn special_fields_dyn(&self) -> &SpecialFields {
+        self.special_fields()
+    }
+
+    fn mut_special_fields_dyn(&mut self) -> &mut SpecialFields {
+        self.mut_special_fields()
+    }
+}
+
+impl dyn MessageDyn {
+    /// Check if all required fields of this object are initialized.
+    pub fn check_initialized_dyn(&self) -> crate::Result<()> {
+        if !self.is_initialized_dyn() {
+            Err(
+                ProtobufError::MessageNotInitialized(self.descriptor_dyn().name().to_owned())
+                    .into(),
+            )
+        } else {
+            Ok(())
+        }
+    }
+
+    /// Write the message to the writer.
+    pub fn write_to_writer_dyn(&self, w: &mut dyn Write) -> crate::Result<()> {
+        w.with_coded_output_stream(|os| self.write_to_dyn(os))
+    }
+
+    /// Write the message to bytes vec.
+    pub fn write_to_vec_dyn(&self, v: &mut Vec<u8>) -> crate::Result<()> {
+        v.with_coded_output_stream(|os| self.write_to_dyn(os))
+    }
+
+    /// Write the message to the stream.
+    ///
+    /// Results in error if message is not fully initialized.
+    pub fn write_to_dyn(&self, os: &mut CodedOutputStream) -> crate::Result<()> {
+        self.check_initialized_dyn()?;
+
+        // cache sizes
+        let size = self.compute_size_dyn();
+        let size = check_message_size(size)?;
+        os.reserve_additional(size, self.descriptor_dyn().name())?;
+        self.write_to_with_cached_sizes_dyn(os)?;
+
+        Ok(())
+    }
+
+    /// Write the message to the vec, prepend the message with message length
+    /// encoded as varint.
+    pub fn write_length_delimited_to_vec_dyn(&self, vec: &mut Vec<u8>) -> crate::Result<()> {
+        let mut os = CodedOutputStream::vec(vec);
+        self.write_length_delimited_to_dyn(&mut os)?;
+        os.flush()?;
+        Ok(())
+    }
+
+    /// Update this message object with fields read from given stream.
+    pub fn merge_from_bytes_dyn(&mut self, bytes: &[u8]) -> crate::Result<()> {
+        let mut is = CodedInputStream::from_bytes(bytes);
+        self.merge_from_dyn(&mut is)
+    }
+
+    /// Write the message to bytes vec.
+    ///
+    /// > **Note**: You can use [`Message::parse_from_bytes`](crate::Message::parse_from_bytes)
+    /// to do the reverse.
+    pub fn write_to_bytes_dyn(&self) -> crate::Result<Vec<u8>> {
+        self.check_initialized_dyn()?;
+
+        let size = self.compute_size_dyn();
+        let size = check_message_size(size)?;
+        let mut v = Vec::new();
+        let mut os = CodedOutputStream::vec(&mut v);
+        os.reserve_additional(size, self.descriptor_dyn().name())?;
+        self.write_to_with_cached_sizes_dyn(&mut os)?;
+        os.flush()?;
+        drop(os);
+        Ok(v)
+    }
+
+    /// Write the message to the stream prepending the message with message length
+    /// encoded as varint.
+    pub fn write_length_delimited_to_dyn(&self, os: &mut CodedOutputStream) -> crate::Result<()> {
+        let size = self.compute_size_dyn();
+        let size = check_message_size(size)?;
+        os.reserve_additional_for_length_delimited(size, self.descriptor_dyn().name())?;
+        os.write_raw_varint32(size)?;
+
+        let pos = os.total_bytes_written();
+
+        self.write_to_with_cached_sizes_dyn(os)?;
+
+        // Cheap self-check.
+        assert_eq!(os.total_bytes_written() - pos, size as u64);
+
+        Ok(())
+    }
+
+    /// Write the message to the writer, prepend the message with message length
+    /// encoded as varint.
+    pub fn write_length_delimited_to_writer_dyn(&self, w: &mut dyn Write) -> crate::Result<()> {
+        w.with_coded_output_stream(|os| self.write_length_delimited_to_dyn(os))
+    }
+
+    /// Write the message to the bytes vec, prepend the message with message length
+    /// encoded as varint.
+    pub fn write_length_delimited_to_bytes_dyn(&self) -> crate::Result<Vec<u8>> {
+        let mut v = Vec::new();
+        v.with_coded_output_stream(|os| self.write_length_delimited_to_dyn(os))?;
+        Ok(v)
+    }
+
+    /// Get a reference to unknown fields.
+    pub fn unknown_fields_dyn(&self) -> &UnknownFields {
+        self.special_fields_dyn().unknown_fields()
+    }
+    /// Get a mutable reference to unknown fields.
+    pub fn mut_unknown_fields_dyn(&mut self) -> &mut UnknownFields {
+        self.mut_special_fields_dyn().mut_unknown_fields()
+    }
+
+    /// Downcast `Box<dyn Message>` to specific message type.
+    ///
+    /// ```
+    /// # use protobuf::{MessageFull, MessageDyn};
+    /// # fn foo<MyMessage: MessageFull>(message: Box<dyn MessageDyn>) {
+    /// let m: Box<dyn MessageDyn> = message;
+    /// let m: Box<MyMessage> = <dyn MessageDyn>::downcast_box(m).unwrap();
+    /// # }
+    /// ```
+    pub fn downcast_box<T: Any>(
+        self: Box<dyn MessageDyn>,
+    ) -> std::result::Result<Box<T>, Box<dyn MessageDyn>> {
+        if Any::type_id(&*self) == TypeId::of::<T>() {
+            unsafe {
+                let raw: *mut dyn MessageDyn = Box::into_raw(self);
+                Ok(Box::from_raw(raw as *mut T))
+            }
+        } else {
+            Err(self)
+        }
+    }
+
+    /// Downcast `&dyn Message` to specific message type.
+    ///
+    /// ```
+    /// # use protobuf::{MessageFull, MessageDyn};
+    /// # fn foo<MyMessage: MessageFull>(message: &dyn MessageDyn) {
+    /// let m: &dyn MessageDyn = message;
+    /// let m: &MyMessage = <dyn MessageDyn>::downcast_ref(m).unwrap();
+    /// # }
+    /// ```
+    pub fn downcast_ref<'a, M: MessageFull + 'a>(&'a self) -> Option<&'a M> {
+        if Any::type_id(&*self) == TypeId::of::<M>() {
+            unsafe { Some(&*(self as *const dyn MessageDyn as *const M)) }
+        } else {
+            None
+        }
+    }
+
+    /// Downcast `&mut dyn Message` to specific message type.
+    ///
+    /// ```
+    /// # use protobuf::{MessageFull, MessageDyn};
+    /// # fn foo<MyMessage: MessageFull>(message: &mut dyn MessageDyn) {
+    /// let m: &mut dyn MessageDyn = message;
+    /// let m: &mut MyMessage = <dyn MessageDyn>::downcast_mut(m).unwrap();
+    /// # }
+    /// ```
+    pub fn downcast_mut<'a, M: MessageFull + 'a>(&'a mut self) -> Option<&'a mut M> {
+        if Any::type_id(&*self) == TypeId::of::<M>() {
+            unsafe { Some(&mut *(self as *mut dyn MessageDyn as *mut M)) }
+        } else {
+            None
+        }
+    }
+
+    /// Clone from a `dyn Message` reference.
+    pub fn clone_box(&self) -> Box<dyn MessageDyn> {
+        self.descriptor_dyn().clone_message(self)
+    }
+
+    /// Reflectively compare the messages.
+    pub fn reflect_eq_dyn(&self, other: &dyn MessageDyn, mode: &ReflectEqMode) -> bool {
+        MessageDescriptor::reflect_eq_maybe_unrelated(self, other, mode)
+    }
+}
+
+impl Clone for Box<dyn MessageDyn> {
+    fn clone(&self) -> Self {
+        (*self).clone_box()
+    }
+}
+
+impl PartialEq for Box<dyn MessageDyn> {
+    fn eq(&self, other: &Box<dyn MessageDyn>) -> bool {
+        MessageDescriptor::reflect_eq_maybe_unrelated(&**self, &**other, &ReflectEqMode::default())
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use crate::descriptor::FileDescriptorProto;
+    use crate::MessageDyn;
+
+    #[test]
+    fn downcast_ref() {
+        let m = FileDescriptorProto::new();
+        let d = &m as &dyn MessageDyn;
+        let c: &FileDescriptorProto = d.downcast_ref().unwrap();
+        assert_eq!(
+            c as *const FileDescriptorProto,
+            &m as *const FileDescriptorProto
+        );
+    }
+
+    #[test]
+    fn downcast_mut() {
+        let mut m = FileDescriptorProto::new();
+        let d = &mut m as &mut dyn MessageDyn;
+        let c: &mut FileDescriptorProto = d.downcast_mut().unwrap();
+        assert_eq!(
+            c as *const FileDescriptorProto,
+            &m as *const FileDescriptorProto
+        );
+    }
+
+    #[test]
+    fn downcast_box() {
+        let m = FileDescriptorProto::new();
+        let d: Box<dyn MessageDyn> = Box::new(m);
+        let mut _c: Box<FileDescriptorProto> = d.downcast_box().unwrap();
+    }
+}
diff --git a/src/message_field.rs b/src/message_field.rs
new file mode 100644
index 0000000..c7b4637
--- /dev/null
+++ b/src/message_field.rs
@@ -0,0 +1,210 @@
+use std::default::Default;
+use std::hash::Hash;
+use std::ops::Deref;
+use std::option;
+
+use crate::Message;
+
+/// Wrapper around `Option<Box<T>>`, convenient newtype.
+///
+/// # Examples
+///
+/// ```no_run
+/// # use protobuf::MessageField;
+/// # use std::ops::Add;
+/// # struct Address {
+/// # }
+/// # struct Customer {
+/// #     address: MessageField<Address>,
+/// # }
+/// # impl Customer {
+/// #     fn new() -> Customer { unimplemented!() }
+/// # }
+/// #
+/// #
+/// # fn make_address() -> Address { unimplemented!() }
+/// let mut customer = Customer::new();
+///
+/// // field of type `SingularPtrField` can be initialized like this
+/// customer.address = MessageField::some(make_address());
+/// // or using `Option` and `Into`
+/// customer.address = Some(make_address()).into();
+/// ```
+#[derive(Clone, Debug, Eq, PartialEq, Hash)]
+pub struct MessageField<T>(pub Option<Box<T>>);
+
+impl<T> MessageField<T> {
+    /// Construct `SingularPtrField` from given object.
+    #[inline]
+    pub fn some(value: T) -> MessageField<T> {
+        MessageField(Some(Box::new(value)))
+    }
+
+    /// Construct an empty `SingularPtrField`.
+    #[inline]
+    pub const fn none() -> MessageField<T> {
+        MessageField(None)
+    }
+
+    /// Construct `SingularPtrField` from optional.
+    #[inline]
+    pub fn from_option(option: Option<T>) -> MessageField<T> {
+        match option {
+            Some(x) => MessageField::some(x),
+            None => MessageField::none(),
+        }
+    }
+
+    /// True iff this object contains data.
+    #[inline]
+    pub fn is_some(&self) -> bool {
+        self.0.is_some()
+    }
+
+    /// True iff this object contains no data.
+    #[inline]
+    pub fn is_none(&self) -> bool {
+        self.0.is_none()
+    }
+
+    /// Convert into `Option<T>`.
+    #[inline]
+    pub fn into_option(self) -> Option<T> {
+        self.0.map(|v| *v)
+    }
+
+    /// View data as reference option.
+    #[inline]
+    pub fn as_ref(&self) -> Option<&T> {
+        self.0.as_ref().map(|v| &**v)
+    }
+
+    /// View data as mutable reference option.
+    #[inline]
+    pub fn as_mut(&mut self) -> Option<&mut T> {
+        self.0.as_mut().map(|v| &mut **v)
+    }
+
+    /// Take the data.
+    /// Panics if empty
+    #[inline]
+    pub fn unwrap(self) -> T {
+        *self.0.unwrap()
+    }
+
+    /// Take the data or return supplied default element if empty.
+    #[inline]
+    pub fn unwrap_or(self, def: T) -> T {
+        self.0.map(|v| *v).unwrap_or(def)
+    }
+
+    /// Take the data or return supplied default element if empty.
+    #[inline]
+    pub fn unwrap_or_else<F>(self, f: F) -> T
+    where
+        F: FnOnce() -> T,
+    {
+        self.0.map(|v| *v).unwrap_or_else(f)
+    }
+
+    /// Apply given function to contained data to construct another `SingularPtrField`.
+    /// Returns empty `SingularPtrField` if this object is empty.
+    #[inline]
+    pub fn map<U, F>(self, f: F) -> MessageField<U>
+    where
+        F: FnOnce(T) -> U,
+    {
+        MessageField::from_option(self.into_option().map(f))
+    }
+
+    /// View data as iterator.
+    #[inline]
+    pub fn iter(&self) -> option::IntoIter<&T> {
+        self.as_ref().into_iter()
+    }
+
+    /// View data as mutable iterator.
+    #[inline]
+    pub fn mut_iter(&mut self) -> option::IntoIter<&mut T> {
+        self.as_mut().into_iter()
+    }
+
+    /// Take data as option, leaving this object empty.
+    #[inline]
+    pub fn take(&mut self) -> Option<T> {
+        self.0.take().map(|v| *v)
+    }
+
+    /// Clear this object, but do not call destructor of underlying data.
+    #[inline]
+    pub fn clear(&mut self) {
+        self.0 = None;
+    }
+}
+
+impl<T: Default> MessageField<T> {
+    /// Get contained data, consume self. Return default value for type if this is empty.
+    #[inline]
+    pub fn unwrap_or_default(self) -> T {
+        *self.0.unwrap_or_default()
+    }
+}
+
+impl<M: Message> MessageField<M> {
+    /// Get a reference to contained value or a default instance.
+    pub fn get_or_default(&self) -> &M {
+        self.as_ref().unwrap_or_else(|| M::default_instance())
+    }
+
+    /// Get a mutable reference to contained value, initialize if not initialized yet.
+    pub fn mut_or_insert_default(&mut self) -> &mut M {
+        if self.is_none() {
+            *self = MessageField::some(Default::default());
+        }
+        self.as_mut().unwrap()
+    }
+}
+
+/// Get a reference to contained value or a default instance if the field is not initialized.
+impl<M: Message> Deref for MessageField<M> {
+    type Target = M;
+
+    fn deref(&self) -> &Self::Target {
+        self.get_or_default()
+    }
+}
+
+/// Get a mutable reference to the message **and** initialize the message if not initialized yet.
+///
+/// Note that part about initializing is not conventional.
+/// Generally `DerefMut` is not supposed to modify the state.
+#[cfg(no)]
+impl<M: Message> DerefMut for MessageField<M> {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        self.mut_or_insert_default()
+    }
+}
+
+impl<T> Default for MessageField<T> {
+    #[inline]
+    fn default() -> MessageField<T> {
+        MessageField::none()
+    }
+}
+
+/// We don't have `From<Option<Box<T>>> for MessageField<T>` because
+/// it would make type inference worse.
+impl<T> From<Option<T>> for MessageField<T> {
+    fn from(o: Option<T>) -> Self {
+        MessageField::from_option(o)
+    }
+}
+
+impl<'a, T> IntoIterator for &'a MessageField<T> {
+    type Item = &'a T;
+    type IntoIter = option::IntoIter<&'a T>;
+
+    fn into_iter(self) -> option::IntoIter<&'a T> {
+        self.iter()
+    }
+}
diff --git a/src/message_full.rs b/src/message_full.rs
new file mode 100644
index 0000000..c6258c1
--- /dev/null
+++ b/src/message_full.rs
@@ -0,0 +1,47 @@
+use std::fmt;
+
+use crate::message_dyn::MessageDyn;
+use crate::reflect::reflect_eq::ReflectEqMode;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ProtobufValue;
+use crate::Message;
+
+/// Trait implemented for all the generated messages, except when lite runtime is enabled.
+///
+/// When lite runtime is enabled, only `MessageLite` is implemented.
+///
+/// * Generated messages are generated from `.proto` files
+/// * Dynamic messages can be created without code generation using only parsed proto files
+///   (see [FileDescriptor::new_dynamic](crate::reflect::FileDescriptor::new_dynamic)).
+///
+/// Also, generated messages implement `Default + PartialEq`
+///
+/// This trait is sized, there's accompanying [`MessageDyn`](crate::MessageDyn) trait
+/// which is implemented for all messages which can be used in functions
+/// without making message a function type parameter.
+///
+/// ## `Display`
+///
+/// [`Display`](fmt::Display) implementation for messages does protobuf text format.
+/// See [`text_format`](crate::text_format) for more details.
+pub trait MessageFull: Message + ProtobufValue + fmt::Debug + fmt::Display {
+    /// Get message descriptor for message type.
+    ///
+    /// ```
+    /// # use protobuf::MessageFull;
+    /// # fn foo<MyMessage: MessageFull>() {
+    /// let descriptor = MyMessage::descriptor();
+    /// assert_eq!("MyMessage", descriptor.name());
+    /// # }
+    /// ```
+    fn descriptor() -> MessageDescriptor;
+
+    /// Reflective equality.
+    ///
+    /// # See also
+    ///
+    /// [`dyn Message::reflect_eq_dyn()`], `dyn` version of this function.
+    fn reflect_eq(&self, other: &Self, mode: &ReflectEqMode) -> bool {
+        <dyn MessageDyn>::reflect_eq_dyn(self, other, mode)
+    }
+}
diff --git a/src/misc.rs b/src/misc.rs
index faef34f..303ecc8 100644
--- a/src/misc.rs
+++ b/src/misc.rs
@@ -1,17 +1,7 @@
 use std::mem;
 use std::mem::MaybeUninit;
-use std::slice;
 
-/// `Vec::spare_capacity_mut` is not stable until Rust 1.60.
-pub(crate) fn vec_spare_capacity_mut<A>(vec: &mut Vec<A>) -> &mut [MaybeUninit<A>] {
-    // SAFETY: copy-paste from rust stdlib.
-    unsafe {
-        slice::from_raw_parts_mut(
-            vec.as_mut_ptr().add(vec.len()) as *mut MaybeUninit<A>,
-            vec.capacity() - vec.len(),
-        )
-    }
-}
+use crate::well_known_types;
 
 /// `MaybeUninit::write_slice` is not stable.
 pub(crate) fn maybe_uninit_write_slice<'a, T>(
@@ -43,10 +33,142 @@
     (&array as *const _ as *const [T; N]).read()
 }
 
-/// `MaybeUninit::write` is stable since 1.55.
-#[inline]
-pub(crate) fn maybe_uninit_write<T>(uninit: &mut MaybeUninit<T>, val: T) -> &mut T {
-    // SAFETY: copy-paste from rust stdlib.
-    *uninit = MaybeUninit::new(val);
-    unsafe { &mut *uninit.as_mut_ptr() }
+// bool <-> BoolValue
+
+impl From<well_known_types::wrappers::BoolValue> for bool {
+    fn from(inner: well_known_types::wrappers::BoolValue) -> Self {
+        inner.value
+    }
+}
+
+impl From<bool> for well_known_types::wrappers::BoolValue {
+    fn from(inner: bool) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// Vec<u8> <-> BytesValue
+
+impl From<well_known_types::wrappers::BytesValue> for Vec<u8> {
+    fn from(inner: well_known_types::wrappers::BytesValue) -> Self {
+        inner.value
+    }
+}
+
+impl From<Vec<u8>> for well_known_types::wrappers::BytesValue {
+    fn from(inner: Vec<u8>) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// f64 <-> DoubleValue
+
+impl From<well_known_types::wrappers::DoubleValue> for f64 {
+    fn from(inner: well_known_types::wrappers::DoubleValue) -> Self {
+        inner.value
+    }
+}
+
+impl From<f64> for well_known_types::wrappers::DoubleValue {
+    fn from(inner: f64) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// f32 <-> FloatValue
+
+impl From<well_known_types::wrappers::FloatValue> for f32 {
+    fn from(inner: well_known_types::wrappers::FloatValue) -> Self {
+        inner.value
+    }
+}
+
+impl From<f32> for well_known_types::wrappers::FloatValue {
+    fn from(inner: f32) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// i32 <-> Int32Value
+
+impl From<well_known_types::wrappers::Int32Value> for i32 {
+    fn from(inner: well_known_types::wrappers::Int32Value) -> Self {
+        inner.value
+    }
+}
+
+impl From<i32> for well_known_types::wrappers::Int32Value {
+    fn from(inner: i32) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// i64 <-> Int64Value
+
+impl From<well_known_types::wrappers::Int64Value> for i64 {
+    fn from(inner: well_known_types::wrappers::Int64Value) -> Self {
+        inner.value
+    }
+}
+
+impl From<i64> for well_known_types::wrappers::Int64Value {
+    fn from(inner: i64) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// u32 <-> UInt32Value
+
+impl From<well_known_types::wrappers::UInt32Value> for u32 {
+    fn from(inner: well_known_types::wrappers::UInt32Value) -> Self {
+        inner.value
+    }
+}
+
+impl From<u32> for well_known_types::wrappers::UInt32Value {
+    fn from(inner: u32) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// u64 <-> UInt64Value
+
+impl From<well_known_types::wrappers::UInt64Value> for u64 {
+    fn from(inner: well_known_types::wrappers::UInt64Value) -> Self {
+        inner.value
+    }
+}
+
+impl From<u64> for well_known_types::wrappers::UInt64Value {
+    fn from(inner: u64) -> Self {
+        let mut value = Self::new();
+        value.value = inner;
+        value
+    }
+}
+
+// () <-> Empty
+
+impl From<well_known_types::empty::Empty> for () {
+    fn from(_inner: well_known_types::empty::Empty) -> Self {}
+}
+
+impl From<()> for well_known_types::empty::Empty {
+    fn from(_inner: ()) -> Self {
+        Self::new()
+    }
 }
diff --git a/src/oneof.rs b/src/oneof.rs
new file mode 100644
index 0000000..6f527b8
--- /dev/null
+++ b/src/oneof.rs
@@ -0,0 +1,2 @@
+/// Trait implemented by all oneof types in generated code.
+pub trait Oneof {}
diff --git a/src/oneof_full.rs b/src/oneof_full.rs
new file mode 100644
index 0000000..4bd8466
--- /dev/null
+++ b/src/oneof_full.rs
@@ -0,0 +1,8 @@
+use crate::reflect::OneofDescriptor;
+use crate::Oneof;
+
+/// Implemented by all oneof types when lite runtime is not enabled.
+pub trait OneofFull: Oneof {
+    /// Descriptor object for this oneof.
+    fn descriptor() -> OneofDescriptor;
+}
diff --git a/src/owning_ref.rs b/src/owning_ref.rs
new file mode 100644
index 0000000..f7d2c5f
--- /dev/null
+++ b/src/owning_ref.rs
@@ -0,0 +1,106 @@
+//! Utility similar to provided by `owning_ref` crate.
+
+use std::fmt;
+use std::fmt::Debug;
+use std::ops::Deref;
+use std::sync::Arc;
+
+enum Owner<A: 'static> {
+    Arc(Arc<A>),
+    Static(&'static A),
+}
+
+impl<A: 'static> Deref for Owner<A> {
+    type Target = A;
+
+    fn deref(&self) -> &A {
+        match self {
+            Owner::Arc(a) => &*a,
+            Owner::Static(a) => a,
+        }
+    }
+}
+
+pub(crate) struct OwningRef<A: 'static, B: 'static> {
+    owner: Owner<A>,
+    ptr: *const B,
+}
+
+unsafe impl<A: Send + Sync + 'static, B: Send + Sync + 'static> Sync for OwningRef<A, B> {}
+unsafe impl<A: Send + Sync + 'static, B: Send + Sync + 'static> Send for OwningRef<A, B> {}
+
+impl<A: 'static, B: 'static> Deref for OwningRef<A, B> {
+    type Target = B;
+
+    fn deref(&self) -> &B {
+        // SAFETY: `self.owner` owns the data and it is not movable.
+        unsafe { &*self.ptr }
+    }
+}
+
+impl<A: 'static> Clone for Owner<A> {
+    fn clone(&self) -> Owner<A> {
+        match self {
+            Owner::Arc(arc) => Owner::Arc(arc.clone()),
+            Owner::Static(ptr) => Owner::Static(ptr),
+        }
+    }
+}
+
+impl<A: 'static, B: 'static> Clone for OwningRef<A, B> {
+    fn clone(&self) -> OwningRef<A, B> {
+        OwningRef {
+            ptr: self.ptr,
+            owner: self.owner.clone(),
+        }
+    }
+}
+
+impl<A: 'static, B: fmt::Debug + 'static> Debug for OwningRef<A, B> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        Debug::fmt(&**self, f)
+    }
+}
+
+impl<A: 'static> OwningRef<A, A> {
+    pub(crate) fn new_arc(arc: Arc<A>) -> OwningRef<A, A> {
+        OwningRef {
+            ptr: Arc::as_ptr(&arc),
+            owner: Owner::Arc(arc),
+        }
+    }
+
+    pub(crate) fn new_static(ptr: &'static A) -> OwningRef<A, A> {
+        OwningRef {
+            ptr,
+            owner: Owner::Static(ptr),
+        }
+    }
+
+    pub(crate) fn owner(&self) -> &A {
+        &self.owner
+    }
+}
+
+impl<A: 'static, B: 'static> OwningRef<A, B> {
+    pub(crate) fn _map<C>(self, f: impl FnOnce(&B) -> &C) -> OwningRef<A, C> {
+        let ptr = f(&*self);
+        OwningRef {
+            ptr,
+            owner: self.owner,
+        }
+    }
+
+    pub(crate) fn flat_map_slice<'x, C, T: FnOnce(&B) -> &[C]>(
+        &self,
+        f: T,
+    ) -> impl Iterator<Item = OwningRef<A, C>> + '_
+    where
+        C: 'static,
+    {
+        f(&self).into_iter().map(|ptr| OwningRef {
+            ptr,
+            owner: self.owner.clone(),
+        })
+    }
+}
diff --git a/src/plugin.rs b/src/plugin.rs
index 93f2ca8..4251b95 100644
--- a/src/plugin.rs
+++ b/src/plugin.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,23 +16,29 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/compiler/plugin.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  The version number of protocol compiler.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.compiler.Version)
 pub struct Version {
     // message fields
-    major: ::std::option::Option<i32>,
-    minor: ::std::option::Option<i32>,
-    patch: ::std::option::Option<i32>,
-    suffix: crate::SingularField<::std::string::String>,
+    // @@protoc_insertion_point(field:google.protobuf.compiler.Version.major)
+    pub major: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:google.protobuf.compiler.Version.minor)
+    pub minor: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:google.protobuf.compiler.Version.patch)
+    pub patch: ::std::option::Option<i32>,
+    ///  A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
+    ///  be empty for mainline stable releases.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.Version.suffix)
+    pub suffix: ::std::option::Option<::std::string::String>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.compiler.Version.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Version {
@@ -47,10 +54,10 @@
 
     // optional int32 major = 1;
 
-
-    pub fn get_major(&self) -> i32 {
+    pub fn major(&self) -> i32 {
         self.major.unwrap_or(0)
     }
+
     pub fn clear_major(&mut self) {
         self.major = ::std::option::Option::None;
     }
@@ -66,10 +73,10 @@
 
     // optional int32 minor = 2;
 
-
-    pub fn get_minor(&self) -> i32 {
+    pub fn minor(&self) -> i32 {
         self.minor.unwrap_or(0)
     }
+
     pub fn clear_minor(&mut self) {
         self.minor = ::std::option::Option::None;
     }
@@ -85,10 +92,10 @@
 
     // optional int32 patch = 3;
 
-
-    pub fn get_patch(&self) -> i32 {
+    pub fn patch(&self) -> i32 {
         self.patch.unwrap_or(0)
     }
+
     pub fn clear_patch(&mut self) {
         self.patch = ::std::option::Option::None;
     }
@@ -104,15 +111,15 @@
 
     // optional string suffix = 4;
 
-
-    pub fn get_suffix(&self) -> &str {
+    pub fn suffix(&self) -> &str {
         match self.suffix.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_suffix(&mut self) {
-        self.suffix.clear();
+        self.suffix = ::std::option::Option::None;
     }
 
     pub fn has_suffix(&self) -> bool {
@@ -121,14 +128,14 @@
 
     // Param is passed by value, moved
     pub fn set_suffix(&mut self, v: ::std::string::String) {
-        self.suffix = crate::SingularField::some(v);
+        self.suffix = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_suffix(&mut self) -> &mut ::std::string::String {
         if self.suffix.is_none() {
-            self.suffix.set_default();
+            self.suffix = ::std::option::Option::Some(::std::string::String::new());
         }
         self.suffix.as_mut().unwrap()
     }
@@ -137,43 +144,62 @@
     pub fn take_suffix(&mut self) -> ::std::string::String {
         self.suffix.take().unwrap_or_else(|| ::std::string::String::new())
     }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(4);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "major",
+            |m: &Version| { &m.major },
+            |m: &mut Version| { &mut m.major },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "minor",
+            |m: &Version| { &m.minor },
+            |m: &mut Version| { &mut m.minor },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "patch",
+            |m: &Version| { &m.patch },
+            |m: &mut Version| { &mut m.patch },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "suffix",
+            |m: &Version| { &m.suffix },
+            |m: &mut Version| { &mut m.suffix },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Version>(
+            "Version",
+            fields,
+            oneofs,
+        )
+    }
 }
 
 impl crate::Message for Version {
+    const NAME: &'static str = "Version";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.major = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.major = ::std::option::Option::Some(is.read_int32()?);
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.minor = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.minor = ::std::option::Option::Some(is.read_int32()?);
                 },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.patch = ::std::option::Option::Some(tmp);
+                24 => {
+                    self.patch = ::std::option::Option::Some(is.read_int32()?);
                 },
-                4 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.suffix)?;
+                34 => {
+                    self.suffix = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -182,26 +208,26 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.major {
-            my_size += crate::rt::value_size(1, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(1, v);
         }
         if let Some(v) = self.minor {
-            my_size += crate::rt::value_size(2, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(2, v);
         }
         if let Some(v) = self.patch {
-            my_size += crate::rt::value_size(3, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(3, v);
         }
-        if let Some(ref v) = self.suffix.as_ref() {
+        if let Some(v) = self.suffix.as_ref() {
             my_size += crate::rt::string_size(4, &v);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if let Some(v) = self.major {
             os.write_int32(1, v)?;
         }
@@ -211,116 +237,97 @@
         if let Some(v) = self.patch {
             os.write_int32(3, v)?;
         }
-        if let Some(ref v) = self.suffix.as_ref() {
-            os.write_string(4, &v)?;
+        if let Some(v) = self.suffix.as_ref() {
+            os.write_string(4, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Version {
         Version::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "major",
-                |m: &Version| { &m.major },
-                |m: &mut Version| { &mut m.major },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "minor",
-                |m: &Version| { &m.minor },
-                |m: &mut Version| { &mut m.minor },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "patch",
-                |m: &Version| { &m.patch },
-                |m: &mut Version| { &mut m.patch },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "suffix",
-                |m: &Version| { &m.suffix },
-                |m: &mut Version| { &mut m.suffix },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Version>(
-                "Version",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Version {
-        static instance: crate::rt::LazyV2<Version> = crate::rt::LazyV2::INIT;
-        instance.get(Version::new)
-    }
-}
-
-impl crate::Clear for Version {
     fn clear(&mut self) {
         self.major = ::std::option::Option::None;
         self.minor = ::std::option::Option::None;
         self.patch = ::std::option::Option::None;
-        self.suffix.clear();
-        self.unknown_fields.clear();
+        self.suffix = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Version {
+        static instance: Version = Version {
+            major: ::std::option::Option::None,
+            minor: ::std::option::Option::None,
+            patch: ::std::option::Option::None,
+            suffix: ::std::option::Option::None,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Version {
+impl crate::MessageFull for Version {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Version").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Version {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Version {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  An encoded CodeGeneratorRequest is written to the plugin's stdin.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.compiler.CodeGeneratorRequest)
 pub struct CodeGeneratorRequest {
     // message fields
-    pub file_to_generate: crate::RepeatedField<::std::string::String>,
-    parameter: crate::SingularField<::std::string::String>,
-    pub proto_file: crate::RepeatedField<crate::descriptor::FileDescriptorProto>,
-    pub compiler_version: crate::SingularPtrField<Version>,
+    ///  The .proto files that were explicitly listed on the command-line.  The
+    ///  code generator should generate code only for these files.  Each file's
+    ///  descriptor will be included in proto_file, below.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+    pub file_to_generate: ::std::vec::Vec<::std::string::String>,
+    ///  The generator parameter passed on the command-line.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+    pub parameter: ::std::option::Option<::std::string::String>,
+    ///  FileDescriptorProtos for all files in files_to_generate and everything
+    ///  they import.  The files will appear in topological order, so each file
+    ///  appears before any file that imports it.
+    ///
+    ///  protoc guarantees that all proto_files will be written after
+    ///  the fields above, even though this is not technically guaranteed by the
+    ///  protobuf wire format.  This theoretically could allow a plugin to stream
+    ///  in the FileDescriptorProtos and handle them one by one rather than read
+    ///  the entire set into memory at once.  However, as of this writing, this
+    ///  is not similarly optimized on protoc's end -- it will store all fields in
+    ///  memory at once before sending them to the plugin.
+    ///
+    ///  Type names of fields and extensions in the FileDescriptorProto are always
+    ///  fully qualified.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
+    pub proto_file: ::std::vec::Vec<crate::descriptor::FileDescriptorProto>,
+    ///  The version number of protocol compiler.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorRequest.compiler_version)
+    pub compiler_version: crate::MessageField<Version>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.compiler.CodeGeneratorRequest.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a CodeGeneratorRequest {
@@ -334,42 +341,17 @@
         ::std::default::Default::default()
     }
 
-    // repeated string file_to_generate = 1;
-
-
-    pub fn get_file_to_generate(&self) -> &[::std::string::String] {
-        &self.file_to_generate
-    }
-    pub fn clear_file_to_generate(&mut self) {
-        self.file_to_generate.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_file_to_generate(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.file_to_generate = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_file_to_generate(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.file_to_generate
-    }
-
-    // Take field
-    pub fn take_file_to_generate(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.file_to_generate, crate::RepeatedField::new())
-    }
-
     // optional string parameter = 2;
 
-
-    pub fn get_parameter(&self) -> &str {
+    pub fn parameter(&self) -> &str {
         match self.parameter.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_parameter(&mut self) {
-        self.parameter.clear();
+        self.parameter = ::std::option::Option::None;
     }
 
     pub fn has_parameter(&self) -> bool {
@@ -378,14 +360,14 @@
 
     // Param is passed by value, moved
     pub fn set_parameter(&mut self, v: ::std::string::String) {
-        self.parameter = crate::SingularField::some(v);
+        self.parameter = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_parameter(&mut self) -> &mut ::std::string::String {
         if self.parameter.is_none() {
-            self.parameter.set_default();
+            self.parameter = ::std::option::Option::Some(::std::string::String::new());
         }
         self.parameter.as_mut().unwrap()
     }
@@ -395,66 +377,40 @@
         self.parameter.take().unwrap_or_else(|| ::std::string::String::new())
     }
 
-    // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
-
-
-    pub fn get_proto_file(&self) -> &[crate::descriptor::FileDescriptorProto] {
-        &self.proto_file
-    }
-    pub fn clear_proto_file(&mut self) {
-        self.proto_file.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_proto_file(&mut self, v: crate::RepeatedField<crate::descriptor::FileDescriptorProto>) {
-        self.proto_file = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_proto_file(&mut self) -> &mut crate::RepeatedField<crate::descriptor::FileDescriptorProto> {
-        &mut self.proto_file
-    }
-
-    // Take field
-    pub fn take_proto_file(&mut self) -> crate::RepeatedField<crate::descriptor::FileDescriptorProto> {
-        ::std::mem::replace(&mut self.proto_file, crate::RepeatedField::new())
-    }
-
-    // optional .google.protobuf.compiler.Version compiler_version = 3;
-
-
-    pub fn get_compiler_version(&self) -> &Version {
-        self.compiler_version.as_ref().unwrap_or_else(|| <Version as crate::Message>::default_instance())
-    }
-    pub fn clear_compiler_version(&mut self) {
-        self.compiler_version.clear();
-    }
-
-    pub fn has_compiler_version(&self) -> bool {
-        self.compiler_version.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_compiler_version(&mut self, v: Version) {
-        self.compiler_version = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_compiler_version(&mut self) -> &mut Version {
-        if self.compiler_version.is_none() {
-            self.compiler_version.set_default();
-        }
-        self.compiler_version.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_compiler_version(&mut self) -> Version {
-        self.compiler_version.take().unwrap_or_else(|| Version::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(4);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "file_to_generate",
+            |m: &CodeGeneratorRequest| { &m.file_to_generate },
+            |m: &mut CodeGeneratorRequest| { &mut m.file_to_generate },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "parameter",
+            |m: &CodeGeneratorRequest| { &m.parameter },
+            |m: &mut CodeGeneratorRequest| { &mut m.parameter },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "proto_file",
+            |m: &CodeGeneratorRequest| { &m.proto_file },
+            |m: &mut CodeGeneratorRequest| { &mut m.proto_file },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, Version>(
+            "compiler_version",
+            |m: &CodeGeneratorRequest| { &m.compiler_version },
+            |m: &mut CodeGeneratorRequest| { &mut m.compiler_version },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<CodeGeneratorRequest>(
+            "CodeGeneratorRequest",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for CodeGeneratorRequest {
+    const NAME: &'static str = "CodeGeneratorRequest";
+
     fn is_initialized(&self) -> bool {
         for v in &self.proto_file {
             if !v.is_initialized() {
@@ -469,24 +425,23 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.file_to_generate)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.file_to_generate.push(is.read_string()?);
                 },
-                2 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.parameter)?;
+                18 => {
+                    self.parameter = ::std::option::Option::Some(is.read_string()?);
                 },
-                15 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.proto_file)?;
+                122 => {
+                    self.proto_file.push(is.read_message()?);
                 },
-                3 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.compiler_version)?;
+                26 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.compiler_version)?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -495,150 +450,117 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.file_to_generate {
             my_size += crate::rt::string_size(1, &value);
         };
-        if let Some(ref v) = self.parameter.as_ref() {
+        if let Some(v) = self.parameter.as_ref() {
             my_size += crate::rt::string_size(2, &v);
         }
         for value in &self.proto_file {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.compiler_version.as_ref() {
+        if let Some(v) = self.compiler_version.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.file_to_generate {
             os.write_string(1, &v)?;
         };
-        if let Some(ref v) = self.parameter.as_ref() {
-            os.write_string(2, &v)?;
+        if let Some(v) = self.parameter.as_ref() {
+            os.write_string(2, v)?;
         }
         for v in &self.proto_file {
-            os.write_tag(15, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(15, v, os)?;
         };
-        if let Some(ref v) = self.compiler_version.as_ref() {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.compiler_version.as_ref() {
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> CodeGeneratorRequest {
         CodeGeneratorRequest::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "file_to_generate",
-                |m: &CodeGeneratorRequest| { &m.file_to_generate },
-                |m: &mut CodeGeneratorRequest| { &mut m.file_to_generate },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "parameter",
-                |m: &CodeGeneratorRequest| { &m.parameter },
-                |m: &mut CodeGeneratorRequest| { &mut m.parameter },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::descriptor::FileDescriptorProto>>(
-                "proto_file",
-                |m: &CodeGeneratorRequest| { &m.proto_file },
-                |m: &mut CodeGeneratorRequest| { &mut m.proto_file },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<Version>>(
-                "compiler_version",
-                |m: &CodeGeneratorRequest| { &m.compiler_version },
-                |m: &mut CodeGeneratorRequest| { &mut m.compiler_version },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorRequest>(
-                "CodeGeneratorRequest",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.file_to_generate.clear();
+        self.parameter = ::std::option::Option::None;
+        self.proto_file.clear();
+        self.compiler_version.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static CodeGeneratorRequest {
-        static instance: crate::rt::LazyV2<CodeGeneratorRequest> = crate::rt::LazyV2::INIT;
-        instance.get(CodeGeneratorRequest::new)
+        static instance: CodeGeneratorRequest = CodeGeneratorRequest {
+            file_to_generate: ::std::vec::Vec::new(),
+            parameter: ::std::option::Option::None,
+            proto_file: ::std::vec::Vec::new(),
+            compiler_version: crate::MessageField::none(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for CodeGeneratorRequest {
-    fn clear(&mut self) {
-        self.file_to_generate.clear();
-        self.parameter.clear();
-        self.proto_file.clear();
-        self.compiler_version.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for CodeGeneratorRequest {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("CodeGeneratorRequest").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for CodeGeneratorRequest {
+impl ::std::fmt::Display for CodeGeneratorRequest {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for CodeGeneratorRequest {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  The plugin writes an encoded CodeGeneratorResponse to stdout.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.compiler.CodeGeneratorResponse)
 pub struct CodeGeneratorResponse {
     // message fields
-    error: crate::SingularField<::std::string::String>,
-    supported_features: ::std::option::Option<u64>,
-    pub file: crate::RepeatedField<CodeGeneratorResponse_File>,
+    ///  Error message.  If non-empty, code generation failed.  The plugin process
+    ///  should exit with status code zero even if it reports an error in this way.
+    ///
+    ///  This should be used to indicate errors in .proto files which prevent the
+    ///  code generator from generating correct code.  Errors which indicate a
+    ///  problem in protoc itself -- such as the input CodeGeneratorRequest being
+    ///  unparseable -- should be reported by writing a message to stderr and
+    ///  exiting with a non-zero status code.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.error)
+    pub error: ::std::option::Option<::std::string::String>,
+    ///  A bitmask of supported features that the code generator supports.
+    ///  This is a bitwise "or" of values from the Feature enum.
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.supported_features)
+    pub supported_features: ::std::option::Option<u64>,
+    // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.file)
+    pub file: ::std::vec::Vec<code_generator_response::File>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.compiler.CodeGeneratorResponse.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a CodeGeneratorResponse {
@@ -654,15 +576,15 @@
 
     // optional string error = 1;
 
-
-    pub fn get_error(&self) -> &str {
+    pub fn error(&self) -> &str {
         match self.error.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_error(&mut self) {
-        self.error.clear();
+        self.error = ::std::option::Option::None;
     }
 
     pub fn has_error(&self) -> bool {
@@ -671,14 +593,14 @@
 
     // Param is passed by value, moved
     pub fn set_error(&mut self, v: ::std::string::String) {
-        self.error = crate::SingularField::some(v);
+        self.error = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_error(&mut self) -> &mut ::std::string::String {
         if self.error.is_none() {
-            self.error.set_default();
+            self.error = ::std::option::Option::Some(::std::string::String::new());
         }
         self.error.as_mut().unwrap()
     }
@@ -690,10 +612,10 @@
 
     // optional uint64 supported_features = 2;
 
-
-    pub fn get_supported_features(&self) -> u64 {
+    pub fn supported_features(&self) -> u64 {
         self.supported_features.unwrap_or(0)
     }
+
     pub fn clear_supported_features(&mut self) {
         self.supported_features = ::std::option::Option::None;
     }
@@ -707,61 +629,53 @@
         self.supported_features = ::std::option::Option::Some(v);
     }
 
-    // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
-
-
-    pub fn get_file(&self) -> &[CodeGeneratorResponse_File] {
-        &self.file
-    }
-    pub fn clear_file(&mut self) {
-        self.file.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_file(&mut self, v: crate::RepeatedField<CodeGeneratorResponse_File>) {
-        self.file = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_file(&mut self) -> &mut crate::RepeatedField<CodeGeneratorResponse_File> {
-        &mut self.file
-    }
-
-    // Take field
-    pub fn take_file(&mut self) -> crate::RepeatedField<CodeGeneratorResponse_File> {
-        ::std::mem::replace(&mut self.file, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(3);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "error",
+            |m: &CodeGeneratorResponse| { &m.error },
+            |m: &mut CodeGeneratorResponse| { &mut m.error },
+        ));
+        fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
+            "supported_features",
+            |m: &CodeGeneratorResponse| { &m.supported_features },
+            |m: &mut CodeGeneratorResponse| { &mut m.supported_features },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "file",
+            |m: &CodeGeneratorResponse| { &m.file },
+            |m: &mut CodeGeneratorResponse| { &mut m.file },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<CodeGeneratorResponse>(
+            "CodeGeneratorResponse",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for CodeGeneratorResponse {
+    const NAME: &'static str = "CodeGeneratorResponse";
+
     fn is_initialized(&self) -> bool {
-        for v in &self.file {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.error)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.error = ::std::option::Option::Some(is.read_string()?);
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_uint64()?;
-                    self.supported_features = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.supported_features = ::std::option::Option::Some(is.read_uint64()?);
                 },
-                15 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.file)?;
+                122 => {
+                    self.file.push(is.read_message()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -770,504 +684,477 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.error.as_ref() {
+        if let Some(v) = self.error.as_ref() {
             my_size += crate::rt::string_size(1, &v);
         }
         if let Some(v) = self.supported_features {
-            my_size += crate::rt::value_size(2, v, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::uint64_size(2, v);
         }
         for value in &self.file {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.error.as_ref() {
-            os.write_string(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let Some(v) = self.error.as_ref() {
+            os.write_string(1, v)?;
         }
         if let Some(v) = self.supported_features {
             os.write_uint64(2, v)?;
         }
         for v in &self.file {
-            os.write_tag(15, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(15, v, os)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> CodeGeneratorResponse {
         CodeGeneratorResponse::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "error",
-                |m: &CodeGeneratorResponse| { &m.error },
-                |m: &mut CodeGeneratorResponse| { &mut m.error },
-            ));
-            fields.push(crate::reflect::accessor::make_option_accessor::<_, crate::types::ProtobufTypeUint64>(
-                "supported_features",
-                |m: &CodeGeneratorResponse| { &m.supported_features },
-                |m: &mut CodeGeneratorResponse| { &mut m.supported_features },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<CodeGeneratorResponse_File>>(
-                "file",
-                |m: &CodeGeneratorResponse| { &m.file },
-                |m: &mut CodeGeneratorResponse| { &mut m.file },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorResponse>(
-                "CodeGeneratorResponse",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.error = ::std::option::Option::None;
+        self.supported_features = ::std::option::Option::None;
+        self.file.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static CodeGeneratorResponse {
-        static instance: crate::rt::LazyV2<CodeGeneratorResponse> = crate::rt::LazyV2::INIT;
-        instance.get(CodeGeneratorResponse::new)
+        static instance: CodeGeneratorResponse = CodeGeneratorResponse {
+            error: ::std::option::Option::None,
+            supported_features: ::std::option::Option::None,
+            file: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for CodeGeneratorResponse {
-    fn clear(&mut self) {
-        self.error.clear();
-        self.supported_features = ::std::option::Option::None;
-        self.file.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for CodeGeneratorResponse {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("CodeGeneratorResponse").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for CodeGeneratorResponse {
+impl ::std::fmt::Display for CodeGeneratorResponse {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for CodeGeneratorResponse {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct CodeGeneratorResponse_File {
-    // message fields
-    name: crate::SingularField<::std::string::String>,
-    insertion_point: crate::SingularField<::std::string::String>,
-    content: crate::SingularField<::std::string::String>,
-    pub generated_code_info: crate::SingularPtrField<crate::descriptor::GeneratedCodeInfo>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a CodeGeneratorResponse_File {
-    fn default() -> &'a CodeGeneratorResponse_File {
-        <CodeGeneratorResponse_File as crate::Message>::default_instance()
-    }
-}
-
-impl CodeGeneratorResponse_File {
-    pub fn new() -> CodeGeneratorResponse_File {
-        ::std::default::Default::default()
+/// Nested message and enums of message `CodeGeneratorResponse`
+pub mod code_generator_response {
+    ///  Represents a single generated file.
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:google.protobuf.compiler.CodeGeneratorResponse.File)
+    pub struct File {
+        // message fields
+        ///  The file name, relative to the output directory.  The name must not
+        ///  contain "." or ".." components and must be relative, not be absolute (so,
+        ///  the file cannot lie outside the output directory).  "/" must be used as
+        ///  the path separator, not "\".
+        ///
+        ///  If the name is omitted, the content will be appended to the previous
+        ///  file.  This allows the generator to break large files into small chunks,
+        ///  and allows the generated text to be streamed back to protoc so that large
+        ///  files need not reside completely in memory at one time.  Note that as of
+        ///  this writing protoc does not optimize for this -- it will read the entire
+        ///  CodeGeneratorResponse before writing files to disk.
+        // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+        pub name: ::std::option::Option<::std::string::String>,
+        ///  If non-empty, indicates that the named file should already exist, and the
+        ///  content here is to be inserted into that file at a defined insertion
+        ///  point.  This feature allows a code generator to extend the output
+        ///  produced by another code generator.  The original generator may provide
+        ///  insertion points by placing special annotations in the file that look
+        ///  like:
+        ///    @@protoc_insertion_point(NAME)
+        ///  The annotation can have arbitrary text before and after it on the line,
+        ///  which allows it to be placed in a comment.  NAME should be replaced with
+        ///  an identifier naming the point -- this is what other generators will use
+        ///  as the insertion_point.  Code inserted at this point will be placed
+        ///  immediately above the line containing the insertion point (thus multiple
+        ///  insertions to the same point will come out in the order they were added).
+        ///  The double-@ is intended to make it unlikely that the generated code
+        ///  could contain things that look like insertion points by accident.
+        ///
+        ///  For example, the C++ code generator places the following line in the
+        ///  .pb.h files that it generates:
+        ///    // @@protoc_insertion_point(namespace_scope)
+        ///  This line appears within the scope of the file's package namespace, but
+        ///  outside of any particular class.  Another plugin can then specify the
+        ///  insertion_point "namespace_scope" to generate additional classes or
+        ///  other declarations that should be placed in this scope.
+        ///
+        ///  Note that if the line containing the insertion point begins with
+        ///  whitespace, the same whitespace will be added to every line of the
+        ///  inserted text.  This is useful for languages like Python, where
+        ///  indentation matters.  In these languages, the insertion point comment
+        ///  should be indented the same amount as any inserted code will need to be
+        ///  in order to work correctly in that context.
+        ///
+        ///  The code generator that generates the initial file and the one which
+        ///  inserts into it must both run as part of a single invocation of protoc.
+        ///  Code generators are executed in the order in which they appear on the
+        ///  command line.
+        ///
+        ///  If |insertion_point| is present, |name| must also be present.
+        // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+        pub insertion_point: ::std::option::Option<::std::string::String>,
+        ///  The file contents.
+        // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+        pub content: ::std::option::Option<::std::string::String>,
+        ///  Information describing the file content being inserted. If an insertion
+        ///  point is used, this information will be appropriately offset and inserted
+        ///  into the code generation metadata for the generated files.
+        // @@protoc_insertion_point(field:google.protobuf.compiler.CodeGeneratorResponse.File.generated_code_info)
+        pub generated_code_info: crate::MessageField<crate::descriptor::GeneratedCodeInfo>,
+        // special fields
+        // @@protoc_insertion_point(special_field:google.protobuf.compiler.CodeGeneratorResponse.File.special_fields)
+        pub special_fields: crate::SpecialFields,
     }
 
-    // optional string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        match self.name.as_ref() {
-            Some(v) => &v,
-            None => "",
+    impl<'a> ::std::default::Default for &'a File {
+        fn default() -> &'a File {
+            <File as crate::Message>::default_instance()
         }
     }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
 
-    pub fn has_name(&self) -> bool {
-        self.name.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        if self.name.is_none() {
-            self.name.set_default();
+    impl File {
+        pub fn new() -> File {
+            ::std::default::Default::default()
         }
-        self.name.as_mut().unwrap()
-    }
 
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        self.name.take().unwrap_or_else(|| ::std::string::String::new())
-    }
+        // optional string name = 1;
 
-    // optional string insertion_point = 2;
-
-
-    pub fn get_insertion_point(&self) -> &str {
-        match self.insertion_point.as_ref() {
-            Some(v) => &v,
-            None => "",
-        }
-    }
-    pub fn clear_insertion_point(&mut self) {
-        self.insertion_point.clear();
-    }
-
-    pub fn has_insertion_point(&self) -> bool {
-        self.insertion_point.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_insertion_point(&mut self, v: ::std::string::String) {
-        self.insertion_point = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_insertion_point(&mut self) -> &mut ::std::string::String {
-        if self.insertion_point.is_none() {
-            self.insertion_point.set_default();
-        }
-        self.insertion_point.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_insertion_point(&mut self) -> ::std::string::String {
-        self.insertion_point.take().unwrap_or_else(|| ::std::string::String::new())
-    }
-
-    // optional string content = 15;
-
-
-    pub fn get_content(&self) -> &str {
-        match self.content.as_ref() {
-            Some(v) => &v,
-            None => "",
-        }
-    }
-    pub fn clear_content(&mut self) {
-        self.content.clear();
-    }
-
-    pub fn has_content(&self) -> bool {
-        self.content.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_content(&mut self, v: ::std::string::String) {
-        self.content = crate::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_content(&mut self) -> &mut ::std::string::String {
-        if self.content.is_none() {
-            self.content.set_default();
-        }
-        self.content.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_content(&mut self) -> ::std::string::String {
-        self.content.take().unwrap_or_else(|| ::std::string::String::new())
-    }
-
-    // optional .google.protobuf.GeneratedCodeInfo generated_code_info = 16;
-
-
-    pub fn get_generated_code_info(&self) -> &crate::descriptor::GeneratedCodeInfo {
-        self.generated_code_info.as_ref().unwrap_or_else(|| <crate::descriptor::GeneratedCodeInfo as crate::Message>::default_instance())
-    }
-    pub fn clear_generated_code_info(&mut self) {
-        self.generated_code_info.clear();
-    }
-
-    pub fn has_generated_code_info(&self) -> bool {
-        self.generated_code_info.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_generated_code_info(&mut self, v: crate::descriptor::GeneratedCodeInfo) {
-        self.generated_code_info = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_generated_code_info(&mut self) -> &mut crate::descriptor::GeneratedCodeInfo {
-        if self.generated_code_info.is_none() {
-            self.generated_code_info.set_default();
-        }
-        self.generated_code_info.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_generated_code_info(&mut self) -> crate::descriptor::GeneratedCodeInfo {
-        self.generated_code_info.take().unwrap_or_else(|| crate::descriptor::GeneratedCodeInfo::new())
-    }
-}
-
-impl crate::Message for CodeGeneratorResponse_File {
-    fn is_initialized(&self) -> bool {
-        for v in &self.generated_code_info {
-            if !v.is_initialized() {
-                return false;
+        pub fn name(&self) -> &str {
+            match self.name.as_ref() {
+                Some(v) => v,
+                None => "",
             }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.insertion_point)?;
-                },
-                15 => {
-                    crate::rt::read_singular_string_into(wire_type, is, &mut self.content)?;
-                },
-                16 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.generated_code_info)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
         }
-        ::std::result::Result::Ok(())
-    }
 
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let Some(ref v) = self.name.as_ref() {
-            my_size += crate::rt::string_size(1, &v);
+        pub fn clear_name(&mut self) {
+            self.name = ::std::option::Option::None;
         }
-        if let Some(ref v) = self.insertion_point.as_ref() {
-            my_size += crate::rt::string_size(2, &v);
+
+        pub fn has_name(&self) -> bool {
+            self.name.is_some()
         }
-        if let Some(ref v) = self.content.as_ref() {
-            my_size += crate::rt::string_size(15, &v);
+
+        // Param is passed by value, moved
+        pub fn set_name(&mut self, v: ::std::string::String) {
+            self.name = ::std::option::Option::Some(v);
         }
-        if let Some(ref v) = self.generated_code_info.as_ref() {
-            let len = v.compute_size();
-            my_size += 2 + crate::rt::compute_raw_varint32_size(len) + len;
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_name(&mut self) -> &mut ::std::string::String {
+            if self.name.is_none() {
+                self.name = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.name.as_mut().unwrap()
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let Some(ref v) = self.name.as_ref() {
-            os.write_string(1, &v)?;
+        // Take field
+        pub fn take_name(&mut self) -> ::std::string::String {
+            self.name.take().unwrap_or_else(|| ::std::string::String::new())
         }
-        if let Some(ref v) = self.insertion_point.as_ref() {
-            os.write_string(2, &v)?;
+
+        // optional string insertion_point = 2;
+
+        pub fn insertion_point(&self) -> &str {
+            match self.insertion_point.as_ref() {
+                Some(v) => v,
+                None => "",
+            }
         }
-        if let Some(ref v) = self.content.as_ref() {
-            os.write_string(15, &v)?;
+
+        pub fn clear_insertion_point(&mut self) {
+            self.insertion_point = ::std::option::Option::None;
         }
-        if let Some(ref v) = self.generated_code_info.as_ref() {
-            os.write_tag(16, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+
+        pub fn has_insertion_point(&self) -> bool {
+            self.insertion_point.is_some()
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
+        // Param is passed by value, moved
+        pub fn set_insertion_point(&mut self, v: ::std::string::String) {
+            self.insertion_point = ::std::option::Option::Some(v);
+        }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_insertion_point(&mut self) -> &mut ::std::string::String {
+            if self.insertion_point.is_none() {
+                self.insertion_point = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.insertion_point.as_mut().unwrap()
+        }
 
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
+        // Take field
+        pub fn take_insertion_point(&mut self) -> ::std::string::String {
+            self.insertion_point.take().unwrap_or_else(|| ::std::string::String::new())
+        }
 
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
+        // optional string content = 15;
 
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
+        pub fn content(&self) -> &str {
+            match self.content.as_ref() {
+                Some(v) => v,
+                None => "",
+            }
+        }
 
-    fn new() -> CodeGeneratorResponse_File {
-        CodeGeneratorResponse_File::new()
-    }
+        pub fn clear_content(&mut self) {
+            self.content = ::std::option::Option::None;
+        }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+        pub fn has_content(&self) -> bool {
+            self.content.is_some()
+        }
+
+        // Param is passed by value, moved
+        pub fn set_content(&mut self, v: ::std::string::String) {
+            self.content = ::std::option::Option::Some(v);
+        }
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_content(&mut self) -> &mut ::std::string::String {
+            if self.content.is_none() {
+                self.content = ::std::option::Option::Some(::std::string::String::new());
+            }
+            self.content.as_mut().unwrap()
+        }
+
+        // Take field
+        pub fn take_content(&mut self) -> ::std::string::String {
+            self.content.take().unwrap_or_else(|| ::std::string::String::new())
+        }
+
+        pub(in super) fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+            let mut fields = ::std::vec::Vec::with_capacity(4);
+            let mut oneofs = ::std::vec::Vec::with_capacity(0);
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "name",
-                |m: &CodeGeneratorResponse_File| { &m.name },
-                |m: &mut CodeGeneratorResponse_File| { &mut m.name },
+                |m: &File| { &m.name },
+                |m: &mut File| { &mut m.name },
             ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "insertion_point",
-                |m: &CodeGeneratorResponse_File| { &m.insertion_point },
-                |m: &mut CodeGeneratorResponse_File| { &mut m.insertion_point },
+                |m: &File| { &m.insertion_point },
+                |m: &mut File| { &mut m.insertion_point },
             ));
-            fields.push(crate::reflect::accessor::make_singular_field_accessor::<_, crate::types::ProtobufTypeString>(
+            fields.push(crate::reflect::rt::v2::make_option_accessor::<_, _>(
                 "content",
-                |m: &CodeGeneratorResponse_File| { &m.content },
-                |m: &mut CodeGeneratorResponse_File| { &mut m.content },
+                |m: &File| { &m.content },
+                |m: &mut File| { &mut m.content },
             ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::descriptor::GeneratedCodeInfo>>(
+            fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, crate::descriptor::GeneratedCodeInfo>(
                 "generated_code_info",
-                |m: &CodeGeneratorResponse_File| { &m.generated_code_info },
-                |m: &mut CodeGeneratorResponse_File| { &mut m.generated_code_info },
+                |m: &File| { &m.generated_code_info },
+                |m: &mut File| { &mut m.generated_code_info },
             ));
-            crate::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorResponse_File>(
+            crate::reflect::GeneratedMessageDescriptorData::new_2::<File>(
                 "CodeGeneratorResponse.File",
                 fields,
-                file_descriptor_proto()
+                oneofs,
             )
-        })
-    }
-
-    fn default_instance() -> &'static CodeGeneratorResponse_File {
-        static instance: crate::rt::LazyV2<CodeGeneratorResponse_File> = crate::rt::LazyV2::INIT;
-        instance.get(CodeGeneratorResponse_File::new)
-    }
-}
-
-impl crate::Clear for CodeGeneratorResponse_File {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.insertion_point.clear();
-        self.content.clear();
-        self.generated_code_info.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for CodeGeneratorResponse_File {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for CodeGeneratorResponse_File {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum CodeGeneratorResponse_Feature {
-    FEATURE_NONE = 0,
-    FEATURE_PROTO3_OPTIONAL = 1,
-}
-
-impl crate::ProtobufEnum for CodeGeneratorResponse_Feature {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<CodeGeneratorResponse_Feature> {
-        match value {
-            0 => ::std::option::Option::Some(CodeGeneratorResponse_Feature::FEATURE_NONE),
-            1 => ::std::option::Option::Some(CodeGeneratorResponse_Feature::FEATURE_PROTO3_OPTIONAL),
-            _ => ::std::option::Option::None
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [CodeGeneratorResponse_Feature] = &[
-            CodeGeneratorResponse_Feature::FEATURE_NONE,
-            CodeGeneratorResponse_Feature::FEATURE_PROTO3_OPTIONAL,
+    impl crate::Message for File {
+        const NAME: &'static str = "File";
+
+        fn is_initialized(&self) -> bool {
+            true
+        }
+
+        fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    10 => {
+                        self.name = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    18 => {
+                        self.insertion_point = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    122 => {
+                        self.content = ::std::option::Option::Some(is.read_string()?);
+                    },
+                    130 => {
+                        crate::rt::read_singular_message_into_field(is, &mut self.generated_code_info)?;
+                    },
+                    tag => {
+                        crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            if let Some(v) = self.name.as_ref() {
+                my_size += crate::rt::string_size(1, &v);
+            }
+            if let Some(v) = self.insertion_point.as_ref() {
+                my_size += crate::rt::string_size(2, &v);
+            }
+            if let Some(v) = self.content.as_ref() {
+                my_size += crate::rt::string_size(15, &v);
+            }
+            if let Some(v) = self.generated_code_info.as_ref() {
+                let len = v.compute_size();
+                my_size += 2 + crate::rt::compute_raw_varint64_size(len) + len;
+            }
+            my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+            if let Some(v) = self.name.as_ref() {
+                os.write_string(1, v)?;
+            }
+            if let Some(v) = self.insertion_point.as_ref() {
+                os.write_string(2, v)?;
+            }
+            if let Some(v) = self.content.as_ref() {
+                os.write_string(15, v)?;
+            }
+            if let Some(v) = self.generated_code_info.as_ref() {
+                crate::rt::write_message_field_with_cached_size(16, v, os)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &crate::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> File {
+            File::new()
+        }
+
+        fn clear(&mut self) {
+            self.name = ::std::option::Option::None;
+            self.insertion_point = ::std::option::Option::None;
+            self.content = ::std::option::Option::None;
+            self.generated_code_info.clear();
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static File {
+            static instance: File = File {
+                name: ::std::option::Option::None,
+                insertion_point: ::std::option::Option::None,
+                content: ::std::option::Option::None,
+                generated_code_info: crate::MessageField::none(),
+                special_fields: crate::SpecialFields::new(),
+            };
+            &instance
+        }
+    }
+
+    impl crate::MessageFull for File {
+        fn descriptor() -> crate::reflect::MessageDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("CodeGeneratorResponse.File").unwrap()).clone()
+        }
+    }
+
+    impl ::std::fmt::Display for File {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+            crate::text_format::fmt(self, f)
+        }
+    }
+
+    impl crate::reflect::ProtobufValue for File {
+        type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+    }
+
+    ///  Sync with code_generator.h.
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.compiler.CodeGeneratorResponse.Feature)
+    pub enum Feature {
+        // @@protoc_insertion_point(enum_value:google.protobuf.compiler.CodeGeneratorResponse.Feature.FEATURE_NONE)
+        FEATURE_NONE = 0,
+        // @@protoc_insertion_point(enum_value:google.protobuf.compiler.CodeGeneratorResponse.Feature.FEATURE_PROTO3_OPTIONAL)
+        FEATURE_PROTO3_OPTIONAL = 1,
+    }
+
+    impl crate::Enum for Feature {
+        const NAME: &'static str = "Feature";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<Feature> {
+            match value {
+                0 => ::std::option::Option::Some(Feature::FEATURE_NONE),
+                1 => ::std::option::Option::Some(Feature::FEATURE_PROTO3_OPTIONAL),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [Feature] = &[
+            Feature::FEATURE_NONE,
+            Feature::FEATURE_PROTO3_OPTIONAL,
         ];
-        values
     }
 
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<CodeGeneratorResponse_Feature>("CodeGeneratorResponse.Feature", file_descriptor_proto())
-        })
+    impl crate::EnumFull for Feature {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("CodeGeneratorResponse.Feature").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = *self as usize;
+            Self::enum_descriptor().value_by_index(index)
+        }
     }
-}
 
-impl ::std::marker::Copy for CodeGeneratorResponse_Feature {
-}
-
-impl ::std::default::Default for CodeGeneratorResponse_Feature {
-    fn default() -> Self {
-        CodeGeneratorResponse_Feature::FEATURE_NONE
+    impl ::std::default::Default for Feature {
+        fn default() -> Self {
+            Feature::FEATURE_NONE
+        }
     }
-}
 
-impl crate::reflect::ProtobufValue for CodeGeneratorResponse_Feature {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
+    impl Feature {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<Feature>("CodeGeneratorResponse.Feature")
+        }
     }
 }
 
@@ -1515,14 +1402,36 @@
     \x14\n\r\n\x05\x04\x02\x02\x02\x03\x12\x04\xb5\x01\x17\x19\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(1);
+            deps.push(crate::descriptor::file_descriptor().clone());
+            let mut messages = ::std::vec::Vec::with_capacity(4);
+            messages.push(Version::generated_message_descriptor_data());
+            messages.push(CodeGeneratorRequest::generated_message_descriptor_data());
+            messages.push(CodeGeneratorResponse::generated_message_descriptor_data());
+            messages.push(code_generator_response::File::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(1);
+            enums.push(code_generator_response::Feature::generated_enum_descriptor_data());
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/reflect/acc/mod.rs b/src/reflect/acc/mod.rs
index 288c183..408c41c 100644
--- a/src/reflect/acc/mod.rs
+++ b/src/reflect/acc/mod.rs
@@ -1,31 +1,43 @@
-#![doc(hidden)]
+use crate::message_dyn::MessageDyn;
+use crate::reflect::acc::v2::AccessorV2;
+use crate::reflect::ReflectFieldRef;
 
-use crate::reflect::acc::v1::FieldAccessorFunctions;
-use crate::reflect::acc::v1::FieldAccessorImpl;
-use crate::reflect::acc::v1::FieldAccessorTrait;
-use crate::Message;
+pub(crate) mod v2;
 
-pub(crate) mod v1;
-
-pub(crate) enum Accessor {
-    V1(Box<dyn FieldAccessorTrait + 'static>),
+#[derive(Debug)]
+pub(crate) enum GeneratedFieldAccessor {
+    V2(AccessorV2),
 }
 
 /// Accessor object is constructed in generated code.
 /// Should not be used directly.
+#[derive(Debug)]
 pub struct FieldAccessor {
-    pub(crate) name: &'static str,
-    pub(crate) accessor: Accessor,
+    pub(crate) _name: &'static str,
+    pub(crate) accessor: GeneratedFieldAccessor,
+}
+
+impl GeneratedFieldAccessor {
+    pub(crate) fn get_reflect<'a>(&self, m: &'a dyn MessageDyn) -> ReflectFieldRef<'a> {
+        match self {
+            GeneratedFieldAccessor::V2(AccessorV2::Singular(ref a)) => {
+                ReflectFieldRef::Optional(a.accessor.get_field(m))
+            }
+            GeneratedFieldAccessor::V2(AccessorV2::Repeated(ref a)) => {
+                ReflectFieldRef::Repeated(a.accessor.get_repeated(m))
+            }
+            GeneratedFieldAccessor::V2(AccessorV2::Map(ref a)) => {
+                ReflectFieldRef::Map(a.accessor.get_reflect(m))
+            }
+        }
+    }
 }
 
 impl FieldAccessor {
-    pub(crate) fn new_v1<M: Message>(
-        name: &'static str,
-        fns: FieldAccessorFunctions<M>,
-    ) -> FieldAccessor {
+    pub(crate) fn new(name: &'static str, accessor: AccessorV2) -> FieldAccessor {
         FieldAccessor {
-            name,
-            accessor: Accessor::V1(Box::new(FieldAccessorImpl { fns })),
+            _name: name,
+            accessor: GeneratedFieldAccessor::V2(accessor),
         }
     }
 }
diff --git a/src/reflect/acc/v1.rs b/src/reflect/acc/v1.rs
deleted file mode 100644
index 4c55f8f..0000000
--- a/src/reflect/acc/v1.rs
+++ /dev/null
@@ -1,792 +0,0 @@
-#![doc(hidden)]
-
-//! Version 1 reflection accessors.
-
-use std::collections::HashMap;
-use std::fmt;
-use std::hash::Hash;
-
-use crate::enums::ProtobufEnum;
-use crate::message::message_down_cast;
-use crate::message::Message;
-use crate::reflect::map::ReflectMap;
-use crate::reflect::optional::ReflectOptional;
-use crate::reflect::repeated::ReflectRepeated;
-use crate::reflect::repeated::ReflectRepeatedEnum;
-use crate::reflect::repeated::ReflectRepeatedMessage;
-use crate::reflect::rt::FieldAccessor;
-use crate::reflect::EnumValueDescriptor;
-use crate::reflect::ProtobufValue;
-use crate::reflect::ReflectFieldRef;
-use crate::reflect::ReflectValueRef;
-use crate::repeated::RepeatedField;
-use crate::singular::SingularField;
-use crate::singular::SingularPtrField;
-use crate::types::*;
-
-/// this trait should not be used directly, use `FieldDescriptor` instead
-pub trait FieldAccessorTrait: Sync + 'static {
-    fn has_field_generic(&self, m: &dyn Message) -> bool;
-    fn len_field_generic(&self, m: &dyn Message) -> usize;
-    // TODO: should it return default value or panic on unset field?
-    fn get_message_generic<'a>(&self, m: &'a dyn Message) -> &'a dyn Message;
-    fn get_enum_generic(&self, m: &dyn Message) -> &'static EnumValueDescriptor;
-    fn get_str_generic<'a>(&self, m: &'a dyn Message) -> &'a str;
-    fn get_bytes_generic<'a>(&self, m: &'a dyn Message) -> &'a [u8];
-    fn get_u32_generic(&self, m: &dyn Message) -> u32;
-    fn get_u64_generic(&self, m: &dyn Message) -> u64;
-    fn get_i32_generic(&self, m: &dyn Message) -> i32;
-    fn get_i64_generic(&self, m: &dyn Message) -> i64;
-    fn get_bool_generic(&self, m: &dyn Message) -> bool;
-    fn get_f32_generic(&self, m: &dyn Message) -> f32;
-    fn get_f64_generic(&self, m: &dyn Message) -> f64;
-
-    fn get_reflect<'a>(&self, m: &'a dyn Message) -> ReflectFieldRef<'a>;
-}
-
-pub(crate) trait GetSingularMessage<M>: Sync {
-    fn get_message<'a>(&self, m: &'a M) -> &'a dyn Message;
-}
-
-struct GetSingularMessageImpl<M, N> {
-    get: for<'a> fn(&'a M) -> &'a N,
-}
-
-impl<M: Message, N: Message + 'static> GetSingularMessage<M> for GetSingularMessageImpl<M, N> {
-    fn get_message<'a>(&self, m: &'a M) -> &'a dyn Message {
-        (self.get)(m)
-    }
-}
-
-pub(crate) trait GetSingularEnum<M>: Sync {
-    fn get_enum(&self, m: &M) -> &'static EnumValueDescriptor;
-}
-
-struct GetSingularEnumImpl<M, E> {
-    get: fn(&M) -> E,
-}
-
-impl<M: Message, E: ProtobufEnum> GetSingularEnum<M> for GetSingularEnumImpl<M, E> {
-    fn get_enum(&self, m: &M) -> &'static EnumValueDescriptor {
-        (self.get)(m).descriptor()
-    }
-}
-
-trait GetRepeatedMessage<M>: Sync {
-    fn len_field(&self, m: &M) -> usize;
-    fn get_message_item<'a>(&self, m: &'a M, index: usize) -> &'a dyn Message;
-    fn reflect_repeated_message<'a>(&self, m: &'a M) -> Box<dyn ReflectRepeatedMessage<'a> + 'a>;
-}
-
-trait GetRepeatedEnum<M: Message + 'static>: Sync {
-    fn len_field(&self, m: &M) -> usize;
-    fn get_enum_item(&self, m: &M, index: usize) -> &'static EnumValueDescriptor;
-    fn reflect_repeated_enum<'a>(&self, m: &'a M) -> Box<dyn ReflectRepeatedEnum<'a> + 'a>;
-}
-
-pub(crate) trait GetSetCopyFns<M>: Sync {
-    fn get_field<'a>(&self, m: &'a M) -> ReflectValueRef<'a>;
-}
-
-struct GetSetCopyFnsImpl<M, V: ProtobufValue + Copy> {
-    get: fn(&M) -> V,
-    _set: fn(&mut M, V),
-}
-
-impl<M, V: ProtobufValue + Copy> GetSetCopyFns<M> for GetSetCopyFnsImpl<M, V> {
-    fn get_field<'a>(&self, m: &'a M) -> ReflectValueRef<'a> {
-        (&(self.get)(m) as &dyn ProtobufValue).as_ref_copy()
-    }
-}
-
-pub(crate) enum SingularGetSet<M> {
-    Copy(Box<dyn GetSetCopyFns<M>>),
-    String(for<'a> fn(&'a M) -> &'a str, fn(&mut M, String)),
-    Bytes(for<'a> fn(&'a M) -> &'a [u8], fn(&mut M, Vec<u8>)),
-    Enum(Box<dyn GetSingularEnum<M> + 'static>),
-    Message(Box<dyn GetSingularMessage<M> + 'static>),
-}
-
-impl<M: Message + 'static> SingularGetSet<M> {
-    fn get_ref<'a>(&self, m: &'a M) -> ReflectValueRef<'a> {
-        match self {
-            &SingularGetSet::Copy(ref copy) => copy.get_field(m),
-            &SingularGetSet::String(get, _) => ReflectValueRef::String(get(m)),
-            &SingularGetSet::Bytes(get, _) => ReflectValueRef::Bytes(get(m)),
-            &SingularGetSet::Enum(ref get) => ReflectValueRef::Enum(get.get_enum(m)),
-            &SingularGetSet::Message(ref get) => ReflectValueRef::Message(get.get_message(m)),
-        }
-    }
-}
-
-pub(crate) trait FieldAccessor2<M, R: ?Sized>: Sync
-where
-    M: Message + 'static,
-{
-    fn get_field<'a>(&self, _: &'a M) -> &'a R;
-    fn mut_field<'a>(&self, _: &'a mut M) -> &'a mut R;
-}
-
-struct MessageGetMut<M, L>
-where
-    M: Message + 'static,
-{
-    get_field: for<'a> fn(&'a M) -> &'a L,
-    mut_field: for<'a> fn(&'a mut M) -> &'a mut L,
-}
-
-pub(crate) enum FieldAccessorFunctions<M> {
-    // up to 1.0.24 optional or required
-    SingularHasGetSet {
-        has: fn(&M) -> bool,
-        get_set: SingularGetSet<M>,
-    },
-    // protobuf 3 simple field
-    Simple(Box<dyn FieldAccessor2<M, dyn ProtobufValue>>),
-    // optional, required or message
-    Optional(Box<dyn FieldAccessor2<M, dyn ReflectOptional>>),
-    // repeated
-    Repeated(Box<dyn FieldAccessor2<M, dyn ReflectRepeated>>),
-    // protobuf 3 map
-    Map(Box<dyn FieldAccessor2<M, dyn ReflectMap>>),
-}
-
-impl<M> fmt::Debug for FieldAccessorFunctions<M> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            &FieldAccessorFunctions::SingularHasGetSet { .. } => {
-                write!(f, "SingularHasGetSet {{ .. }}")
-            }
-            &FieldAccessorFunctions::Simple(..) => write!(f, "Simple(..)"),
-            &FieldAccessorFunctions::Optional(..) => write!(f, "Optional(..)"),
-            &FieldAccessorFunctions::Repeated(..) => write!(f, "Repeated(..)"),
-            &FieldAccessorFunctions::Map(..) => write!(f, "Map(..)"),
-        }
-    }
-}
-
-pub(crate) struct FieldAccessorImpl<M> {
-    pub(crate) fns: FieldAccessorFunctions<M>,
-}
-
-impl<M: Message> FieldAccessorImpl<M> {
-    fn get_value_option<'a>(&self, m: &'a M) -> Option<ReflectValueRef<'a>> {
-        match self.fns {
-            FieldAccessorFunctions::Repeated(..) | FieldAccessorFunctions::Map(..) => {
-                panic!("repeated")
-            }
-            FieldAccessorFunctions::Simple(ref a) => Some(a.get_field(m).as_ref()),
-            FieldAccessorFunctions::Optional(ref a) => {
-                a.get_field(m).to_option().map(|v| v.as_ref())
-            }
-            FieldAccessorFunctions::SingularHasGetSet {
-                ref has,
-                ref get_set,
-            } => {
-                if !has(m) {
-                    None
-                } else {
-                    Some(get_set.get_ref(m))
-                }
-            }
-        }
-    }
-}
-
-impl<M: Message + 'static> FieldAccessorTrait for FieldAccessorImpl<M> {
-    fn has_field_generic(&self, m: &dyn Message) -> bool {
-        match self.fns {
-            FieldAccessorFunctions::SingularHasGetSet { has, .. } => has(message_down_cast(m)),
-            FieldAccessorFunctions::Optional(ref a) => {
-                a.get_field(message_down_cast(m)).to_option().is_some()
-            }
-            FieldAccessorFunctions::Simple(ref a) => {
-                a.get_field(message_down_cast(m)).is_non_zero()
-            }
-            FieldAccessorFunctions::Map(..) | FieldAccessorFunctions::Repeated(..) => {
-                panic!("has_xxx is not implemented for repeated");
-            }
-        }
-    }
-
-    fn len_field_generic(&self, m: &dyn Message) -> usize {
-        match self.fns {
-            FieldAccessorFunctions::Repeated(ref a) => a.get_field(message_down_cast(m)).len(),
-            FieldAccessorFunctions::Map(ref a) => a.get_field(message_down_cast(m)).len(),
-            FieldAccessorFunctions::Simple(..)
-            | FieldAccessorFunctions::SingularHasGetSet { .. }
-            | FieldAccessorFunctions::Optional(..) => {
-                panic!("not a repeated field");
-            }
-        }
-    }
-
-    fn get_message_generic<'a>(&self, m: &'a dyn Message) -> &'a dyn Message {
-        match self.fns {
-            FieldAccessorFunctions::SingularHasGetSet {
-                get_set: SingularGetSet::Message(ref get),
-                ..
-            } => get.get_message(message_down_cast(m)),
-            FieldAccessorFunctions::Optional(ref t) => {
-                match t
-                    .get_field(message_down_cast(m))
-                    .to_option()
-                    .expect("field unset")
-                    .as_ref()
-                {
-                    ReflectValueRef::Message(m) => m,
-                    _ => panic!("not a message"),
-                }
-            }
-            ref fns => panic!("unknown accessor type: {:?}", fns),
-        }
-    }
-
-    fn get_enum_generic(&self, m: &dyn Message) -> &'static EnumValueDescriptor {
-        match self.fns {
-            FieldAccessorFunctions::SingularHasGetSet {
-                get_set: SingularGetSet::Enum(ref get),
-                ..
-            } => get.get_enum(message_down_cast(m)),
-            FieldAccessorFunctions::Optional(ref t) => {
-                match t
-                    .get_field(message_down_cast(m))
-                    .to_option()
-                    .expect("field unset")
-                    .as_ref()
-                {
-                    ReflectValueRef::Enum(e) => e,
-                    _ => panic!("not an enum"),
-                }
-            }
-            FieldAccessorFunctions::Simple(ref t) => {
-                match t.get_field(message_down_cast(m)).as_ref() {
-                    ReflectValueRef::Enum(e) => e,
-                    _ => panic!("not an enum"),
-                }
-            }
-            ref fns => panic!("unknown accessor type: {:?}", fns),
-        }
-    }
-
-    fn get_str_generic<'a>(&self, m: &'a dyn Message) -> &'a str {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::String(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => "", // TODO: check type
-        }
-    }
-
-    fn get_bytes_generic<'a>(&self, m: &'a dyn Message) -> &'a [u8] {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::Bytes(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => b"", // TODO: check type
-        }
-    }
-
-    fn get_u32_generic(&self, m: &dyn Message) -> u32 {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::U32(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => 0, // TODO: check type
-        }
-    }
-
-    fn get_u64_generic(&self, m: &dyn Message) -> u64 {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::U64(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => 0, // TODO: check type
-        }
-    }
-
-    fn get_i32_generic(&self, m: &dyn Message) -> i32 {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::I32(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => 0, // TODO: check type
-        }
-    }
-
-    fn get_i64_generic(&self, m: &dyn Message) -> i64 {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::I64(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => 0, // TODO: check type
-        }
-    }
-
-    fn get_bool_generic(&self, m: &dyn Message) -> bool {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::Bool(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => false, // TODO: check type
-        }
-    }
-
-    fn get_f32_generic(&self, m: &dyn Message) -> f32 {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::F32(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => 0.0, // TODO: check type
-        }
-    }
-
-    fn get_f64_generic(&self, m: &dyn Message) -> f64 {
-        match self.get_value_option(message_down_cast(m)) {
-            Some(ReflectValueRef::F64(v)) => v,
-            Some(_) => panic!("wrong type"),
-            None => 0.0, // TODO: check type
-        }
-    }
-
-    fn get_reflect<'a>(&self, m: &'a dyn Message) -> ReflectFieldRef<'a> {
-        match self.fns {
-            FieldAccessorFunctions::Repeated(ref accessor2) => {
-                ReflectFieldRef::Repeated(accessor2.get_field(message_down_cast(m)))
-            }
-            FieldAccessorFunctions::Map(ref accessor2) => {
-                ReflectFieldRef::Map(accessor2.get_field(message_down_cast(m)))
-            }
-            FieldAccessorFunctions::Optional(ref accessor2) => ReflectFieldRef::Optional(
-                accessor2
-                    .get_field(message_down_cast(m))
-                    .to_option()
-                    .map(|v| v.as_ref()),
-            ),
-            FieldAccessorFunctions::Simple(ref accessor2) => ReflectFieldRef::Optional({
-                let v = accessor2.get_field(message_down_cast(m));
-                if v.is_non_zero() {
-                    Some(v.as_ref())
-                } else {
-                    None
-                }
-            }),
-            FieldAccessorFunctions::SingularHasGetSet {
-                ref has,
-                ref get_set,
-            } => ReflectFieldRef::Optional(if has(message_down_cast(m)) {
-                Some(get_set.get_ref(message_down_cast(m)))
-            } else {
-                None
-            }),
-        }
-    }
-}
-
-// singular
-
-fn set_panic<A, B>(_: &mut A, _: B) {
-    panic!()
-}
-
-// TODO: make_singular_xxx_accessor are used only for oneof fields
-// oneof codegen should be changed
-
-pub fn make_singular_u32_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> u32,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_i32_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> i32,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_u64_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> u64,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_i64_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> i64,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_f32_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> f32,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_f64_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> f64,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_bool_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> bool,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Copy(Box::new(GetSetCopyFnsImpl {
-                get,
-                _set: set_panic,
-            })),
-        },
-    )
-}
-
-pub fn make_singular_enum_accessor<M: Message + 'static, E: ProtobufEnum + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: fn(&M) -> E,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Enum(Box::new(GetSingularEnumImpl { get })),
-        },
-    )
-}
-
-pub fn make_singular_string_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: for<'a> fn(&'a M) -> &'a str,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::String(get, set_panic),
-        },
-    )
-}
-
-pub fn make_singular_bytes_accessor<M: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: for<'a> fn(&'a M) -> &'a [u8],
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Bytes(get, set_panic),
-        },
-    )
-}
-
-pub fn make_singular_message_accessor<M: Message + 'static, F: Message + 'static>(
-    name: &'static str,
-    has: fn(&M) -> bool,
-    get: for<'a> fn(&'a M) -> &'a F,
-) -> FieldAccessor {
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::SingularHasGetSet {
-            has,
-            get_set: SingularGetSet::Message(Box::new(GetSingularMessageImpl { get })),
-        },
-    )
-}
-
-// repeated
-
-impl<M, V> FieldAccessor2<M, dyn ReflectRepeated> for MessageGetMut<M, Vec<V>>
-where
-    M: Message + 'static,
-    V: ProtobufValue + 'static,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectRepeated {
-        (self.get_field)(m) as &dyn ReflectRepeated
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectRepeated {
-        (self.mut_field)(m) as &mut dyn ReflectRepeated
-    }
-}
-
-pub fn make_vec_accessor<M, V>(
-    name: &'static str,
-    get_vec: for<'a> fn(&'a M) -> &'a Vec<V::Value>,
-    mut_vec: for<'a> fn(&'a mut M) -> &'a mut Vec<V::Value>,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    V: ProtobufType + 'static,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Repeated(Box::new(MessageGetMut::<M, Vec<V::Value>> {
-            get_field: get_vec,
-            mut_field: mut_vec,
-        })),
-    )
-}
-
-impl<M, V> FieldAccessor2<M, dyn ReflectRepeated> for MessageGetMut<M, RepeatedField<V>>
-where
-    M: Message + 'static,
-    V: ProtobufValue + 'static,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectRepeated {
-        (self.get_field)(m) as &dyn ReflectRepeated
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectRepeated {
-        (self.mut_field)(m) as &mut dyn ReflectRepeated
-    }
-}
-
-pub fn make_repeated_field_accessor<M, V>(
-    name: &'static str,
-    get_vec: for<'a> fn(&'a M) -> &'a RepeatedField<V::Value>,
-    mut_vec: for<'a> fn(&'a mut M) -> &'a mut RepeatedField<V::Value>,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    V: ProtobufType + 'static,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Repeated(Box::new(MessageGetMut::<M, RepeatedField<V::Value>> {
-            get_field: get_vec,
-            mut_field: mut_vec,
-        })),
-    )
-}
-
-impl<M, V> FieldAccessor2<M, dyn ReflectOptional> for MessageGetMut<M, Option<V>>
-where
-    M: Message + 'static,
-    V: ProtobufValue + Clone + 'static,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectOptional {
-        (self.get_field)(m) as &dyn ReflectOptional
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectOptional {
-        (self.mut_field)(m) as &mut dyn ReflectOptional
-    }
-}
-
-pub fn make_option_accessor<M, V>(
-    name: &'static str,
-    get_field: for<'a> fn(&'a M) -> &'a Option<V::Value>,
-    mut_field: for<'a> fn(&'a mut M) -> &'a mut Option<V::Value>,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    V: ProtobufType + 'static,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Optional(Box::new(MessageGetMut::<M, Option<V::Value>> {
-            get_field,
-            mut_field,
-        })),
-    )
-}
-
-impl<M, V> FieldAccessor2<M, dyn ReflectOptional> for MessageGetMut<M, SingularField<V>>
-where
-    M: Message + 'static,
-    V: ProtobufValue + Clone + 'static,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectOptional {
-        (self.get_field)(m) as &dyn ReflectOptional
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectOptional {
-        (self.mut_field)(m) as &mut dyn ReflectOptional
-    }
-}
-
-pub fn make_singular_field_accessor<M, V>(
-    name: &'static str,
-    get_field: for<'a> fn(&'a M) -> &'a SingularField<V::Value>,
-    mut_field: for<'a> fn(&'a mut M) -> &'a mut SingularField<V::Value>,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    V: ProtobufType + 'static,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Optional(Box::new(MessageGetMut::<M, SingularField<V::Value>> {
-            get_field,
-            mut_field,
-        })),
-    )
-}
-
-impl<M, V> FieldAccessor2<M, dyn ReflectOptional> for MessageGetMut<M, SingularPtrField<V>>
-where
-    M: Message + 'static,
-    V: ProtobufValue + Clone + 'static,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectOptional {
-        (self.get_field)(m) as &dyn ReflectOptional
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectOptional {
-        (self.mut_field)(m) as &mut dyn ReflectOptional
-    }
-}
-
-pub fn make_singular_ptr_field_accessor<M, V>(
-    name: &'static str,
-    get_field: for<'a> fn(&'a M) -> &'a SingularPtrField<V::Value>,
-    mut_field: for<'a> fn(&'a mut M) -> &'a mut SingularPtrField<V::Value>,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    V: ProtobufType + 'static,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Optional(Box::new(
-            MessageGetMut::<M, SingularPtrField<V::Value>> {
-                get_field,
-                mut_field,
-            },
-        )),
-    )
-}
-
-impl<M, V> FieldAccessor2<M, dyn ProtobufValue> for MessageGetMut<M, V>
-where
-    M: Message + 'static,
-    V: ProtobufValue + Clone + 'static,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ProtobufValue {
-        (self.get_field)(m) as &dyn ProtobufValue
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ProtobufValue {
-        (self.mut_field)(m) as &mut dyn ProtobufValue
-    }
-}
-
-pub fn make_simple_field_accessor<M, V>(
-    name: &'static str,
-    get_field: for<'a> fn(&'a M) -> &'a V::Value,
-    mut_field: for<'a> fn(&'a mut M) -> &'a mut V::Value,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    V: ProtobufType + 'static,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Simple(Box::new(MessageGetMut::<M, V::Value> {
-            get_field,
-            mut_field,
-        })),
-    )
-}
-
-impl<M, K, V> FieldAccessor2<M, dyn ReflectMap> for MessageGetMut<M, HashMap<K, V>>
-where
-    M: Message + 'static,
-    K: ProtobufValue + 'static,
-    V: ProtobufValue + 'static,
-    K: Hash + Eq,
-{
-    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectMap {
-        (self.get_field)(m) as &dyn ReflectMap
-    }
-
-    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectMap {
-        (self.mut_field)(m) as &mut dyn ReflectMap
-    }
-}
-
-pub fn make_map_accessor<M, K, V>(
-    name: &'static str,
-    get_field: for<'a> fn(&'a M) -> &'a HashMap<K::Value, V::Value>,
-    mut_field: for<'a> fn(&'a mut M) -> &'a mut HashMap<K::Value, V::Value>,
-) -> FieldAccessor
-where
-    M: Message + 'static,
-    K: ProtobufType + 'static,
-    V: ProtobufType + 'static,
-    <K as ProtobufType>::Value: Hash + Eq,
-{
-    FieldAccessor::new_v1(
-        name,
-        FieldAccessorFunctions::Map(Box::new(MessageGetMut::<M, HashMap<K::Value, V::Value>> {
-            get_field,
-            mut_field,
-        })),
-    )
-}
diff --git a/src/reflect/acc/v2/map.rs b/src/reflect/acc/v2/map.rs
new file mode 100644
index 0000000..3d8df8b
--- /dev/null
+++ b/src/reflect/acc/v2/map.rs
@@ -0,0 +1,90 @@
+use std::collections::HashMap;
+use std::fmt;
+use std::hash::Hash;
+
+use crate::message_dyn::MessageDyn;
+use crate::message_full::MessageFull;
+use crate::reflect::acc::v2::AccessorV2;
+use crate::reflect::acc::FieldAccessor;
+use crate::reflect::map::ReflectMapMut;
+use crate::reflect::map::ReflectMapRef;
+use crate::reflect::runtime_types::RuntimeTypeHashable;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::RuntimeType;
+
+pub(crate) trait MapFieldAccessor: Send + Sync + 'static {
+    fn get_reflect<'a>(&self, m: &'a dyn MessageDyn) -> ReflectMapRef<'a>;
+    fn mut_reflect<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectMapMut<'a>;
+    fn element_type(&self) -> (RuntimeType, RuntimeType);
+}
+
+pub(crate) struct MapFieldAccessorHolder {
+    pub accessor: Box<dyn MapFieldAccessor>,
+}
+
+impl<'a> fmt::Debug for MapFieldAccessorHolder {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_struct("MapFieldAccessorHolder").finish()
+    }
+}
+
+struct MapFieldAccessorImpl<M, K, V>
+where
+    M: MessageFull,
+    K: ProtobufValue,
+    V: ProtobufValue,
+{
+    get_field: fn(&M) -> &HashMap<K, V>,
+    mut_field: fn(&mut M) -> &mut HashMap<K, V>,
+}
+
+impl<M, K, V> MapFieldAccessor for MapFieldAccessorImpl<M, K, V>
+where
+    M: MessageFull,
+    K: ProtobufValue + Eq + Hash,
+    K::RuntimeType: RuntimeTypeHashable,
+    V: ProtobufValue,
+{
+    fn get_reflect<'a>(&self, m: &'a dyn MessageDyn) -> ReflectMapRef<'a> {
+        let m = m.downcast_ref().unwrap();
+        let map = (self.get_field)(m);
+        ReflectMapRef::new(map)
+    }
+
+    fn mut_reflect<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectMapMut<'a> {
+        let m = m.downcast_mut().unwrap();
+        let map = (self.mut_field)(m);
+        ReflectMapMut::new(map)
+    }
+
+    fn element_type(&self) -> (RuntimeType, RuntimeType) {
+        (
+            K::RuntimeType::runtime_type_box(),
+            V::RuntimeType::runtime_type_box(),
+        )
+    }
+}
+
+/// Make accessor for map field
+pub fn make_map_simpler_accessor<M, K, V>(
+    name: &'static str,
+    get_field: for<'a> fn(&'a M) -> &'a HashMap<K, V>,
+    mut_field: for<'a> fn(&'a mut M) -> &'a mut HashMap<K, V>,
+) -> FieldAccessor
+where
+    M: MessageFull + 'static,
+    K: ProtobufValue + Hash + Eq,
+    K::RuntimeType: RuntimeTypeHashable,
+    V: ProtobufValue,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Map(MapFieldAccessorHolder {
+            accessor: Box::new(MapFieldAccessorImpl::<M, K, V> {
+                get_field,
+                mut_field,
+            }),
+        }),
+    )
+}
diff --git a/src/reflect/acc/v2/mod.rs b/src/reflect/acc/v2/mod.rs
new file mode 100644
index 0000000..d3962b5
--- /dev/null
+++ b/src/reflect/acc/v2/mod.rs
@@ -0,0 +1,14 @@
+use crate::reflect::acc::v2::map::MapFieldAccessorHolder;
+use crate::reflect::acc::v2::repeated::RepeatedFieldAccessorHolder;
+use crate::reflect::acc::v2::singular::SingularFieldAccessorHolder;
+
+pub(crate) mod map;
+pub(crate) mod repeated;
+pub(crate) mod singular;
+
+#[derive(Debug)]
+pub(crate) enum AccessorV2 {
+    Singular(SingularFieldAccessorHolder),
+    Repeated(RepeatedFieldAccessorHolder),
+    Map(MapFieldAccessorHolder),
+}
diff --git a/src/reflect/acc/v2/repeated.rs b/src/reflect/acc/v2/repeated.rs
new file mode 100644
index 0000000..78afdf2
--- /dev/null
+++ b/src/reflect/acc/v2/repeated.rs
@@ -0,0 +1,114 @@
+use std::fmt;
+use std::marker;
+
+use crate::message_dyn::MessageDyn;
+use crate::message_full::MessageFull;
+use crate::reflect::acc::v2::AccessorV2;
+use crate::reflect::acc::FieldAccessor;
+use crate::reflect::repeated::ReflectRepeated;
+use crate::reflect::repeated::ReflectRepeatedMut;
+use crate::reflect::repeated::ReflectRepeatedRef;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::RuntimeType;
+
+pub(crate) trait RepeatedFieldAccessor: Send + Sync + 'static {
+    fn get_repeated<'a>(&self, m: &'a dyn MessageDyn) -> ReflectRepeatedRef<'a>;
+    fn mut_repeated<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectRepeatedMut<'a>;
+    fn element_type(&self) -> RuntimeType;
+}
+
+pub(crate) struct RepeatedFieldAccessorHolder {
+    pub accessor: Box<dyn RepeatedFieldAccessor>,
+}
+
+impl<'a> fmt::Debug for RepeatedFieldAccessorHolder {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_struct("RepeatedFieldAccessorHolder").finish()
+    }
+}
+
+trait RepeatedFieldGetMut<M, R: ?Sized>: Send + Sync + 'static
+where
+    M: MessageFull + 'static,
+{
+    fn get_field<'a>(&self, message: &'a M) -> &'a R;
+    fn mut_field<'a>(&self, message: &'a mut M) -> &'a mut R;
+}
+
+struct RepeatedFieldGetMutImpl<M, L>
+where
+    M: MessageFull + 'static,
+{
+    get_field: for<'a> fn(&'a M) -> &'a L,
+    mut_field: for<'a> fn(&'a mut M) -> &'a mut L,
+}
+
+impl<M, V> RepeatedFieldGetMut<M, dyn ReflectRepeated> for RepeatedFieldGetMutImpl<M, Vec<V>>
+where
+    M: MessageFull + 'static,
+    V: ProtobufValue,
+{
+    fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectRepeated {
+        (self.get_field)(m) as &dyn ReflectRepeated
+    }
+
+    fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectRepeated {
+        (self.mut_field)(m) as &mut dyn ReflectRepeated
+    }
+}
+
+struct RepeatedFieldAccessorImpl<M, V>
+where
+    M: MessageFull,
+    V: ProtobufValue,
+{
+    fns: Box<dyn RepeatedFieldGetMut<M, dyn ReflectRepeated>>,
+    _marker: marker::PhantomData<V>,
+}
+
+impl<M, V> RepeatedFieldAccessor for RepeatedFieldAccessorImpl<M, V>
+where
+    M: MessageFull,
+    V: ProtobufValue,
+{
+    fn get_repeated<'a>(&self, m: &'a dyn MessageDyn) -> ReflectRepeatedRef<'a> {
+        let m = m.downcast_ref().unwrap();
+        let repeated = self.fns.get_field(m);
+        ReflectRepeatedRef::new(repeated)
+    }
+
+    fn mut_repeated<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectRepeatedMut<'a> {
+        let m = m.downcast_mut().unwrap();
+        let repeated = self.fns.mut_field(m);
+        ReflectRepeatedMut::new(repeated)
+    }
+
+    fn element_type(&self) -> RuntimeType {
+        V::RuntimeType::runtime_type_box()
+    }
+}
+
+/// Make accessor for `Vec` field
+pub fn make_vec_simpler_accessor<M, V>(
+    name: &'static str,
+    get_vec: for<'a> fn(&'a M) -> &'a Vec<V>,
+    mut_vec: for<'a> fn(&'a mut M) -> &'a mut Vec<V>,
+) -> FieldAccessor
+where
+    M: MessageFull + 'static,
+    V: ProtobufValue,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Repeated(RepeatedFieldAccessorHolder {
+            accessor: Box::new(RepeatedFieldAccessorImpl::<M, V> {
+                fns: Box::new(RepeatedFieldGetMutImpl::<M, Vec<V>> {
+                    get_field: get_vec,
+                    mut_field: mut_vec,
+                }),
+                _marker: marker::PhantomData::<V>,
+            }),
+        }),
+    )
+}
diff --git a/src/reflect/acc/v2/singular/mod.rs b/src/reflect/acc/v2/singular/mod.rs
new file mode 100644
index 0000000..a152007
--- /dev/null
+++ b/src/reflect/acc/v2/singular/mod.rs
@@ -0,0 +1,331 @@
+use std::fmt;
+use std::marker;
+
+use crate::message_dyn::MessageDyn;
+use crate::message_field::MessageField;
+use crate::message_full::MessageFull;
+use crate::reflect::acc::v2::AccessorV2;
+use crate::reflect::acc::FieldAccessor;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::runtime_types::RuntimeTypeWithDeref;
+use crate::reflect::value::value_ref::ReflectValueMut;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectOptionalRef;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::EnumFull;
+use crate::EnumOrUnknown;
+
+pub(crate) mod oneof;
+
+/// This trait should not be used directly, use `FieldDescriptor` instead
+pub(crate) trait SingularFieldAccessor: Send + Sync + 'static {
+    fn get_field<'a>(&self, m: &'a dyn MessageDyn) -> ReflectOptionalRef<'a>;
+    fn mut_field_or_default<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectValueMut<'a>;
+    fn set_field(&self, m: &mut dyn MessageDyn, value: ReflectValueBox);
+    fn clear_field(&self, m: &mut dyn MessageDyn);
+}
+
+pub(crate) struct SingularFieldAccessorHolder {
+    pub accessor: Box<dyn SingularFieldAccessor>,
+}
+
+impl SingularFieldAccessorHolder {
+    fn new<M>(
+        get_field: impl for<'a> Fn(&'a M) -> ReflectOptionalRef<'a> + Send + Sync + 'static,
+        mut_field_or_default: impl for<'a> Fn(&'a mut M) -> ReflectValueMut<'a> + Send + Sync + 'static,
+        set_field: impl Fn(&mut M, ReflectValueBox) + Send + Sync + 'static,
+        clear_field: impl Fn(&mut M) + Send + Sync + 'static,
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+    {
+        struct Impl<M, G, H, S, C> {
+            get_field: G,
+            mut_field_or_default: H,
+            set_field: S,
+            clear_field: C,
+            _marker: marker::PhantomData<M>,
+        }
+
+        impl<M, G, H, S, C> SingularFieldAccessor for Impl<M, G, H, S, C>
+        where
+            M: MessageFull,
+            G: for<'a> Fn(&'a M) -> ReflectOptionalRef<'a> + Send + Sync + 'static,
+            H: for<'a> Fn(&'a mut M) -> ReflectValueMut<'a> + Send + Sync + 'static,
+            S: Fn(&mut M, ReflectValueBox) + Send + Sync + 'static,
+            C: Fn(&mut M) + Send + Sync + 'static,
+        {
+            fn get_field<'a>(&self, m: &'a dyn MessageDyn) -> ReflectOptionalRef<'a> {
+                (self.get_field)(m.downcast_ref::<M>().unwrap())
+            }
+
+            fn mut_field_or_default<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectValueMut<'a> {
+                (self.mut_field_or_default)(m.downcast_mut::<M>().unwrap())
+            }
+
+            fn set_field(&self, m: &mut dyn MessageDyn, value: ReflectValueBox) {
+                (self.set_field)(m.downcast_mut::<M>().unwrap(), value);
+            }
+
+            fn clear_field(&self, m: &mut dyn MessageDyn) {
+                (self.clear_field)(m.downcast_mut::<M>().unwrap());
+            }
+        }
+
+        SingularFieldAccessorHolder {
+            accessor: Box::new(Impl {
+                get_field,
+                mut_field_or_default,
+                set_field,
+                clear_field,
+                _marker: marker::PhantomData,
+            }),
+        }
+    }
+
+    fn new_get_mut<M, V>(
+        get_field: for<'a> fn(&'a M) -> &'a V,
+        mut_field: for<'a> fn(&'a mut M) -> &'a mut V,
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        V: ProtobufValue,
+    {
+        Self::new(
+            move |m| {
+                let v = (get_field)(m);
+                ReflectOptionalRef::new_filter_non_zero(v)
+            },
+            move |m| V::RuntimeType::as_mut((mut_field)(m)),
+            move |m, value| V::RuntimeType::set_from_value_box((mut_field)(m), value),
+            move |m| {
+                let default_value = V::RuntimeType::default_value_ref().to_box();
+                V::RuntimeType::set_from_value_box((mut_field)(m), default_value);
+            },
+        )
+    }
+
+    fn new_get_option_mut_option<M, V>(
+        get_field: for<'a> fn(&'a M) -> &'a Option<V>,
+        mut_field: for<'a> fn(&'a mut M) -> &'a mut Option<V>,
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        V: ProtobufValue,
+    {
+        Self::new(
+            move |m| ReflectOptionalRef::new_from_option((get_field)(m).as_ref()),
+            move |_m| unimplemented!(),
+            move |m, value| {
+                *(mut_field)(m) = Some(V::RuntimeType::from_value_box(value).expect("wrong type"))
+            },
+            move |m| *(mut_field)(m) = None,
+        )
+    }
+
+    fn new_get_mut_message<M, V>(
+        get_field: for<'a> fn(&'a M) -> &'a MessageField<V>,
+        mut_field: for<'a> fn(&'a mut M) -> &'a mut MessageField<V>,
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        V: MessageFull,
+    {
+        Self::new(
+            move |m| ReflectOptionalRef::new_from_option((get_field)(m).as_ref()),
+            move |m| {
+                let option = (mut_field)(m);
+                if option.as_ref().is_none() {
+                    *option = MessageField::some(V::default());
+                }
+                V::RuntimeType::as_mut(option.as_mut().unwrap())
+            },
+            move |m, value| {
+                *(mut_field)(m) =
+                    MessageField::some(V::RuntimeType::from_value_box(value).expect("wrong type"))
+            },
+            move |m| {
+                *(mut_field)(m) = MessageField::none();
+            },
+        )
+    }
+
+    pub(crate) fn new_get_option_set_enum<M, E>(
+        get: fn(&M) -> Option<EnumOrUnknown<E>>,
+        set: fn(&mut M, EnumOrUnknown<E>),
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        E: EnumFull,
+    {
+        Self::new(
+            move |m| {
+                let value = (get)(m);
+                match value {
+                    Some(v) => ReflectOptionalRef::some(ReflectValueRef::Enum(
+                        E::enum_descriptor(),
+                        v.value(),
+                    )),
+                    None => ReflectOptionalRef::none_from::<EnumOrUnknown<E>>(),
+                }
+            },
+            |_m| panic!("cannot get mutable pointer"),
+            move |m, value| match value {
+                ReflectValueBox::Enum(e, v) => {
+                    assert_eq!(E::enum_descriptor(), e);
+                    (set)(m, EnumOrUnknown::from_i32(v));
+                }
+                _ => panic!("expecting enum value"),
+            },
+            move |m| {
+                (set)(m, EnumOrUnknown::from_i32(0));
+            },
+        )
+    }
+
+    pub(crate) fn new_has_get_set<M, V>(
+        has: fn(&M) -> bool,
+        get: fn(&M) -> V,
+        set: fn(&mut M, V),
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        V: ProtobufValue + Copy,
+    {
+        Self::new(
+            move |m| {
+                if (has)(m) {
+                    ReflectOptionalRef::some(V::RuntimeType::into_static_value_ref((get)(m)))
+                } else {
+                    ReflectOptionalRef::none_from::<V>()
+                }
+            },
+            |_m| unimplemented!(),
+            move |m, value| (set)(m, value.downcast::<V>().expect("wrong type")),
+            move |m| {
+                if (has)(m) {
+                    (set)(m, V::default());
+                }
+            },
+        )
+    }
+
+    pub(crate) fn new_has_get_set_deref<M, V>(
+        has: fn(&M) -> bool,
+        get: for<'a> fn(&'a M) -> &'a <V::RuntimeType as RuntimeTypeWithDeref>::DerefTarget,
+        set: fn(&mut M, V),
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        V: ProtobufValue,
+        V::RuntimeType: RuntimeTypeWithDeref,
+    {
+        Self::new(
+            move |m| {
+                if (has)(m) {
+                    ReflectOptionalRef::some(
+                        <V::RuntimeType as RuntimeTypeWithDeref>::deref_as_ref((get)(m)),
+                    )
+                } else {
+                    ReflectOptionalRef::none_from::<V>()
+                }
+            },
+            |_m| unimplemented!(),
+            move |m, value| (set)(m, value.downcast::<V>().expect("message")),
+            move |m| {
+                if (has)(m) {
+                    (set)(m, V::default());
+                }
+            },
+        )
+    }
+
+    pub(crate) fn new_has_get_mut_set<M, F>(
+        has_field: fn(&M) -> bool,
+        get_field: for<'a> fn(&'a M) -> &'a F,
+        mut_field: for<'a> fn(&'a mut M) -> &'a mut F,
+        set_field: fn(&mut M, F),
+    ) -> SingularFieldAccessorHolder
+    where
+        M: MessageFull,
+        F: MessageFull,
+    {
+        Self::new(
+            move |m| {
+                if (has_field)(m) {
+                    ReflectOptionalRef::some(F::RuntimeType::as_ref((get_field)(m)))
+                } else {
+                    ReflectOptionalRef::none_from::<F>()
+                }
+            },
+            move |m| F::RuntimeType::as_mut((mut_field)(m)),
+            move |m, value| (set_field)(m, value.downcast::<F>().expect("message")),
+            move |m| {
+                if (has_field)(m) {
+                    (set_field)(m, F::default());
+                }
+            },
+        )
+    }
+}
+
+impl<'a> fmt::Debug for SingularFieldAccessorHolder {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_struct("SingularFieldAccessorHolder").finish()
+    }
+}
+
+/// Make accessor for `SingularPtrField`
+pub fn make_message_field_accessor<M, V>(
+    name: &'static str,
+    get_field: for<'a> fn(&'a M) -> &'a MessageField<V>,
+    mut_field: for<'a> fn(&'a mut M) -> &'a mut MessageField<V>,
+) -> FieldAccessor
+where
+    M: MessageFull,
+    V: MessageFull,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_get_mut_message(
+            get_field, mut_field,
+        )),
+    )
+}
+
+/// Make accessor for `Option<C>` field
+pub fn make_option_accessor<M, V>(
+    name: &'static str,
+    get_field: for<'a> fn(&'a M) -> &'a Option<V>,
+    mut_field: for<'a> fn(&'a mut M) -> &'a mut Option<V>,
+) -> FieldAccessor
+where
+    M: MessageFull,
+    V: ProtobufValue,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_get_option_mut_option(
+            get_field, mut_field,
+        )),
+    )
+}
+
+/// Make accessor for simple field
+pub fn make_simpler_field_accessor<M, V>(
+    name: &'static str,
+    get_field: for<'a> fn(&'a M) -> &'a V,
+    mut_field: for<'a> fn(&'a mut M) -> &'a mut V,
+) -> FieldAccessor
+where
+    M: MessageFull,
+    V: ProtobufValue,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_get_mut(
+            get_field, mut_field,
+        )),
+    )
+}
diff --git a/src/reflect/acc/v2/singular/oneof.rs b/src/reflect/acc/v2/singular/oneof.rs
new file mode 100644
index 0000000..3436150
--- /dev/null
+++ b/src/reflect/acc/v2/singular/oneof.rs
@@ -0,0 +1,85 @@
+use crate::reflect::acc::v2::singular::SingularFieldAccessorHolder;
+use crate::reflect::acc::v2::AccessorV2;
+use crate::reflect::acc::FieldAccessor;
+use crate::reflect::runtime_types::RuntimeTypeWithDeref;
+use crate::reflect::ProtobufValue;
+use crate::EnumFull;
+use crate::EnumOrUnknown;
+use crate::MessageFull;
+
+/// Make accessor for `oneof` `message` field
+pub fn make_oneof_message_has_get_mut_set_accessor<M, F>(
+    name: &'static str,
+    has_field: fn(&M) -> bool,
+    get_field: for<'a> fn(&'a M) -> &'a F,
+    mut_field: for<'a> fn(&'a mut M) -> &'a mut F,
+    set_field: fn(&mut M, F),
+) -> FieldAccessor
+where
+    M: MessageFull,
+    F: MessageFull,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_has_get_mut_set(
+            has_field, get_field, mut_field, set_field,
+        )),
+    )
+}
+
+/// Make accessor for `Copy` field
+pub fn make_oneof_copy_has_get_set_simpler_accessors<M, V>(
+    name: &'static str,
+    has: fn(&M) -> bool,
+    get: fn(&M) -> V,
+    set: fn(&mut M, V),
+) -> FieldAccessor
+where
+    M: MessageFull,
+    V: ProtobufValue + Copy,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_has_get_set(has, get, set)),
+    )
+}
+
+/// Make accessor for `Copy` field
+pub fn make_oneof_enum_accessors<M, E>(
+    name: &'static str,
+    get: fn(&M) -> Option<EnumOrUnknown<E>>,
+    set: fn(&mut M, EnumOrUnknown<E>),
+    // TODO: remove this
+    _default_value: E,
+) -> FieldAccessor
+where
+    M: MessageFull,
+    E: EnumFull,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_get_option_set_enum(
+            get, set,
+        )),
+    )
+}
+
+/// Make accessor for `oneof` field
+pub fn make_oneof_deref_has_get_set_simpler_accessor<M, F>(
+    name: &'static str,
+    has: fn(&M) -> bool,
+    get: for<'a> fn(&'a M) -> &'a <F::RuntimeType as RuntimeTypeWithDeref>::DerefTarget,
+    set: fn(&mut M, F),
+) -> FieldAccessor
+where
+    M: MessageFull + 'static,
+    F: ProtobufValue,
+    F::RuntimeType: RuntimeTypeWithDeref,
+{
+    FieldAccessor::new(
+        name,
+        AccessorV2::Singular(SingularFieldAccessorHolder::new_has_get_set_deref(
+            has, get, set,
+        )),
+    )
+}
diff --git a/src/reflect/accessor/mod.rs b/src/reflect/accessor/mod.rs
deleted file mode 100644
index 9fa97de..0000000
--- a/src/reflect/accessor/mod.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-#![doc(hidden)]
-
-pub use crate::reflect::acc::v1::make_map_accessor;
-pub use crate::reflect::acc::v1::make_option_accessor;
-pub use crate::reflect::acc::v1::make_repeated_field_accessor;
-pub use crate::reflect::acc::v1::make_simple_field_accessor;
-pub use crate::reflect::acc::v1::make_singular_bool_accessor;
-pub use crate::reflect::acc::v1::make_singular_bytes_accessor;
-pub use crate::reflect::acc::v1::make_singular_enum_accessor;
-pub use crate::reflect::acc::v1::make_singular_f32_accessor;
-pub use crate::reflect::acc::v1::make_singular_f64_accessor;
-pub use crate::reflect::acc::v1::make_singular_field_accessor;
-pub use crate::reflect::acc::v1::make_singular_i32_accessor;
-pub use crate::reflect::acc::v1::make_singular_i64_accessor;
-pub use crate::reflect::acc::v1::make_singular_message_accessor;
-pub use crate::reflect::acc::v1::make_singular_ptr_field_accessor;
-pub use crate::reflect::acc::v1::make_singular_string_accessor;
-pub use crate::reflect::acc::v1::make_singular_u32_accessor;
-pub use crate::reflect::acc::v1::make_singular_u64_accessor;
-pub use crate::reflect::acc::v1::make_vec_accessor;
-pub use crate::reflect::acc::v1::FieldAccessorTrait;
diff --git a/src/reflect/dynamic/map.rs b/src/reflect/dynamic/map.rs
new file mode 100644
index 0000000..902f9bf
--- /dev/null
+++ b/src/reflect/dynamic/map.rs
@@ -0,0 +1,217 @@
+use std::collections::hash_map;
+use std::collections::HashMap;
+use std::fmt;
+use std::hash::Hash;
+
+use crate::reflect::map::ReflectMap;
+use crate::reflect::map::ReflectMapIter;
+use crate::reflect::map::ReflectMapIterTrait;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+#[derive(Clone)]
+enum Maps {
+    U32(HashMap<u32, ReflectValueBox>),
+    I32(HashMap<i32, ReflectValueBox>),
+    U64(HashMap<u64, ReflectValueBox>),
+    I64(HashMap<i64, ReflectValueBox>),
+    Bool(HashMap<bool, ReflectValueBox>),
+    String(HashMap<String, ReflectValueBox>),
+}
+
+impl fmt::Debug for Maps {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Maps::U32(map) => fmt::Debug::fmt(map, f),
+            Maps::I32(map) => fmt::Debug::fmt(map, f),
+            Maps::U64(map) => fmt::Debug::fmt(map, f),
+            Maps::I64(map) => fmt::Debug::fmt(map, f),
+            Maps::Bool(map) => fmt::Debug::fmt(map, f),
+            Maps::String(map) => fmt::Debug::fmt(map, f),
+        }
+    }
+}
+
+impl Maps {
+    fn len(&self) -> usize {
+        match self {
+            Maps::U32(m) => m.len(),
+            Maps::I32(m) => m.len(),
+            Maps::U64(m) => m.len(),
+            Maps::I64(m) => m.len(),
+            Maps::Bool(m) => m.len(),
+            Maps::String(m) => m.len(),
+        }
+    }
+
+    fn is_empty(&self) -> bool {
+        match self {
+            Maps::U32(m) => m.is_empty(),
+            Maps::I32(m) => m.is_empty(),
+            Maps::U64(m) => m.is_empty(),
+            Maps::I64(m) => m.is_empty(),
+            Maps::Bool(m) => m.is_empty(),
+            Maps::String(m) => m.is_empty(),
+        }
+    }
+
+    fn clear(&mut self) {
+        match self {
+            Maps::U32(m) => m.clear(),
+            Maps::I32(m) => m.clear(),
+            Maps::U64(m) => m.clear(),
+            Maps::I64(m) => m.clear(),
+            Maps::Bool(m) => m.clear(),
+            Maps::String(m) => m.clear(),
+        }
+    }
+
+    fn key_type(&self) -> RuntimeType {
+        match self {
+            Maps::U32(..) => RuntimeType::U32,
+            Maps::I32(..) => RuntimeType::I32,
+            Maps::U64(..) => RuntimeType::U64,
+            Maps::I64(..) => RuntimeType::I64,
+            Maps::Bool(..) => RuntimeType::Bool,
+            Maps::String(..) => RuntimeType::String,
+        }
+    }
+}
+
+#[derive(Clone)]
+pub(crate) struct DynamicMap {
+    /// Type of value.
+    ///
+    /// Type of key is defined by the maps key.
+    value: RuntimeType,
+    maps: Maps,
+}
+
+impl fmt::Debug for DynamicMap {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Debug::fmt(&self.maps, f)
+    }
+}
+
+impl DynamicMap {
+    pub fn new(key: RuntimeType, value: RuntimeType) -> DynamicMap {
+        DynamicMap {
+            value,
+            maps: match key {
+                RuntimeType::U32 => Maps::U32(HashMap::new()),
+                RuntimeType::I32 => Maps::I32(HashMap::new()),
+                RuntimeType::U64 => Maps::U64(HashMap::new()),
+                RuntimeType::I64 => Maps::I64(HashMap::new()),
+                RuntimeType::Bool => Maps::Bool(HashMap::new()),
+                RuntimeType::String => Maps::String(HashMap::new()),
+                t => panic!("type cannot be hashmap key: {}", t),
+            },
+        }
+    }
+}
+
+struct DynamicMapIterImpl<'a, K: ProtobufValue + Eq + Hash + 'static> {
+    iter: hash_map::Iter<'a, K, ReflectValueBox>,
+    value: &'a RuntimeType,
+}
+
+impl<'a, K: ProtobufValue + Eq + Hash + 'static> ReflectMapIterTrait<'a>
+    for DynamicMapIterImpl<'a, K>
+{
+    fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
+        self.iter
+            .next()
+            .map(|(k, v)| (K::RuntimeType::as_ref(k), v.as_value_ref()))
+    }
+
+    fn key_type(&self) -> RuntimeType {
+        K::RuntimeType::runtime_type_box()
+    }
+
+    fn value_type(&self) -> RuntimeType {
+        self.value.clone()
+    }
+}
+
+impl ReflectMap for DynamicMap {
+    fn reflect_iter(&self) -> ReflectMapIter {
+        match &self.maps {
+            Maps::U32(m) => ReflectMapIter::new(DynamicMapIterImpl {
+                iter: m.iter(),
+                value: &self.value,
+            }),
+            Maps::I32(m) => ReflectMapIter::new(DynamicMapIterImpl {
+                iter: m.iter(),
+                value: &self.value,
+            }),
+            Maps::U64(m) => ReflectMapIter::new(DynamicMapIterImpl {
+                iter: m.iter(),
+                value: &self.value,
+            }),
+            Maps::I64(m) => ReflectMapIter::new(DynamicMapIterImpl {
+                iter: m.iter(),
+                value: &self.value,
+            }),
+            Maps::Bool(m) => ReflectMapIter::new(DynamicMapIterImpl {
+                iter: m.iter(),
+                value: &self.value,
+            }),
+            Maps::String(m) => ReflectMapIter::new(DynamicMapIterImpl {
+                iter: m.iter(),
+                value: &self.value,
+            }),
+        }
+    }
+
+    fn len(&self) -> usize {
+        self.maps.len()
+    }
+
+    fn is_empty(&self) -> bool {
+        self.maps.is_empty()
+    }
+
+    fn get<'a>(&'a self, key: ReflectValueRef) -> Option<ReflectValueRef<'a>> {
+        match (&self.maps, key) {
+            (Maps::U32(m), ReflectValueRef::U32(v)) => m.get(&v),
+            (Maps::U64(m), ReflectValueRef::U64(v)) => m.get(&v),
+            (Maps::I32(m), ReflectValueRef::I32(v)) => m.get(&v),
+            (Maps::I64(m), ReflectValueRef::I64(v)) => m.get(&v),
+            (Maps::Bool(m), ReflectValueRef::Bool(v)) => m.get(&v),
+            (Maps::String(m), ReflectValueRef::String(v)) => m.get(&*v),
+            _ => None,
+        }
+        .map(ReflectValueBox::as_value_ref)
+    }
+
+    fn insert(&mut self, key: ReflectValueBox, value: ReflectValueBox) {
+        assert!(value.get_type() == self.value);
+        match (&mut self.maps, &key) {
+            (Maps::U32(m), ReflectValueBox::U32(k)) => m.insert(*k, value),
+            (Maps::U64(m), ReflectValueBox::U64(k)) => m.insert(*k, value),
+            (Maps::I32(m), ReflectValueBox::I32(k)) => m.insert(*k, value),
+            (Maps::I64(m), ReflectValueBox::I64(k)) => m.insert(*k, value),
+            (Maps::Bool(m), ReflectValueBox::Bool(k)) => m.insert(*k, value),
+            (Maps::String(m), _) => match key {
+                ReflectValueBox::String(k) => m.insert(k, value),
+                _ => panic!("wrong key type"),
+            },
+            _ => panic!("wrong key type"),
+        };
+    }
+
+    fn clear(&mut self) {
+        self.maps.clear()
+    }
+
+    fn key_type(&self) -> RuntimeType {
+        self.maps.key_type()
+    }
+
+    fn value_type(&self) -> RuntimeType {
+        self.value.clone()
+    }
+}
diff --git a/src/reflect/dynamic/mod.rs b/src/reflect/dynamic/mod.rs
new file mode 100644
index 0000000..96fa202
--- /dev/null
+++ b/src/reflect/dynamic/mod.rs
@@ -0,0 +1,665 @@
+use std::any::Any;
+use std::any::TypeId;
+use std::fmt;
+
+use crate::descriptor::field_descriptor_proto::Type;
+use crate::message_dyn::MessageDyn;
+use crate::reflect::dynamic::map::DynamicMap;
+use crate::reflect::dynamic::optional::DynamicOptional;
+use crate::reflect::dynamic::repeated::DynamicRepeated;
+use crate::reflect::map::ReflectMap;
+use crate::reflect::protobuf_type_box::ProtobufType;
+use crate::reflect::repeated::ReflectRepeated;
+use crate::reflect::value::value_ref::ReflectValueMut;
+use crate::reflect::FieldDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ReflectFieldRef;
+use crate::reflect::ReflectMapMut;
+use crate::reflect::ReflectMapRef;
+use crate::reflect::ReflectRepeatedMut;
+use crate::reflect::ReflectRepeatedRef;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeFieldType;
+use crate::reflect::Syntax;
+use crate::rt::bytes_size;
+use crate::rt::compute_raw_varint32_size;
+use crate::rt::compute_raw_varint64_size;
+use crate::rt::int32_size;
+use crate::rt::int64_size;
+use crate::rt::map::read_map_template;
+use crate::rt::sint32_size;
+use crate::rt::sint64_size;
+use crate::rt::string_size;
+use crate::rt::tag_size;
+use crate::rt::uint32_size;
+use crate::rt::uint64_size;
+use crate::rt::unknown_fields_size;
+use crate::rt::unknown_or_group::read_unknown_or_skip_group_with_tag_unpacked;
+use crate::rt::vec_packed_bool_size;
+use crate::rt::vec_packed_double_size;
+use crate::rt::vec_packed_fixed32_size;
+use crate::rt::vec_packed_fixed64_size;
+use crate::rt::vec_packed_float_size;
+use crate::rt::vec_packed_int32_size;
+use crate::rt::vec_packed_int64_size;
+use crate::rt::vec_packed_sfixed32_size;
+use crate::rt::vec_packed_sfixed64_size;
+use crate::rt::vec_packed_sint32_size;
+use crate::rt::vec_packed_sint64_size;
+use crate::rt::vec_packed_uint32_size;
+use crate::rt::vec_packed_uint64_size;
+use crate::text_format;
+use crate::wire_format::WireType;
+use crate::CodedInputStream;
+use crate::CodedOutputStream;
+use crate::SpecialFields;
+use crate::UnknownFields;
+
+pub(crate) mod map;
+pub(crate) mod optional;
+pub(crate) mod repeated;
+
+#[derive(Debug, Clone)]
+enum DynamicFieldValue {
+    Singular(DynamicOptional),
+    Repeated(DynamicRepeated),
+    Map(DynamicMap),
+}
+
+impl DynamicFieldValue {
+    fn as_ref(&self) -> ReflectFieldRef {
+        match self {
+            DynamicFieldValue::Singular(v) => ReflectFieldRef::Optional(v.reflect_singlar_ref()),
+            DynamicFieldValue::Repeated(r) => ReflectFieldRef::Repeated(ReflectRepeatedRef::new(r)),
+            DynamicFieldValue::Map(m) => ReflectFieldRef::Map(ReflectMapRef::new(m)),
+        }
+    }
+
+    fn clear(&mut self) {
+        match self {
+            DynamicFieldValue::Singular(o) => o.clear(),
+            DynamicFieldValue::Repeated(r) => r.clear(),
+            DynamicFieldValue::Map(m) => m.clear(),
+        }
+    }
+}
+
+impl DynamicFieldValue {
+    fn default_for_field(field: &FieldDescriptor) -> DynamicFieldValue {
+        match field.runtime_field_type() {
+            RuntimeFieldType::Singular(s) => DynamicFieldValue::Singular(DynamicOptional::none(s)),
+            RuntimeFieldType::Repeated(r) => DynamicFieldValue::Repeated(DynamicRepeated::new(r)),
+            RuntimeFieldType::Map(k, v) => DynamicFieldValue::Map(DynamicMap::new(k, v)),
+        }
+    }
+}
+
+#[derive(Debug, Clone)]
+pub(crate) struct DynamicMessage {
+    descriptor: MessageDescriptor,
+    /// Fields by index in the description.
+    /// This field is lazy-init: it is empty when created.
+    fields: Box<[DynamicFieldValue]>,
+    special_fields: SpecialFields,
+}
+
+impl DynamicMessage {
+    pub(crate) fn new(descriptor: MessageDescriptor) -> DynamicMessage {
+        DynamicMessage {
+            descriptor,
+            fields: Vec::new().into_boxed_slice(),
+            special_fields: SpecialFields::new(),
+        }
+    }
+
+    pub(crate) fn descriptor(&self) -> &MessageDescriptor {
+        &self.descriptor
+    }
+
+    fn init_fields(&mut self) {
+        if self.fields.is_empty() {
+            self.fields = self
+                .descriptor
+                .fields()
+                .map(|f| DynamicFieldValue::default_for_field(&f))
+                .collect();
+        }
+    }
+
+    pub(crate) fn get_reflect<'a>(&'a self, field: &FieldDescriptor) -> ReflectFieldRef<'a> {
+        let (descriptor, index) = field.regular();
+        assert_eq!(self.descriptor, descriptor);
+        if self.fields.is_empty() {
+            ReflectFieldRef::default_for_field(field)
+        } else {
+            self.fields[index].as_ref()
+        }
+    }
+
+    pub fn clear_field(&mut self, field: &FieldDescriptor) {
+        let (descriptor, index) = field.regular();
+        assert_eq!(self.descriptor, descriptor);
+        if self.fields.is_empty() {
+            return;
+        }
+
+        self.fields[index].clear();
+    }
+
+    fn clear_oneof_group_fields_except(&mut self, field: &FieldDescriptor) {
+        if let Some(oneof) = field.containing_oneof_including_synthetic() {
+            for next in oneof.fields() {
+                if &next == field {
+                    continue;
+                }
+                self.clear_field(&next);
+            }
+        }
+    }
+
+    pub(crate) fn mut_singular_field_or_default<'a>(
+        &'a mut self,
+        field: &FieldDescriptor,
+    ) -> ReflectValueMut<'a> {
+        let (descriptor, index) = field.regular();
+        assert_eq!(self.descriptor, descriptor);
+        self.init_fields();
+        self.clear_oneof_group_fields_except(field);
+        match &mut self.fields[index] {
+            DynamicFieldValue::Singular(f) => f.mut_or_default(),
+            _ => panic!("Not a singular field"),
+        }
+    }
+
+    pub(crate) fn mut_repeated<'a>(
+        &'a mut self,
+        field: &FieldDescriptor,
+    ) -> ReflectRepeatedMut<'a> {
+        let (descriptor, index) = field.regular();
+        assert_eq!(self.descriptor, descriptor);
+        self.init_fields();
+        self.clear_oneof_group_fields_except(field);
+        match &mut self.fields[index] {
+            DynamicFieldValue::Repeated(r) => ReflectRepeatedMut::new(r),
+            _ => panic!("Not a repeated field: {}", field),
+        }
+    }
+
+    pub(crate) fn mut_map<'a>(&'a mut self, field: &FieldDescriptor) -> ReflectMapMut<'a> {
+        let (descriptor, index) = field.regular();
+        assert_eq!(self.descriptor, descriptor);
+        self.init_fields();
+        self.clear_oneof_group_fields_except(field);
+        match &mut self.fields[index] {
+            DynamicFieldValue::Map(m) => ReflectMapMut::new(m),
+            _ => panic!("Not a map field: {}", field),
+        }
+    }
+
+    pub(crate) fn set_field(&mut self, field: &FieldDescriptor, value: ReflectValueBox) {
+        let (descriptor, index) = field.regular();
+        assert_eq!(self.descriptor, descriptor);
+        self.init_fields();
+        self.clear_oneof_group_fields_except(field);
+        match &mut self.fields[index] {
+            DynamicFieldValue::Singular(s) => s.set(value),
+            _ => panic!("Not a singular field: {}", field),
+        }
+    }
+
+    pub(crate) fn downcast_ref(message: &dyn MessageDyn) -> &DynamicMessage {
+        assert!(Any::type_id(&*message) == TypeId::of::<DynamicMessage>());
+        unsafe { &*(message as *const dyn MessageDyn as *const DynamicMessage) }
+    }
+
+    pub(crate) fn downcast_mut(message: &mut dyn MessageDyn) -> &mut DynamicMessage {
+        assert!(Any::type_id(&*message) == TypeId::of::<DynamicMessage>());
+        unsafe { &mut *(message as *mut dyn MessageDyn as *mut DynamicMessage) }
+    }
+
+    fn for_each_field_to_write(
+        &self,
+        handler: &mut impl ForEachSingularFieldToWrite,
+    ) -> crate::Result<()> {
+        let is_proto3 = self.descriptor.file_descriptor().syntax() == Syntax::Proto3;
+        for field_desc in self.descriptor.fields() {
+            let field_number = field_desc.proto().number() as u32;
+            match field_desc.runtime_field_type() {
+                RuntimeFieldType::Singular(..) => {
+                    if let Some(v) = field_desc.get_singular(self) {
+                        // Ignore default value for proto3.
+                        if !is_proto3 || v.is_non_zero() {
+                            handler.field(field_desc.proto().type_(), field_number, &v)?;
+                        }
+                    }
+                }
+                RuntimeFieldType::Repeated(..) => {
+                    let repeated = field_desc.get_repeated(self);
+                    if field_desc.proto().options.get_or_default().packed() {
+                        handler.repeated_packed(
+                            field_desc.proto().type_(),
+                            field_number,
+                            &repeated,
+                        )?;
+                    } else {
+                        for i in 0..repeated.len() {
+                            let v = repeated.get(i);
+                            handler.field(field_desc.proto().type_(), field_number, &v)?;
+                        }
+                    }
+                }
+                RuntimeFieldType::Map(_, _) => {
+                    let map = field_desc.get_map(self);
+                    let (key_type, value_type) = field_desc.map_proto_type();
+                    for (k, v) in &map {
+                        handler.map_field_entry(
+                            field_number,
+                            &k,
+                            key_type.t(),
+                            &v,
+                            value_type.t(),
+                        )?;
+                    }
+                }
+            }
+        }
+
+        handler.unknown_fields(&self.special_fields.unknown_fields())?;
+        Ok(())
+    }
+}
+
+trait ForEachSingularFieldToWrite {
+    fn field(&mut self, t: Type, number: u32, value: &ReflectValueRef) -> crate::Result<()>;
+    fn repeated_packed(
+        &mut self,
+        t: Type,
+        number: u32,
+        value: &ReflectRepeatedRef,
+    ) -> crate::Result<()>;
+    fn map_field_entry(
+        &mut self,
+        number: u32,
+        key: &ReflectValueRef,
+        kt: Type,
+        value: &ReflectValueRef,
+        vt: Type,
+    ) -> crate::Result<()>;
+    fn unknown_fields(&mut self, unknown_fields: &UnknownFields) -> crate::Result<()>;
+}
+
+impl fmt::Display for DynamicMessage {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        text_format::fmt(self, f)
+    }
+}
+
+impl MessageDyn for DynamicMessage {
+    fn descriptor_dyn(&self) -> MessageDescriptor {
+        self.descriptor.clone()
+    }
+
+    fn is_initialized_dyn(&self) -> bool {
+        if self.descriptor.is_initialized_is_always_true() {
+            return true;
+        }
+
+        for f in self.descriptor.fields() {
+            let fv = self.get_reflect(&f);
+            match fv {
+                ReflectFieldRef::Optional(s) => match s.value() {
+                    None => {
+                        if f.is_required() {
+                            return false;
+                        }
+                    }
+                    Some(v) => {
+                        if !v.is_initialized() {
+                            return false;
+                        }
+                    }
+                },
+                ReflectFieldRef::Repeated(r) => {
+                    for v in &r {
+                        if !v.is_initialized() {
+                            return false;
+                        }
+                    }
+                }
+                ReflectFieldRef::Map(m) => {
+                    for (_k, v) in &m {
+                        // Keys cannot be messages, so only check values.
+                        if !v.is_initialized() {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        true
+    }
+
+    fn merge_from_dyn(&mut self, is: &mut CodedInputStream) -> crate::Result<()> {
+        while !is.eof()? {
+            let (field, wire_type) = is.read_tag_unpack()?;
+            let field_desc = match self.descriptor.field_by_number(field) {
+                Some(f) => f,
+                None => {
+                    read_unknown_or_skip_group_with_tag_unpacked(
+                        field,
+                        wire_type,
+                        is,
+                        &mut self.special_fields.mut_unknown_fields(),
+                    )?;
+                    continue;
+                }
+            };
+            match field_desc.runtime_field_type() {
+                RuntimeFieldType::Singular(rtb) => {
+                    let pt = ProtobufType::new(rtb, field_desc.proto().type_())?;
+                    let value = pt.read(is, wire_type)?;
+                    self.set_field(&field_desc, value);
+                }
+                RuntimeFieldType::Repeated(rtb) => {
+                    let pt = ProtobufType::new(rtb, field_desc.proto().type_())?;
+                    let mut repeated = self.mut_repeated(&field_desc);
+                    pt.read_repeated_into(is, wire_type, &mut repeated)?;
+                }
+                RuntimeFieldType::Map(..) => {
+                    let (key_type, value_type) = field_desc.map_proto_type();
+                    let mut map = self.mut_map(&field_desc);
+                    let mut key = key_type.runtime().default_value_box();
+                    let mut value = value_type.runtime().default_value_box();
+                    read_map_template(
+                        wire_type,
+                        is,
+                        |wire_type, is| {
+                            key = key_type.read(is, wire_type)?;
+                            Ok(())
+                        },
+                        |wire_type, is| {
+                            value = value_type.read(is, wire_type)?;
+                            Ok(())
+                        },
+                    )?;
+                    map.insert(key, value);
+                }
+            }
+        }
+        Ok(())
+    }
+
+    fn write_to_with_cached_sizes_dyn(&self, os: &mut CodedOutputStream) -> crate::Result<()> {
+        struct Handler<'a, 'o> {
+            os: &'a mut CodedOutputStream<'o>,
+        }
+
+        impl<'a, 'o> ForEachSingularFieldToWrite for Handler<'a, 'o> {
+            fn field(
+                &mut self,
+                t: Type,
+                number: u32,
+                value: &ReflectValueRef,
+            ) -> crate::Result<()> {
+                singular_write_to(t, number, value, self.os)
+            }
+
+            fn repeated_packed(
+                &mut self,
+                t: Type,
+                number: u32,
+                value: &ReflectRepeatedRef,
+            ) -> crate::Result<()> {
+                repeated_write_to(t, number, value, self.os)
+            }
+
+            fn map_field_entry(
+                &mut self,
+                number: u32,
+                key: &ReflectValueRef,
+                kt: Type,
+                value: &ReflectValueRef,
+                vt: Type,
+            ) -> crate::Result<()> {
+                let entry_data_size = compute_map_entry_field_data_size(key, kt, value, vt);
+                self.os.write_tag(number, WireType::LengthDelimited)?;
+                self.os.write_raw_varint32(entry_data_size as u32)?;
+                singular_write_to(kt, 1, key, self.os)?;
+                singular_write_to(vt, 2, value, self.os)?;
+                Ok(())
+            }
+
+            fn unknown_fields(&mut self, unknown_fields: &UnknownFields) -> crate::Result<()> {
+                self.os.write_unknown_fields(unknown_fields)
+            }
+        }
+
+        let mut handler = Handler { os };
+
+        self.for_each_field_to_write(&mut handler)
+    }
+
+    fn compute_size_dyn(&self) -> u64 {
+        struct Handler {
+            m_size: u64,
+        }
+
+        impl ForEachSingularFieldToWrite for Handler {
+            fn field(
+                &mut self,
+                t: Type,
+                number: u32,
+                value: &ReflectValueRef,
+            ) -> crate::Result<()> {
+                self.m_size += compute_singular_size(t, number, value);
+                Ok(())
+            }
+
+            fn repeated_packed(
+                &mut self,
+                t: Type,
+                number: u32,
+                value: &ReflectRepeatedRef,
+            ) -> crate::Result<()> {
+                self.m_size += compute_repeated_packed_size(t, number, value);
+                Ok(())
+            }
+
+            fn map_field_entry(
+                &mut self,
+                number: u32,
+                key: &ReflectValueRef,
+                kt: Type,
+                value: &ReflectValueRef,
+                vt: Type,
+            ) -> crate::Result<()> {
+                let entry_data_size = compute_map_entry_field_data_size(key, kt, value, vt);
+                self.m_size += tag_size(number)
+                    + compute_raw_varint32_size(entry_data_size as u32)
+                    + entry_data_size;
+                Ok(())
+            }
+
+            fn unknown_fields(&mut self, unknown_fields: &UnknownFields) -> crate::Result<()> {
+                self.m_size += unknown_fields_size(unknown_fields);
+                Ok(())
+            }
+        }
+
+        let mut handler = Handler { m_size: 0 };
+
+        self.for_each_field_to_write(&mut handler)
+            .expect("compute_size should not fail");
+
+        handler.m_size
+    }
+
+    fn special_fields_dyn(&self) -> &SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields_dyn(&mut self) -> &mut SpecialFields {
+        &mut self.special_fields
+    }
+}
+
+/// Write singular field to output stream
+fn singular_write_to(
+    proto_type: Type,
+    field_number: u32,
+    v: &ReflectValueRef,
+    os: &mut CodedOutputStream,
+) -> crate::Result<()> {
+    match proto_type {
+        Type::TYPE_ENUM => {
+            let enum_v = v.to_enum_value().unwrap();
+            os.write_enum(field_number, enum_v)
+        }
+        Type::TYPE_MESSAGE => {
+            let msg_v = v.to_message().unwrap();
+            os.write_message_dyn(field_number, &*msg_v)
+        }
+        Type::TYPE_GROUP => {
+            unimplemented!()
+        }
+        Type::TYPE_UINT32 => os.write_uint32(field_number, v.to_u32().unwrap()),
+        Type::TYPE_UINT64 => os.write_uint64(field_number, v.to_u64().unwrap()),
+        Type::TYPE_INT32 => os.write_int32(field_number, v.to_i32().unwrap()),
+        Type::TYPE_INT64 => os.write_int64(field_number, v.to_i64().unwrap()),
+        Type::TYPE_SINT32 => os.write_sint32(field_number, v.to_i32().unwrap()),
+        Type::TYPE_SINT64 => os.write_sint64(field_number, v.to_i64().unwrap()),
+        Type::TYPE_FIXED32 => os.write_fixed32(field_number, v.to_u32().unwrap()),
+        Type::TYPE_FIXED64 => os.write_fixed64(field_number, v.to_u64().unwrap()),
+        Type::TYPE_SFIXED64 => os.write_sfixed64(field_number, v.to_i64().unwrap()),
+        Type::TYPE_SFIXED32 => os.write_sfixed32(field_number, v.to_i32().unwrap()),
+        Type::TYPE_BOOL => os.write_bool(field_number, v.to_bool().unwrap()),
+        Type::TYPE_STRING => os.write_string(field_number, v.to_str().unwrap()),
+        Type::TYPE_BYTES => os.write_bytes(field_number, v.to_bytes().unwrap()),
+        Type::TYPE_FLOAT => os.write_float(field_number, v.to_f32().unwrap()),
+        Type::TYPE_DOUBLE => os.write_double(field_number, v.to_f64().unwrap()),
+    }
+}
+
+/// Compute singular field size
+fn compute_singular_size(proto_type: Type, field_number: u32, v: &ReflectValueRef) -> u64 {
+    match proto_type {
+        Type::TYPE_ENUM => {
+            let enum_v = v.to_enum_value().unwrap();
+            int32_size(field_number, enum_v)
+        }
+        Type::TYPE_MESSAGE => {
+            let msg_v = v.to_message().unwrap();
+            let len = msg_v.compute_size_dyn();
+            tag_size(field_number) + compute_raw_varint64_size(len) + len
+        }
+        Type::TYPE_GROUP => {
+            unimplemented!()
+        }
+        Type::TYPE_UINT32 => {
+            let typed_v = v.to_u32().unwrap();
+            uint32_size(field_number, typed_v)
+        }
+        Type::TYPE_UINT64 => {
+            let typed_v = v.to_u64().unwrap();
+            uint64_size(field_number, typed_v)
+        }
+        Type::TYPE_INT32 => {
+            let typed_v = v.to_i32().unwrap();
+            int32_size(field_number, typed_v)
+        }
+        Type::TYPE_INT64 => {
+            let typed_v = v.to_i64().unwrap();
+            int64_size(field_number, typed_v)
+        }
+        Type::TYPE_SINT32 => {
+            let typed_v = v.to_i32().unwrap();
+            sint32_size(field_number, typed_v)
+        }
+        Type::TYPE_SINT64 => {
+            let typed_v = v.to_i64().unwrap();
+            sint64_size(field_number, typed_v)
+        }
+        Type::TYPE_FIXED32 => tag_size(field_number) + 4,
+        Type::TYPE_FIXED64 => tag_size(field_number) + 8,
+        Type::TYPE_SFIXED32 => tag_size(field_number) + 4,
+        Type::TYPE_SFIXED64 => tag_size(field_number) + 8,
+        Type::TYPE_BOOL => tag_size(field_number) + 1,
+        Type::TYPE_STRING => {
+            let typed_v = v.to_str().unwrap();
+            string_size(field_number, typed_v)
+        }
+        Type::TYPE_BYTES => {
+            let typed_v = v.to_bytes().unwrap();
+            bytes_size(field_number, typed_v)
+        }
+        Type::TYPE_FLOAT => tag_size(field_number) + 4,
+        Type::TYPE_DOUBLE => tag_size(field_number) + 8,
+    }
+}
+
+fn compute_repeated_packed_size(
+    proto_type: Type,
+    field_number: u32,
+    v: &ReflectRepeatedRef,
+) -> u64 {
+    match proto_type {
+        Type::TYPE_INT32 => vec_packed_int32_size(field_number, v.data_i32()),
+        Type::TYPE_INT64 => vec_packed_int64_size(field_number, v.data_i64()),
+        Type::TYPE_UINT32 => vec_packed_uint32_size(field_number, v.data_u32()),
+        Type::TYPE_UINT64 => vec_packed_uint64_size(field_number, v.data_u64()),
+        Type::TYPE_SINT32 => vec_packed_sint32_size(field_number, v.data_i32()),
+        Type::TYPE_SINT64 => vec_packed_sint64_size(field_number, v.data_i64()),
+        Type::TYPE_FIXED32 => vec_packed_fixed32_size(field_number, v.data_u32()),
+        Type::TYPE_FIXED64 => vec_packed_fixed64_size(field_number, v.data_u64()),
+        Type::TYPE_SFIXED32 => vec_packed_sfixed32_size(field_number, v.data_i32()),
+        Type::TYPE_SFIXED64 => vec_packed_sfixed64_size(field_number, v.data_i64()),
+        Type::TYPE_FLOAT => vec_packed_float_size(field_number, v.data_f32()),
+        Type::TYPE_DOUBLE => vec_packed_double_size(field_number, v.data_f64()),
+        Type::TYPE_BOOL => vec_packed_bool_size(field_number, v.data_bool()),
+        Type::TYPE_STRING => panic!("strings cannot be packed"),
+        Type::TYPE_BYTES => panic!("bytes cannot be packed"),
+        Type::TYPE_ENUM => vec_packed_int32_size(field_number, v.data_enum_values()),
+        Type::TYPE_MESSAGE => panic!("messages cannot be packed"),
+        Type::TYPE_GROUP => panic!("groups cannot be packed"),
+    }
+}
+
+fn repeated_write_to(
+    proto_type: Type,
+    field_number: u32,
+    v: &ReflectRepeatedRef,
+    os: &mut CodedOutputStream,
+) -> crate::Result<()> {
+    match proto_type {
+        Type::TYPE_INT32 => os.write_repeated_packed_int32(field_number, v.data_i32()),
+        Type::TYPE_INT64 => os.write_repeated_packed_int64(field_number, v.data_i64()),
+        Type::TYPE_UINT64 => os.write_repeated_packed_uint64(field_number, v.data_u64()),
+        Type::TYPE_FIXED64 => os.write_repeated_packed_fixed64(field_number, v.data_u64()),
+        Type::TYPE_FIXED32 => os.write_repeated_packed_fixed32(field_number, v.data_u32()),
+        Type::TYPE_UINT32 => os.write_repeated_packed_uint32(field_number, v.data_u32()),
+        Type::TYPE_SINT32 => os.write_repeated_packed_sint32(field_number, v.data_i32()),
+        Type::TYPE_SINT64 => os.write_repeated_packed_sint64(field_number, v.data_i64()),
+        Type::TYPE_SFIXED32 => os.write_repeated_packed_sfixed32(field_number, v.data_i32()),
+        Type::TYPE_SFIXED64 => os.write_repeated_packed_sfixed64(field_number, v.data_i64()),
+        Type::TYPE_BOOL => os.write_repeated_packed_bool(field_number, v.data_bool()),
+        Type::TYPE_FLOAT => os.write_repeated_packed_float(field_number, v.data_f32()),
+        Type::TYPE_DOUBLE => os.write_repeated_packed_double(field_number, v.data_f64()),
+        Type::TYPE_ENUM => os.write_repeated_packed_int32(field_number, v.data_enum_values()),
+        Type::TYPE_STRING => panic!("strings cannot be packed"),
+        Type::TYPE_BYTES => panic!("bytes cannot be packed"),
+        Type::TYPE_GROUP => panic!("groups cannot be packed"),
+        Type::TYPE_MESSAGE => panic!("messages cannot be packed"),
+    }
+}
+
+fn compute_map_entry_field_data_size(
+    key: &ReflectValueRef,
+    kt: Type,
+    value: &ReflectValueRef,
+    vt: Type,
+) -> u64 {
+    let key_size = compute_singular_size(kt, 1, key);
+    let value_size = compute_singular_size(vt, 2, value);
+    key_size + value_size
+}
diff --git a/src/reflect/dynamic/optional.rs b/src/reflect/dynamic/optional.rs
new file mode 100644
index 0000000..b9cc7ea
--- /dev/null
+++ b/src/reflect/dynamic/optional.rs
@@ -0,0 +1,39 @@
+use crate::reflect::value::value_ref::ReflectValueMut;
+use crate::reflect::ReflectOptionalRef;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::RuntimeType;
+
+#[derive(Debug, Clone)]
+pub(crate) struct DynamicOptional {
+    elem: RuntimeType,
+    value: Option<ReflectValueBox>,
+}
+
+impl DynamicOptional {
+    pub(crate) fn none(elem: RuntimeType) -> DynamicOptional {
+        DynamicOptional { elem, value: None }
+    }
+
+    pub(crate) fn mut_or_default(&mut self) -> ReflectValueMut {
+        if let None = self.value {
+            self.value = Some(self.elem.default_value_ref().to_box());
+        }
+        self.value.as_mut().unwrap().as_value_mut()
+    }
+
+    pub(crate) fn clear(&mut self) {
+        self.value = None;
+    }
+
+    pub(crate) fn set(&mut self, value: ReflectValueBox) {
+        assert_eq!(value.get_type(), self.elem);
+        self.value = Some(value);
+    }
+
+    pub(crate) fn reflect_singlar_ref(&self) -> ReflectOptionalRef {
+        match &self.value {
+            Some(value) => ReflectOptionalRef::some(value.as_value_ref()),
+            None => ReflectOptionalRef::none(self.elem.clone()),
+        }
+    }
+}
diff --git a/src/reflect/dynamic/repeated.rs b/src/reflect/dynamic/repeated.rs
new file mode 100644
index 0000000..40c0411
--- /dev/null
+++ b/src/reflect/dynamic/repeated.rs
@@ -0,0 +1,296 @@
+use crate::reflect::repeated::drain_iter::ReflectRepeatedDrainIter;
+use crate::reflect::repeated::iter::ReflectRepeatedIter;
+use crate::reflect::repeated::ReflectRepeated;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::MessageRef;
+use crate::reflect::ReflectRepeatedMut;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+use crate::MessageDyn;
+
+/// Container of repeated values for dynamic messages.
+///
+/// It is logically similar to `Vec<ReflectValueBox>`, but:
+/// * more efficient
+/// * asserts all the elements are of the same type, the type which is specified at construction
+#[derive(Debug, Clone)]
+pub(crate) enum DynamicRepeated {
+    U32(Vec<u32>),
+    U64(Vec<u64>),
+    I32(Vec<i32>),
+    I64(Vec<i64>),
+    F32(Vec<f32>),
+    F64(Vec<f64>),
+    Bool(Vec<bool>),
+    String(Vec<String>),
+    Bytes(Vec<Vec<u8>>),
+    Enum(EnumDescriptor, Vec<i32>),
+    Message(MessageDescriptor, Vec<Box<dyn MessageDyn>>),
+}
+
+impl ReflectRepeated for DynamicRepeated {
+    fn reflect_iter(&self) -> ReflectRepeatedIter {
+        match self {
+            DynamicRepeated::U32(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::U64(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::I32(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::I64(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::F32(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::F64(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::Bool(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::String(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::Bytes(v) => ReflectRepeatedIter::new_slice(&v),
+            DynamicRepeated::Enum(descriptor, v) => ReflectRepeatedIter::new(
+                v.iter()
+                    .map(|v| ReflectValueRef::Enum(descriptor.clone(), *v)),
+            ),
+            DynamicRepeated::Message(_descriptor, v) => ReflectRepeatedIter::new(
+                v.iter()
+                    .map(|v| ReflectValueRef::Message(MessageRef::new(&**v))),
+            ),
+        }
+    }
+
+    fn reflect_drain_iter(&mut self) -> ReflectRepeatedDrainIter {
+        match self {
+            DynamicRepeated::U32(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::U64(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::I32(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::I64(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::F32(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::F64(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::Bool(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::String(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::Bytes(v) => ReflectRepeatedDrainIter::new_vec(v),
+            DynamicRepeated::Enum(descriptor, v) => ReflectRepeatedDrainIter::new(
+                v.drain(..)
+                    .map(|v| ReflectValueBox::Enum(descriptor.clone(), v)),
+            ),
+            DynamicRepeated::Message(_descriptor, v) => {
+                ReflectRepeatedDrainIter::new(v.drain(..).map(|v| ReflectValueBox::Message(v)))
+            }
+        }
+    }
+
+    fn len(&self) -> usize {
+        match self {
+            DynamicRepeated::U32(v) => v.len(),
+            DynamicRepeated::U64(v) => v.len(),
+            DynamicRepeated::I32(v) => v.len(),
+            DynamicRepeated::I64(v) => v.len(),
+            DynamicRepeated::F32(v) => v.len(),
+            DynamicRepeated::F64(v) => v.len(),
+            DynamicRepeated::Bool(v) => v.len(),
+            DynamicRepeated::String(v) => v.len(),
+            DynamicRepeated::Bytes(v) => v.len(),
+            DynamicRepeated::Enum(.., v) => v.len(),
+            DynamicRepeated::Message(.., v) => v.len(),
+        }
+    }
+
+    fn get(&self, index: usize) -> ReflectValueRef {
+        match self {
+            DynamicRepeated::U32(v) => ReflectValueRef::U32(v[index]),
+            DynamicRepeated::U64(v) => ReflectValueRef::U64(v[index]),
+            DynamicRepeated::I32(v) => ReflectValueRef::I32(v[index]),
+            DynamicRepeated::I64(v) => ReflectValueRef::I64(v[index]),
+            DynamicRepeated::F32(v) => ReflectValueRef::F32(v[index]),
+            DynamicRepeated::F64(v) => ReflectValueRef::F64(v[index]),
+            DynamicRepeated::Bool(v) => ReflectValueRef::Bool(v[index]),
+            DynamicRepeated::String(v) => ReflectValueRef::String(&v[index]),
+            DynamicRepeated::Bytes(v) => ReflectValueRef::Bytes(&v[index]),
+            DynamicRepeated::Enum(descriptor, v) => {
+                ReflectValueRef::Enum(descriptor.clone(), v[index])
+            }
+            DynamicRepeated::Message(_descriptor, v) => {
+                ReflectValueRef::Message(MessageRef::from(&*v[index]))
+            }
+        }
+    }
+
+    fn set(&mut self, index: usize, value: ReflectValueBox) {
+        match self {
+            DynamicRepeated::U32(v) => v.set(index, value),
+            DynamicRepeated::U64(v) => v.set(index, value),
+            DynamicRepeated::I32(v) => v.set(index, value),
+            DynamicRepeated::I64(v) => v.set(index, value),
+            DynamicRepeated::F32(v) => v.set(index, value),
+            DynamicRepeated::F64(v) => v.set(index, value),
+            DynamicRepeated::Bool(v) => v.set(index, value),
+            DynamicRepeated::String(v) => v.set(index, value),
+            DynamicRepeated::Bytes(v) => v.set(index, value),
+            DynamicRepeated::Enum(descriptor, vs) => match value {
+                ReflectValueBox::Enum(value_description, v) => {
+                    assert_eq!(*descriptor, value_description);
+                    vs[index] = v;
+                }
+                _ => panic!("Expected enum value"),
+            },
+            DynamicRepeated::Message(descriptor, vs) => match value {
+                ReflectValueBox::Message(message) => {
+                    assert_eq!(*descriptor, message.descriptor_dyn());
+                    vs[index] = message;
+                }
+                _ => panic!("Expected message value"),
+            },
+        }
+    }
+
+    fn push(&mut self, value: ReflectValueBox) {
+        match self {
+            DynamicRepeated::U32(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::U64(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::I32(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::I64(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::F32(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::F64(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::Bool(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::String(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::Bytes(vs) => ReflectRepeated::push(vs, value),
+            DynamicRepeated::Enum(descriptor, vs) => match value {
+                ReflectValueBox::Enum(value_description, v) => {
+                    assert_eq!(*descriptor, value_description);
+                    vs.push(v);
+                }
+                _ => panic!("Expected enum value"),
+            },
+            DynamicRepeated::Message(descriptor, vs) => match value {
+                ReflectValueBox::Message(message) => {
+                    assert_eq!(*descriptor, message.descriptor_dyn());
+                    vs.push(message);
+                }
+                _ => panic!("Expected message value"),
+            },
+        }
+    }
+
+    fn reflect_extend(&mut self, values: ReflectRepeatedMut) {
+        match self {
+            DynamicRepeated::U32(vs) => vs.extend(values.repeated.data_u32()),
+            DynamicRepeated::U64(vs) => vs.extend(values.repeated.data_u64()),
+            DynamicRepeated::I32(vs) => vs.extend(values.repeated.data_i32()),
+            DynamicRepeated::I64(vs) => vs.extend(values.repeated.data_i64()),
+            DynamicRepeated::F32(vs) => vs.extend(values.repeated.data_f32()),
+            DynamicRepeated::F64(vs) => vs.extend(values.repeated.data_f64()),
+            DynamicRepeated::Bool(vs) => vs.extend(values.repeated.data_bool()),
+            _ => {
+                // Default less efficient implementation.
+                for value in values.repeated.reflect_drain_iter() {
+                    self.push(value);
+                }
+            }
+        }
+    }
+
+    fn clear(&mut self) {
+        match self {
+            DynamicRepeated::U32(vs) => vs.clear(),
+            DynamicRepeated::U64(vs) => vs.clear(),
+            DynamicRepeated::I32(vs) => vs.clear(),
+            DynamicRepeated::I64(vs) => vs.clear(),
+            DynamicRepeated::F32(vs) => vs.clear(),
+            DynamicRepeated::F64(vs) => vs.clear(),
+            DynamicRepeated::Bool(vs) => vs.clear(),
+            DynamicRepeated::String(vs) => vs.clear(),
+            DynamicRepeated::Bytes(vs) => vs.clear(),
+            DynamicRepeated::Enum(_descriptor, vs) => vs.clear(),
+            DynamicRepeated::Message(_descriptor, vs) => vs.clear(),
+        }
+    }
+
+    fn element_type(&self) -> RuntimeType {
+        match self {
+            DynamicRepeated::U32(..) => RuntimeType::U32,
+            DynamicRepeated::U64(..) => RuntimeType::U64,
+            DynamicRepeated::I32(..) => RuntimeType::I32,
+            DynamicRepeated::I64(..) => RuntimeType::I64,
+            DynamicRepeated::F32(..) => RuntimeType::F32,
+            DynamicRepeated::F64(..) => RuntimeType::F64,
+            DynamicRepeated::Bool(..) => RuntimeType::Bool,
+            DynamicRepeated::String(..) => RuntimeType::String,
+            DynamicRepeated::Bytes(..) => RuntimeType::VecU8,
+            DynamicRepeated::Enum(descriptor, _vs) => RuntimeType::Enum(descriptor.clone()),
+            DynamicRepeated::Message(descriptor, _vs) => RuntimeType::Message(descriptor.clone()),
+        }
+    }
+
+    fn data_enum_values(&self) -> &[i32] {
+        match self {
+            DynamicRepeated::Enum(_descriptor, vs) => &vs,
+            _ => panic!("Expected enum value"),
+        }
+    }
+
+    fn data_bool(&self) -> &[bool] {
+        match self {
+            DynamicRepeated::Bool(vs) => &vs,
+            _ => panic!("Expected bool value"),
+        }
+    }
+
+    fn data_u32(&self) -> &[u32] {
+        match self {
+            DynamicRepeated::U32(vs) => &vs,
+            _ => panic!("Expected u32 value"),
+        }
+    }
+
+    fn data_u64(&self) -> &[u64] {
+        match self {
+            DynamicRepeated::U64(vs) => &vs,
+            _ => panic!("Expected u64 value"),
+        }
+    }
+
+    fn data_i32(&self) -> &[i32] {
+        match self {
+            DynamicRepeated::I32(vs) => &vs,
+            _ => panic!("Expected i32 value"),
+        }
+    }
+
+    fn data_i64(&self) -> &[i64] {
+        match self {
+            DynamicRepeated::I64(vs) => &vs,
+            _ => panic!("Expected i64 value"),
+        }
+    }
+
+    fn data_f32(&self) -> &[f32] {
+        match self {
+            DynamicRepeated::F32(vs) => &vs,
+            _ => panic!("Expected f32 value"),
+        }
+    }
+
+    fn data_f64(&self) -> &[f64] {
+        match self {
+            DynamicRepeated::F64(vs) => &vs,
+            _ => panic!("Expected f64 value"),
+        }
+    }
+}
+
+impl DynamicRepeated {
+    pub fn new(elem: RuntimeType) -> DynamicRepeated {
+        match elem {
+            RuntimeType::U32 => DynamicRepeated::U32(Vec::new()),
+            RuntimeType::U64 => DynamicRepeated::U64(Vec::new()),
+            RuntimeType::I32 => DynamicRepeated::I32(Vec::new()),
+            RuntimeType::I64 => DynamicRepeated::I64(Vec::new()),
+            RuntimeType::F32 => DynamicRepeated::F32(Vec::new()),
+            RuntimeType::F64 => DynamicRepeated::F64(Vec::new()),
+            RuntimeType::Bool => DynamicRepeated::Bool(Vec::new()),
+            RuntimeType::String => DynamicRepeated::String(Vec::new()),
+            RuntimeType::VecU8 => DynamicRepeated::Bytes(Vec::new()),
+            RuntimeType::Enum(enum_descriptor) => {
+                DynamicRepeated::Enum(enum_descriptor, Vec::new())
+            }
+            RuntimeType::Message(message_descriptor) => {
+                DynamicRepeated::Message(message_descriptor, Vec::new())
+            }
+        }
+    }
+}
diff --git a/src/reflect/enums.rs b/src/reflect/enums.rs
deleted file mode 100644
index a25be6f..0000000
--- a/src/reflect/enums.rs
+++ /dev/null
@@ -1,128 +0,0 @@
-use std::collections::HashMap;
-
-use crate::descriptor::EnumDescriptorProto;
-use crate::descriptor::EnumValueDescriptorProto;
-use crate::descriptor::FileDescriptorProto;
-use crate::descriptorx::find_enum_by_rust_name;
-use crate::reflect::find_message_or_enum::find_message_or_enum;
-use crate::reflect::find_message_or_enum::MessageOrEnum;
-use crate::ProtobufEnum;
-
-/// Description for enum variant.
-///
-/// Used in reflection.
-#[derive(Clone, Debug)]
-pub struct EnumValueDescriptor {
-    proto: &'static EnumValueDescriptorProto,
-}
-
-impl Copy for EnumValueDescriptor {}
-
-impl EnumValueDescriptor {
-    /// Name of enum variant as specified in proto file
-    pub fn name(&self) -> &'static str {
-        self.proto.get_name()
-    }
-
-    /// `i32` value of the enum variant
-    pub fn value(&self) -> i32 {
-        self.proto.get_number()
-    }
-}
-
-/// Dynamic representation of enum type.
-///
-/// Can be used in reflective operations.
-pub struct EnumDescriptor {
-    proto: &'static EnumDescriptorProto,
-    values: Vec<EnumValueDescriptor>,
-
-    index_by_name: HashMap<String, usize>,
-    index_by_number: HashMap<i32, usize>,
-}
-
-impl EnumDescriptor {
-    /// Enum name as given in `.proto` file
-    pub fn name(&self) -> &'static str {
-        self.proto.get_name()
-    }
-
-    /// `EnumDescriptor` for enum type
-    pub fn for_type<E: ProtobufEnum>() -> &'static EnumDescriptor {
-        E::enum_descriptor_static()
-    }
-
-    /// Create new enum descriptor.
-    ///
-    /// This function is called by generated code, and should not be called manually.
-    #[deprecated(
-        since = "2.12",
-        note = "Please regenerate .rs files from .proto files to use newer APIs"
-    )]
-    pub fn new(rust_name: &'static str, file: &'static FileDescriptorProto) -> EnumDescriptor {
-        let proto = find_enum_by_rust_name(file, rust_name);
-        let mut index_by_name = HashMap::new();
-        let mut index_by_number = HashMap::new();
-        for (i, v) in proto.en.get_value().iter().enumerate() {
-            index_by_number.insert(v.get_number(), i);
-            index_by_name.insert(v.get_name().to_string(), i);
-        }
-        EnumDescriptor {
-            proto: proto.en,
-            values: proto
-                .en
-                .get_value()
-                .iter()
-                .map(|v| EnumValueDescriptor { proto: v })
-                .collect(),
-            index_by_name: index_by_name,
-            index_by_number: index_by_number,
-        }
-    }
-
-    /// Create new enum descriptor.
-    ///
-    /// This function is called by generated code, and should not be called manually.
-    pub fn new_pb_name<E>(
-        name_in_file: &'static str,
-        file: &'static FileDescriptorProto,
-    ) -> EnumDescriptor
-    where
-        E: ProtobufEnum,
-    {
-        let (_path_to_package, proto) = match find_message_or_enum(file, name_in_file) {
-            (path_to_package, MessageOrEnum::Enum(e)) => (path_to_package, e),
-            (_, MessageOrEnum::Message(_)) => panic!("not an enum"),
-        };
-
-        let mut index_by_name = HashMap::new();
-        let mut index_by_number = HashMap::new();
-        for (i, v) in proto.get_value().iter().enumerate() {
-            index_by_number.insert(v.get_number(), i);
-            index_by_name.insert(v.get_name().to_string(), i);
-        }
-        EnumDescriptor {
-            proto,
-            values: proto
-                .get_value()
-                .iter()
-                .map(|v| EnumValueDescriptor { proto: v })
-                .collect(),
-            index_by_name: index_by_name,
-            index_by_number: index_by_number,
-        }
-    }
-
-    /// Find enum value by name
-    pub fn value_by_name<'a>(&'a self, name: &str) -> &'a EnumValueDescriptor {
-        // TODO: clone is weird
-        let &index = self.index_by_name.get(&name.to_string()).unwrap();
-        &self.values[index]
-    }
-
-    /// Find enum value by number
-    pub fn value_by_number<'a>(&'a self, number: i32) -> &'a EnumValueDescriptor {
-        let &index = self.index_by_number.get(&number).unwrap();
-        &self.values[index]
-    }
-}
diff --git a/src/reflect/enums/generated.rs b/src/reflect/enums/generated.rs
new file mode 100644
index 0000000..63d4b03
--- /dev/null
+++ b/src/reflect/enums/generated.rs
@@ -0,0 +1,56 @@
+//! Generated code support for enum descriptors.
+
+use std::any::TypeId;
+
+use crate::descriptor::FileDescriptorProto;
+use crate::EnumFull;
+use crate::EnumOrUnknown;
+
+#[doc(hidden)]
+pub struct GeneratedEnumDescriptorData {
+    pub(crate) name_in_file: &'static str,
+    type_id: TypeId,
+    enum_or_unknown_type_id: TypeId,
+}
+
+impl GeneratedEnumDescriptorData {
+    #[doc(hidden)]
+    pub fn new<E>(name_in_file: &'static str) -> GeneratedEnumDescriptorData
+    where
+        E: EnumFull,
+    {
+        GeneratedEnumDescriptorData {
+            name_in_file,
+            type_id: TypeId::of::<E>(),
+            enum_or_unknown_type_id: TypeId::of::<EnumOrUnknown<E>>(),
+        }
+    }
+}
+
+#[derive(Debug)]
+pub(crate) struct GeneratedEnumDescriptor {
+    /// Type id of `<E>`
+    pub(crate) type_id: TypeId,
+    /// Type id of `<ProtobufEnumOrUnknown<E>>`
+    pub(crate) _enum_or_unknown_type_id: TypeId,
+}
+
+impl GeneratedEnumDescriptor {
+    pub(crate) fn new(
+        data: GeneratedEnumDescriptorData,
+        file_descriptor_proto: &'static FileDescriptorProto,
+    ) -> GeneratedEnumDescriptor {
+        let GeneratedEnumDescriptorData {
+            name_in_file,
+            type_id,
+            enum_or_unknown_type_id,
+        } = data;
+
+        let _ = (name_in_file, file_descriptor_proto);
+
+        GeneratedEnumDescriptor {
+            type_id,
+            _enum_or_unknown_type_id: enum_or_unknown_type_id,
+        }
+    }
+}
diff --git a/src/reflect/enums/mod.rs b/src/reflect/enums/mod.rs
new file mode 100644
index 0000000..4081c4a
--- /dev/null
+++ b/src/reflect/enums/mod.rs
@@ -0,0 +1,293 @@
+use std::any::TypeId;
+use std::fmt;
+use std::fmt::Formatter;
+use std::hash::Hash;
+
+use crate::descriptor::EnumDescriptorProto;
+use crate::descriptor::EnumValueDescriptorProto;
+use crate::enums::Enum;
+use crate::reflect::enums::generated::GeneratedEnumDescriptor;
+use crate::reflect::file::index::EnumIndices;
+use crate::reflect::file::FileDescriptorImpl;
+use crate::reflect::FileDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::EnumFull;
+
+pub(crate) mod generated;
+
+/// Description for enum variant.
+///
+/// Used in reflection.
+#[derive(Clone, Eq, PartialEq, Hash)]
+pub struct EnumValueDescriptor {
+    pub(crate) enum_descriptor: EnumDescriptor,
+    pub(crate) index: usize,
+}
+
+fn _assert_send_sync() {
+    fn _assert_send_sync<T: Send + Sync>() {}
+    _assert_send_sync::<EnumValueDescriptor>();
+}
+
+impl fmt::Debug for EnumValueDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("EnumValueDescriptor")
+            .field("enum_descriptor", &self.enum_descriptor)
+            .field("name", &self.name())
+            .finish()
+    }
+}
+
+impl fmt::Display for EnumValueDescriptor {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        write!(f, "{}.{}", self.enum_descriptor, self.name())
+    }
+}
+
+impl EnumValueDescriptor {
+    pub(crate) fn new(enum_descriptor: EnumDescriptor, index: usize) -> EnumValueDescriptor {
+        EnumValueDescriptor {
+            enum_descriptor,
+            index,
+        }
+    }
+
+    /// `.proto` object which declared this value.
+    pub fn proto(&self) -> &EnumValueDescriptorProto {
+        &self.enum_descriptor.proto().value[self.index]
+    }
+
+    /// Name of enum variant as specified in proto file
+    pub fn name(&self) -> &str {
+        self.proto().name()
+    }
+
+    /// Fully qualified enum value name: fully qualified enum name followed by value name.
+    pub fn full_name(&self) -> String {
+        self.to_string()
+    }
+
+    /// `i32` value of the enum variant
+    pub fn value(&self) -> i32 {
+        self.proto().number()
+    }
+
+    /// Get descriptor of enum holding this value.
+    pub fn enum_descriptor(&self) -> &EnumDescriptor {
+        &self.enum_descriptor
+    }
+
+    /// Convert this value descriptor into proper enum object.
+    ///
+    /// ```
+    /// # use protobuf::well_known_types::struct_::NullValue;
+    /// # use protobuf::EnumFull;
+    /// # use protobuf::reflect::EnumValueDescriptor;
+    ///
+    /// # if !cfg!(miri) {
+    /// let value: EnumValueDescriptor = NullValue::NULL_VALUE.descriptor();
+    /// let null: Option<NullValue> = value.cast();
+    /// assert_eq!(Some(NullValue::NULL_VALUE), null);
+    /// # }
+    /// ```
+    pub fn cast<E: EnumFull>(&self) -> Option<E> {
+        if self.enum_descriptor != E::enum_descriptor() {
+            return None;
+        }
+        E::from_i32(self.value())
+    }
+}
+
+/// Dynamic representation of enum type.
+///
+/// Can be used in reflective operations.
+#[derive(Clone, Eq, PartialEq, Hash)]
+pub struct EnumDescriptor {
+    file_descriptor: FileDescriptor,
+    index: usize,
+}
+
+impl fmt::Display for EnumDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.full_name())
+    }
+}
+
+impl fmt::Debug for EnumDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("EnumDescriptor")
+            .field("full_name", &self.full_name())
+            .finish_non_exhaustive()
+    }
+}
+
+impl EnumDescriptor {
+    pub(crate) fn new(file_descriptor: FileDescriptor, index: usize) -> EnumDescriptor {
+        EnumDescriptor {
+            file_descriptor,
+            index,
+        }
+    }
+
+    fn get_impl(&self) -> EnumDescriptorImplRef {
+        match &self.file_descriptor.imp {
+            FileDescriptorImpl::Generated(g) => {
+                EnumDescriptorImplRef::Generated(&g.enums[self.index])
+            }
+            FileDescriptorImpl::Dynamic(..) => EnumDescriptorImplRef::Dynamic,
+        }
+    }
+
+    /// Descriptor objects which defined this enum.
+    pub fn proto(&self) -> &EnumDescriptorProto {
+        &self.index_entry().proto
+    }
+
+    /// Enum name as given in `.proto` file
+    pub fn name(&self) -> &str {
+        self.proto().name()
+    }
+
+    fn index_entry(&self) -> &EnumIndices {
+        self.file_descriptor.enum_indices(self.index)
+    }
+
+    /// Fully qualified protobuf name of enum
+    pub fn full_name(&self) -> &str {
+        &self.index_entry().full_name
+    }
+
+    /// Name relative to the package where the message is declared.
+    pub fn name_to_package(&self) -> &str {
+        &self.index_entry().name_to_package
+    }
+
+    /// Get `EnumDescriptor` object for given enum type
+    pub fn for_type<E: EnumFull>() -> EnumDescriptor {
+        E::enum_descriptor()
+    }
+
+    /// Get a message containing this message, or `None` if this message is declared at file level.
+    pub fn enclosing_message(&self) -> Option<MessageDescriptor> {
+        self.index_entry()
+            .enclosing_message
+            .map(|i| MessageDescriptor::new(self.file_descriptor.clone(), i))
+    }
+
+    /// This enum values
+    pub fn values<'a>(&'a self) -> impl Iterator<Item = EnumValueDescriptor> + 'a {
+        let value_len = self.proto().value.len();
+        (0..value_len).map(move |index| EnumValueDescriptor {
+            enum_descriptor: self.clone(),
+            index,
+        })
+    }
+
+    /// Find enum variant by name
+    pub fn value_by_name(&self, name: &str) -> Option<EnumValueDescriptor> {
+        let index = *self.file_descriptor.common().enums[self.index]
+            .index_by_name
+            .get(name)?;
+        Some(EnumValueDescriptor {
+            enum_descriptor: self.clone(),
+            index,
+        })
+    }
+
+    /// Find enum variant by number
+    pub fn value_by_number(&self, number: i32) -> Option<EnumValueDescriptor> {
+        let index = *self.file_descriptor.common().enums[self.index]
+            .index_by_number
+            .get(&number)?;
+        Some(self.value_by_index(index))
+    }
+
+    /// Get enum variant by index (as declared in `.proto` file).
+    pub fn value_by_index(&self, index: usize) -> EnumValueDescriptor {
+        assert!(index < self.proto().value.len());
+        EnumValueDescriptor {
+            enum_descriptor: self.clone(),
+            index,
+        }
+    }
+
+    /// Default enum value (first variant).
+    pub fn default_value(&self) -> EnumValueDescriptor {
+        EnumValueDescriptor {
+            enum_descriptor: self.clone(),
+            index: 0,
+        }
+    }
+
+    /// Find enum variant by number or return default (first) enum value
+    pub fn value_by_number_or_default(&self, number: i32) -> EnumValueDescriptor {
+        self.value_by_number(number)
+            .unwrap_or_else(|| self.default_value())
+    }
+
+    /// Check if this enum descriptor corresponds given enum type
+    ///
+    /// ```
+    /// # use protobuf::EnumFull;
+    /// # use protobuf::descriptor::field_descriptor_proto::Label;
+    /// # use protobuf::reflect::EnumDescriptor;
+    ///
+    /// # if !cfg!(miri) {
+    /// let descriptor: EnumDescriptor = Label::enum_descriptor();
+    ///
+    /// assert!(descriptor.is::<Label>())
+    /// }
+    /// ```
+    pub fn is<E: Enum>(&self) -> bool {
+        match self.get_impl() {
+            EnumDescriptorImplRef::Generated(g) => g.type_id == TypeId::of::<E>(),
+            EnumDescriptorImplRef::Dynamic => false,
+        }
+    }
+}
+
+enum EnumDescriptorImplRef {
+    Generated(&'static GeneratedEnumDescriptor),
+    Dynamic,
+}
+
+#[cfg(test)]
+mod test {
+    use crate::descriptor::field_descriptor_proto::Label;
+    use crate::descriptor::field_descriptor_proto::Type;
+    use crate::descriptor::FieldDescriptorProto;
+    use crate::well_known_types::struct_::NullValue;
+    use crate::EnumFull;
+    use crate::MessageFull;
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Too slow on Miri.
+    fn enclosing_message() {
+        assert_eq!(
+            Some(FieldDescriptorProto::descriptor()),
+            Type::enum_descriptor().enclosing_message()
+        );
+        assert_eq!(None, NullValue::enum_descriptor().enclosing_message());
+    }
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Too slow on Miri.
+    fn to_string() {
+        assert_eq!(
+            "google.protobuf.FieldDescriptorProto.Label",
+            Label::enum_descriptor().to_string()
+        );
+        assert_eq!(
+            "google.protobuf.FieldDescriptorProto.Label",
+            Label::enum_descriptor().full_name()
+        );
+        assert_eq!(
+            "google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED",
+            Label::LABEL_REPEATED.descriptor().to_string()
+        );
+        assert_eq!(
+            "google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED",
+            Label::LABEL_REPEATED.descriptor().full_name()
+        );
+    }
+}
diff --git a/src/reflect/error.rs b/src/reflect/error.rs
new file mode 100644
index 0000000..0b975cf
--- /dev/null
+++ b/src/reflect/error.rs
@@ -0,0 +1,26 @@
+#[derive(Debug, thiserror::Error)]
+pub(crate) enum ReflectError {
+    #[error("Message `{}` not found in files: {}", .0, .1)]
+    MessageNotFoundInFiles(String, String),
+    #[error("Dependency `{}` of `{}` not found; all deps: {}", .0, .1, .2)]
+    DependencyNotFound(String, String, String),
+    #[error("Non-unique dependencies given: {}", .0)]
+    NonUniqueDependencies(String),
+    #[error("Non-unique field name: `{0}`")]
+    NonUniqueFieldName(String),
+    #[error("Non-unique file descriptor: `{0}`")]
+    NonUniqueFileDescriptor(String),
+    #[error("Cycle in provided file descriptors")]
+    CycleInFileDescriptors,
+    #[error("Map entry message name must end with `Entry`")]
+    MapEntryNameMustEndWithEntry,
+    #[error("Map entry message must have no extensions, nested messages or enums")]
+    MapEntryMustHaveNo,
+    #[error(
+        "Map entry message must have two optional fields, \
+        numbered 1 and 2 and named `key` and `value`"
+    )]
+    MapEntryIncorrectFields,
+    #[error("Could not parse default value for field {0}")]
+    CouldNotParseDefaultValueForField(String),
+}
diff --git a/src/reflect/field.rs b/src/reflect/field.rs
deleted file mode 100644
index 09ee222..0000000
--- a/src/reflect/field.rs
+++ /dev/null
@@ -1,245 +0,0 @@
-use crate::descriptor::FieldDescriptorProto;
-use crate::descriptor::FieldDescriptorProto_Label;
-use crate::json::json_name;
-use crate::message::Message;
-use crate::reflect::acc::Accessor;
-use crate::reflect::acc::FieldAccessor;
-use crate::reflect::map::ReflectMap;
-use crate::reflect::repeated::ReflectRepeated;
-use crate::reflect::EnumValueDescriptor;
-use crate::reflect::ReflectValueRef;
-
-/// Reference to a value stored in a field, optional, repeated or map.
-// TODO: implement Eq
-pub enum ReflectFieldRef<'a> {
-    /// Singular field, optional or required in proto3 and just plain field in proto3
-    Optional(Option<ReflectValueRef<'a>>),
-    /// Repeated field
-    Repeated(&'a dyn ReflectRepeated),
-    /// Map field
-    Map(&'a dyn ReflectMap),
-}
-
-/// Field descriptor.
-///
-/// Can be used for runtime reflection.
-pub struct FieldDescriptor {
-    proto: &'static FieldDescriptorProto,
-    accessor: FieldAccessor,
-    json_name: String,
-}
-
-impl FieldDescriptor {
-    pub(crate) fn new(
-        accessor: FieldAccessor,
-        proto: &'static FieldDescriptorProto,
-    ) -> FieldDescriptor {
-        assert_eq!(proto.get_name(), accessor.name);
-        let json_name = if !proto.get_json_name().is_empty() {
-            proto.get_json_name().to_string()
-        } else {
-            json_name(proto.get_name())
-        };
-        FieldDescriptor {
-            proto,
-            accessor,
-            // probably could be lazy-init
-            json_name,
-        }
-    }
-
-    /// Get `.proto` description of field
-    pub fn proto(&self) -> &'static FieldDescriptorProto {
-        self.proto
-    }
-
-    /// Field name as specified in `.proto` file
-    pub fn name(&self) -> &'static str {
-        self.proto.get_name()
-    }
-
-    /// JSON field name.
-    ///
-    /// Can be different from `.proto` field name.
-    ///
-    /// See [JSON mapping][json] for details.
-    ///
-    /// [json]: https://developers.google.com/protocol-buffers/docs/proto3#json
-    pub fn json_name(&self) -> &str {
-        &self.json_name
-    }
-
-    /// If this field repeated?
-    pub fn is_repeated(&self) -> bool {
-        self.proto.get_label() == FieldDescriptorProto_Label::LABEL_REPEATED
-    }
-
-    /// Check if field is set in given message.
-    ///
-    /// For repeated field or map field return `true` if
-    /// collection is not empty.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type.
-    pub fn has_field(&self, m: &dyn Message) -> bool {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.has_field_generic(m),
-        }
-    }
-
-    /// Return length of repeated field.
-    ///
-    /// For singular field return `1` if field is set and `0` otherwise.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type.
-    pub fn len_field(&self, m: &dyn Message) -> usize {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.len_field_generic(m),
-        }
-    }
-
-    /// Get message field or default instance if field is unset.
-    ///
-    /// # Panics
-    /// If this field belongs to a different message type or
-    /// field type is not message.
-    pub fn get_message<'a>(&self, m: &'a dyn Message) -> &'a dyn Message {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_message_generic(m),
-        }
-    }
-
-    /// Get `enum` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `enum`.
-    pub fn get_enum(&self, m: &dyn Message) -> &'static EnumValueDescriptor {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_enum_generic(m),
-        }
-    }
-
-    /// Get `string` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `string`.
-    pub fn get_str<'a>(&self, m: &'a dyn Message) -> &'a str {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_str_generic(m),
-        }
-    }
-
-    /// Get `bytes` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `bytes`.
-    pub fn get_bytes<'a>(&self, m: &'a dyn Message) -> &'a [u8] {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_bytes_generic(m),
-        }
-    }
-
-    /// Get `u32` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `u32`.
-    pub fn get_u32(&self, m: &dyn Message) -> u32 {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_u32_generic(m),
-        }
-    }
-
-    /// Get `u64` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `u64`.
-    pub fn get_u64(&self, m: &dyn Message) -> u64 {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_u64_generic(m),
-        }
-    }
-
-    /// Get `i32` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `i32`.
-    pub fn get_i32(&self, m: &dyn Message) -> i32 {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_i32_generic(m),
-        }
-    }
-
-    /// Get `i64` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `i64`.
-    pub fn get_i64(&self, m: &dyn Message) -> i64 {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_i64_generic(m),
-        }
-    }
-
-    /// Get `bool` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type or
-    /// field type is not singular `bool`.
-    pub fn get_bool(&self, m: &dyn Message) -> bool {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_bool_generic(m),
-        }
-    }
-
-    /// Get `float` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type or
-    /// field type is not singular `float`.
-    pub fn get_f32(&self, m: &dyn Message) -> f32 {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_f32_generic(m),
-        }
-    }
-
-    /// Get `double` field.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type
-    /// or field type is not singular `double`.
-    pub fn get_f64(&self, m: &dyn Message) -> f64 {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_f64_generic(m),
-        }
-    }
-
-    /// Get field of any type.
-    ///
-    /// # Panics
-    ///
-    /// If this field belongs to a different message type.
-    pub fn get_reflect<'a>(&self, m: &'a dyn Message) -> ReflectFieldRef<'a> {
-        match &self.accessor.accessor {
-            Accessor::V1(a) => a.get_reflect(m),
-        }
-    }
-}
diff --git a/src/reflect/field/dynamic.rs b/src/reflect/field/dynamic.rs
new file mode 100644
index 0000000..f8bc1b3
--- /dev/null
+++ b/src/reflect/field/dynamic.rs
@@ -0,0 +1,36 @@
+use crate::message_dyn::MessageDyn;
+use crate::reflect::dynamic::DynamicMessage;
+use crate::reflect::FieldDescriptor;
+use crate::reflect::ReflectFieldRef;
+use crate::reflect::ReflectMapMut;
+use crate::reflect::ReflectRepeatedMut;
+use crate::reflect::ReflectValueBox;
+
+pub(crate) struct DynamicFieldDescriptorRef<'a> {
+    pub(crate) field: &'a FieldDescriptor,
+}
+
+impl<'a> DynamicFieldDescriptorRef<'a> {
+    pub(crate) fn get_reflect<'b>(&self, message: &'b dyn MessageDyn) -> ReflectFieldRef<'b> {
+        DynamicMessage::downcast_ref(message).get_reflect(&self.field)
+    }
+
+    pub(crate) fn mut_repeated<'b>(
+        &self,
+        message: &'b mut dyn MessageDyn,
+    ) -> ReflectRepeatedMut<'b> {
+        DynamicMessage::downcast_mut(message).mut_repeated(&self.field)
+    }
+
+    pub(crate) fn mut_map<'b>(&self, message: &'b mut dyn MessageDyn) -> ReflectMapMut<'b> {
+        DynamicMessage::downcast_mut(message).mut_map(&self.field)
+    }
+
+    pub(crate) fn set_field(&self, message: &mut dyn MessageDyn, value: ReflectValueBox) {
+        DynamicMessage::downcast_mut(message).set_field(&self.field, value)
+    }
+
+    pub(crate) fn clear_field(&self, message: &mut dyn MessageDyn) {
+        DynamicMessage::downcast_mut(message).clear_field(&self.field)
+    }
+}
diff --git a/src/reflect/field/index.rs b/src/reflect/field/index.rs
new file mode 100644
index 0000000..2e34c72
--- /dev/null
+++ b/src/reflect/field/index.rs
@@ -0,0 +1,201 @@
+use protobuf_support::json_name::json_name;
+
+use crate::descriptor::field_descriptor_proto::Type;
+use crate::descriptor::FieldDescriptorProto;
+use crate::descriptor::FileDescriptorProto;
+use crate::owning_ref::OwningRef;
+use crate::reflect::error::ReflectError;
+use crate::reflect::field::protobuf_field_type::ProtobufFieldType;
+use crate::reflect::file::building::FileDescriptorBuilding;
+use crate::reflect::protobuf_type_box::ProtobufType;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::EnumValueDescriptor;
+use crate::reflect::FieldDescriptor;
+use crate::reflect::FileDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+#[derive(Debug)]
+pub(crate) enum ForwardProtobufTypeBox {
+    ProtobufTypeBox(ProtobufType),
+    CurrentFileEnum(usize),
+    CurrentFileMessage(usize),
+}
+
+impl ForwardProtobufTypeBox {
+    pub(crate) fn message(message: MessageDescriptor) -> ForwardProtobufTypeBox {
+        ForwardProtobufTypeBox::ProtobufTypeBox(ProtobufType::message(message))
+    }
+
+    pub(crate) fn enumeration(enumeration: EnumDescriptor) -> ForwardProtobufTypeBox {
+        ForwardProtobufTypeBox::ProtobufTypeBox(ProtobufType::enumeration(enumeration))
+    }
+
+    pub(crate) fn from_proto_type(t: Type) -> ForwardProtobufTypeBox {
+        ForwardProtobufTypeBox::ProtobufTypeBox(ProtobufType::from_proto_type(t))
+    }
+
+    pub(crate) fn resolve(&self, file: &FileDescriptor) -> ProtobufType {
+        match self {
+            ForwardProtobufTypeBox::ProtobufTypeBox(t) => t.clone(),
+            ForwardProtobufTypeBox::CurrentFileMessage(m) => {
+                ProtobufType::message(MessageDescriptor::new(file.clone(), *m))
+            }
+            ForwardProtobufTypeBox::CurrentFileEnum(m) => {
+                ProtobufType::enumeration(EnumDescriptor::new(file.clone(), *m))
+            }
+        }
+    }
+
+    pub(crate) fn resolve_message(&self, file: &FileDescriptor) -> MessageDescriptor {
+        match self.resolve(file).runtime() {
+            RuntimeType::Message(m) => m.clone(),
+            _ => panic!("not message"),
+        }
+    }
+}
+
+#[derive(Debug)]
+pub(crate) enum ForwardProtobufFieldType {
+    Singular(ForwardProtobufTypeBox),
+    Repeated(ForwardProtobufTypeBox),
+    Map(ForwardProtobufTypeBox, ForwardProtobufTypeBox),
+}
+
+impl ForwardProtobufFieldType {
+    pub(crate) fn resolve(&self, file: &FileDescriptor) -> ProtobufFieldType {
+        match self {
+            ForwardProtobufFieldType::Singular(t) => ProtobufFieldType::Singular(t.resolve(file)),
+            ForwardProtobufFieldType::Repeated(t) => ProtobufFieldType::Repeated(t.resolve(file)),
+            ForwardProtobufFieldType::Map(k, v) => {
+                ProtobufFieldType::Map(k.resolve(file), v.resolve(file))
+            }
+        }
+    }
+}
+
+#[derive(Debug)]
+pub(crate) enum FieldDefaultValue {
+    ReflectValueBox(ReflectValueBox),
+    Enum(usize),
+}
+
+#[derive(Debug)]
+pub(crate) enum FieldKind {
+    MessageField(
+        /// Message index.
+        usize,
+    ),
+    Extension(
+        /// Message index or `None` for file.
+        Option<usize>,
+        ForwardProtobufTypeBox,
+    ),
+}
+
+#[derive(Debug)]
+pub(crate) struct FieldIndex {
+    pub(crate) proto: OwningRef<FileDescriptorProto, FieldDescriptorProto>,
+    pub(crate) kind: FieldKind,
+    pub(crate) json_name: String,
+    pub(crate) field_type: ForwardProtobufFieldType,
+    pub(crate) default_value: Option<FieldDefaultValue>,
+}
+
+impl FieldIndex {
+    fn enum_default_value(
+        field: &FieldDescriptorProto,
+        building: &FileDescriptorBuilding,
+    ) -> crate::Result<FieldDefaultValue> {
+        let en = building.find_enum(field.type_name());
+        let (n, _) = match en
+            .value
+            .iter()
+            .enumerate()
+            .find(|(_n, v)| v.name() == field.default_value())
+        {
+            Some(v) => v,
+            None => Err(ReflectError::CouldNotParseDefaultValueForField(
+                field.name().to_owned(),
+            ))?,
+        };
+        Ok(FieldDefaultValue::Enum(n))
+    }
+
+    fn parse_default_value(
+        field: &FieldDescriptorProto,
+        building: &FileDescriptorBuilding,
+    ) -> crate::Result<FieldDefaultValue> {
+        Ok(FieldDefaultValue::ReflectValueBox(match field.type_() {
+            Type::TYPE_GROUP | Type::TYPE_MESSAGE => {
+                return Err(ReflectError::CouldNotParseDefaultValueForField(
+                    field.name().to_owned(),
+                )
+                .into());
+            }
+            Type::TYPE_ENUM => {
+                return Self::enum_default_value(field, building);
+            }
+            t => RuntimeType::from_proto_type(t)
+                .parse_proto_default_value(field.default_value())
+                .map_err(|()| {
+                    ReflectError::CouldNotParseDefaultValueForField(field.name().to_owned())
+                })?,
+        }))
+    }
+
+    pub(crate) fn index(
+        containing_message: Option<usize>,
+        field: OwningRef<FileDescriptorProto, FieldDescriptorProto>,
+        building: &FileDescriptorBuilding,
+    ) -> crate::Result<FieldIndex> {
+        let default_value = if field.has_default_value() {
+            Some(Self::parse_default_value(&field, building)?)
+        } else {
+            None
+        };
+
+        let json_name = if !field.json_name().is_empty() {
+            field.json_name().to_owned()
+        } else {
+            json_name(field.name())
+        };
+
+        let extendee = if field.has_extendee() {
+            Some(building.resolve_message(field.extendee())?)
+        } else {
+            None
+        };
+
+        let kind = match (containing_message, extendee) {
+            (Some(m), None) => FieldKind::MessageField(m),
+            (m, Some(extendee)) => FieldKind::Extension(m, extendee),
+            (None, None) => panic!("field must be in a message or an extension"),
+        };
+
+        let field_type = building.resolve_field_type(&field)?;
+        Ok(FieldIndex {
+            proto: field,
+            kind,
+            default_value,
+            json_name,
+            field_type,
+        })
+    }
+
+    pub(crate) fn default_value<'a>(&'a self, field: &FieldDescriptor) -> ReflectValueRef<'a> {
+        match &self.default_value {
+            Some(FieldDefaultValue::ReflectValueBox(v)) => v.as_value_ref(),
+            Some(FieldDefaultValue::Enum(v)) => match field.singular_runtime_type() {
+                RuntimeType::Enum(e) => {
+                    let ev = EnumValueDescriptor::new(e.clone(), *v);
+                    ReflectValueRef::from(ev)
+                }
+                t => panic!("wrong type {:?} for default value enum", t),
+            },
+            None => field.singular_runtime_type().default_value_ref(),
+        }
+    }
+}
diff --git a/src/reflect/field/mod.rs b/src/reflect/field/mod.rs
new file mode 100644
index 0000000..3da38ca
--- /dev/null
+++ b/src/reflect/field/mod.rs
@@ -0,0 +1,585 @@
+use std::fmt;
+
+use crate::descriptor::field_descriptor_proto;
+use crate::descriptor::FieldDescriptorProto;
+use crate::message_dyn::MessageDyn;
+use crate::reflect::acc::v2::map::MapFieldAccessorHolder;
+use crate::reflect::acc::v2::repeated::RepeatedFieldAccessorHolder;
+use crate::reflect::acc::v2::singular::SingularFieldAccessorHolder;
+use crate::reflect::acc::v2::AccessorV2;
+use crate::reflect::acc::GeneratedFieldAccessor;
+use crate::reflect::dynamic::DynamicMessage;
+use crate::reflect::field::dynamic::DynamicFieldDescriptorRef;
+use crate::reflect::field::index::FieldIndex;
+use crate::reflect::field::index::FieldKind;
+use crate::reflect::field::protobuf_field_type::ProtobufFieldType;
+use crate::reflect::field::runtime_field_type::RuntimeFieldType;
+use crate::reflect::map::ReflectMapMut;
+use crate::reflect::map::ReflectMapRef;
+use crate::reflect::message::message_ref::MessageRef;
+use crate::reflect::message::MessageDescriptorImplRef;
+use crate::reflect::oneof::OneofDescriptor;
+use crate::reflect::protobuf_type_box::ProtobufType;
+use crate::reflect::reflect_eq::ReflectEq;
+use crate::reflect::reflect_eq::ReflectEqMode;
+use crate::reflect::repeated::ReflectRepeatedMut;
+use crate::reflect::repeated::ReflectRepeatedRef;
+use crate::reflect::value::value_ref::ReflectValueMut;
+use crate::reflect::FileDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ReflectOptionalRef;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+pub(crate) mod dynamic;
+pub(crate) mod index;
+pub(crate) mod protobuf_field_type;
+pub(crate) mod runtime_field_type;
+
+/// Reference to a value stored in a field, optional, repeated or map.
+#[derive(PartialEq)]
+pub enum ReflectFieldRef<'a> {
+    /// Singular field, optional or required in proto3 and just plain field in proto3
+    Optional(ReflectOptionalRef<'a>),
+    /// Repeated field
+    Repeated(ReflectRepeatedRef<'a>),
+    /// Map field
+    Map(ReflectMapRef<'a>),
+}
+
+impl<'a> ReflectFieldRef<'a> {
+    pub(crate) fn default_for_field(field: &FieldDescriptor) -> ReflectFieldRef<'a> {
+        match field.runtime_field_type() {
+            RuntimeFieldType::Singular(elem) => {
+                ReflectFieldRef::Optional(ReflectOptionalRef::none(elem))
+            }
+            RuntimeFieldType::Repeated(elem) => {
+                ReflectFieldRef::Repeated(ReflectRepeatedRef::new_empty(elem))
+            }
+            RuntimeFieldType::Map(k, v) => ReflectFieldRef::Map(ReflectMapRef::new_empty(k, v)),
+        }
+    }
+}
+
+impl<'a> ReflectEq for ReflectFieldRef<'a> {
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
+        match (self, that) {
+            (ReflectFieldRef::Optional(a), ReflectFieldRef::Optional(b)) => {
+                match (a.value(), b.value()) {
+                    (Some(av), Some(bv)) => av.reflect_eq(&bv, mode),
+                    (None, None) => true,
+                    _ => false,
+                }
+            }
+            (ReflectFieldRef::Repeated(a), ReflectFieldRef::Repeated(b)) => a.reflect_eq(b, mode),
+            (ReflectFieldRef::Map(a), ReflectFieldRef::Map(b)) => a.reflect_eq(b, mode),
+            _ => false,
+        }
+    }
+}
+
+fn _assert_sync<'a>() {
+    fn _assert_send_sync<T: Sync>() {}
+    _assert_send_sync::<ReflectFieldRef<'a>>();
+}
+
+/// Field descriptor.
+///
+/// Can be used for runtime reflection.
+#[derive(Eq, PartialEq, Clone)]
+pub struct FieldDescriptor {
+    pub(crate) file_descriptor: FileDescriptor,
+    pub(crate) index: usize,
+}
+
+impl fmt::Display for FieldDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match &self.index().kind {
+            FieldKind::MessageField(m) => write!(
+                f,
+                "{}.{}",
+                self.file_descriptor.message_by_index(*m),
+                self.name()
+            ),
+            FieldKind::Extension(Some(m), _) => write!(
+                f,
+                "{}.{}",
+                self.file_descriptor.message_by_index(*m),
+                self.name()
+            ),
+            FieldKind::Extension(None, _) => {
+                if self.file_descriptor.proto().package().is_empty() {
+                    write!(f, "{}", self.name())
+                } else {
+                    write!(
+                        f,
+                        "{}.{}",
+                        self.file_descriptor.proto().package(),
+                        self.name()
+                    )
+                }
+            }
+        }
+    }
+}
+
+impl FieldDescriptor {
+    pub(crate) fn regular(&self) -> (MessageDescriptor, usize) {
+        match self.index().kind {
+            FieldKind::MessageField(_) => {
+                let m = self.containing_message();
+                (
+                    m.clone(),
+                    self.index - m.index().message_index.first_field_index,
+                )
+            }
+            // TODO: implement and remove.
+            _ => panic!("regular field"),
+        }
+    }
+
+    pub(crate) fn file_descriptor(&self) -> &FileDescriptor {
+        &self.file_descriptor
+    }
+
+    /// Get `.proto` description of field
+    pub fn proto(&self) -> &FieldDescriptorProto {
+        &self.index().proto
+    }
+
+    /// Field name as specified in `.proto` file.
+    pub fn name(&self) -> &str {
+        self.proto().name()
+    }
+
+    /// Field number as specified in `.proto` file.
+    pub fn number(&self) -> i32 {
+        self.proto().number()
+    }
+
+    /// Fully qualified name of the field: fully qualified name of the declaring type
+    /// followed by the field name.
+    ///
+    /// Declaring type is a message (for regular field or extensions) or a package
+    /// (for top-level extensions).
+    pub fn full_name(&self) -> String {
+        self.to_string()
+    }
+
+    /// Oneof descriptor containing this field. Do not skip synthetic oneofs.
+    pub fn containing_oneof_including_synthetic(&self) -> Option<OneofDescriptor> {
+        if let FieldKind::MessageField(..) = self.index().kind {
+            let proto = self.proto();
+            if proto.has_oneof_index() {
+                Some(OneofDescriptor {
+                    file_descriptor: self.file_descriptor().clone(),
+                    index: self.containing_message().index().oneofs.start
+                        + proto.oneof_index() as usize,
+                })
+            } else {
+                None
+            }
+        } else {
+            None
+        }
+    }
+
+    /// Oneof containing this field.
+    ///
+    /// Return `None` if this field is not part of oneof or if it is synthetic oneof.
+    pub fn containing_oneof(&self) -> Option<OneofDescriptor> {
+        self.containing_oneof_including_synthetic()
+            .filter(|o| !o.is_synthetic())
+    }
+
+    /// Message which declares this field (for extension, **not** the message we extend).
+    fn _declaring_message(&self) -> Option<MessageDescriptor> {
+        match &self.index().kind {
+            FieldKind::MessageField(m) => Some(self.file_descriptor.message_by_index(*m)),
+            FieldKind::Extension(m, _) => Some(self.file_descriptor.message_by_index(*m.as_ref()?)),
+        }
+    }
+
+    /// Message which contains this field.
+    ///
+    /// For extension fields, this is the message being extended.
+    pub fn containing_message(&self) -> MessageDescriptor {
+        match &self.index().kind {
+            FieldKind::MessageField(m) => self.file_descriptor().message_by_index(*m),
+            FieldKind::Extension(_, extendee) => extendee.resolve_message(self.file_descriptor()),
+        }
+    }
+
+    fn index(&self) -> &FieldIndex {
+        &self.file_descriptor.common().fields[self.index]
+    }
+
+    fn index_with_message_lifetime<'a>(&self, m: &'a dyn MessageDyn) -> &'a FieldIndex {
+        let (descriptor, index) = self.regular();
+        let file_fields = match self.singular() {
+            SingularFieldAccessorRef::Generated(..) => {
+                &descriptor
+                    .file_descriptor
+                    .common_for_generated_descriptor()
+                    .fields
+            }
+            SingularFieldAccessorRef::Dynamic(..) => {
+                &DynamicMessage::downcast_ref(m)
+                    .descriptor()
+                    .file_descriptor
+                    .common()
+                    .fields
+            }
+        };
+        &descriptor.index().message_index.slice_fields(file_fields)[index]
+    }
+
+    /// JSON field name.
+    ///
+    /// Can be different from `.proto` field name.
+    ///
+    /// See [JSON mapping][json] for details.
+    ///
+    /// [json]: https://developers.google.com/protocol-buffers/docs/proto3#json
+    pub fn json_name(&self) -> &str {
+        &self.index().json_name
+    }
+
+    /// If this field is optional or required.
+    pub fn is_singular(&self) -> bool {
+        match self.proto().label() {
+            field_descriptor_proto::Label::LABEL_REQUIRED => true,
+            field_descriptor_proto::Label::LABEL_OPTIONAL => true,
+            field_descriptor_proto::Label::LABEL_REPEATED => false,
+        }
+    }
+
+    /// Is this field required.
+    pub fn is_required(&self) -> bool {
+        self.proto().label() == field_descriptor_proto::Label::LABEL_REQUIRED
+    }
+
+    /// If this field repeated or map?
+    pub fn is_repeated_or_map(&self) -> bool {
+        self.proto().label() == field_descriptor_proto::Label::LABEL_REPEATED
+    }
+
+    /// Is this field repeated, but not map field?
+    pub fn is_repeated(&self) -> bool {
+        match self.runtime_field_type() {
+            RuntimeFieldType::Repeated(..) => true,
+            _ => false,
+        }
+    }
+
+    fn get_impl(&self) -> FieldDescriptorImplRef {
+        let (descriptor, index) = self.regular();
+        match descriptor.get_impl() {
+            MessageDescriptorImplRef::Generated(g) => {
+                FieldDescriptorImplRef::Generated(&g.non_map().fields[index].accessor)
+            }
+            MessageDescriptorImplRef::Dynamic => {
+                FieldDescriptorImplRef::Dynamic(DynamicFieldDescriptorRef { field: self })
+            }
+        }
+    }
+
+    /// If this field a map field?
+    pub fn is_map(&self) -> bool {
+        match self.runtime_field_type() {
+            RuntimeFieldType::Map(..) => true,
+            _ => false,
+        }
+    }
+
+    /// Check if field is set in given message.
+    ///
+    /// For repeated field or map field return `true` if
+    /// collection is not empty.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type.
+    pub fn has_field(&self, m: &dyn MessageDyn) -> bool {
+        match self.get_reflect(m) {
+            ReflectFieldRef::Optional(v) => v.value().is_some(),
+            ReflectFieldRef::Repeated(r) => !r.is_empty(),
+            ReflectFieldRef::Map(m) => !m.is_empty(),
+        }
+    }
+
+    // accessors
+
+    fn singular(&self) -> SingularFieldAccessorRef {
+        match self.get_impl() {
+            FieldDescriptorImplRef::Generated(GeneratedFieldAccessor::V2(
+                AccessorV2::Singular(ref a),
+            )) => SingularFieldAccessorRef::Generated(a),
+            FieldDescriptorImplRef::Generated(GeneratedFieldAccessor::V2(..)) => {
+                panic!("not a singular field: {}", self)
+            }
+            FieldDescriptorImplRef::Dynamic(d) => SingularFieldAccessorRef::Dynamic(d),
+        }
+    }
+
+    fn repeated(&self) -> RepeatedFieldAccessorRef {
+        match self.get_impl() {
+            FieldDescriptorImplRef::Generated(GeneratedFieldAccessor::V2(
+                AccessorV2::Repeated(ref a),
+            )) => RepeatedFieldAccessorRef::Generated(a),
+            FieldDescriptorImplRef::Generated(GeneratedFieldAccessor::V2(..)) => {
+                panic!("not a repeated field: {}", self)
+            }
+            FieldDescriptorImplRef::Dynamic(d) => RepeatedFieldAccessorRef::Dynamic(d),
+        }
+    }
+
+    fn map(&self) -> MapFieldAccessorRef {
+        match self.get_impl() {
+            FieldDescriptorImplRef::Generated(GeneratedFieldAccessor::V2(AccessorV2::Map(
+                ref a,
+            ))) => MapFieldAccessorRef::Generated(a),
+            FieldDescriptorImplRef::Generated(GeneratedFieldAccessor::V2(..)) => {
+                panic!("not a map field: {}", self)
+            }
+            FieldDescriptorImplRef::Dynamic(d) => MapFieldAccessorRef::Dynamic(d),
+        }
+    }
+
+    /// Obtain type of map key and value.
+    pub(crate) fn map_proto_type(&self) -> (ProtobufType, ProtobufType) {
+        match self.protobuf_field_type() {
+            ProtobufFieldType::Map(k, v) => (k, v),
+            _ => panic!("not a map field: {}", self),
+        }
+    }
+
+    /// Get message field or default instance if field is unset.
+    ///
+    /// # Panics
+    /// If this field belongs to a different message type or
+    /// field type is not message.
+    pub fn get_message<'a>(&self, m: &'a dyn MessageDyn) -> MessageRef<'a> {
+        match self.get_singular_field_or_default(m) {
+            ReflectValueRef::Message(m) => m,
+            _ => panic!("not message field: {}", self),
+        }
+    }
+
+    /// Get a mutable reference to a message field.
+    /// Initialize field with default message if unset.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or
+    /// field type is not singular message.
+    pub fn mut_message<'a>(&self, m: &'a mut dyn MessageDyn) -> &'a mut dyn MessageDyn {
+        match self.mut_singular_field_or_default(m) {
+            ReflectValueMut::Message(m) => m,
+        }
+    }
+
+    /// Default value.
+    ///
+    /// # Panics
+    ///
+    /// If field is not singular.
+    pub fn singular_default_value(&self) -> ReflectValueRef {
+        self.index().default_value(self)
+    }
+
+    /// Get singular field value.
+    ///
+    /// Return field default value if field is unset.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or fields is not singular.
+    pub fn get_singular_field_or_default<'a>(&self, m: &'a dyn MessageDyn) -> ReflectValueRef<'a> {
+        match self.get_singular(m) {
+            Some(m) => m,
+            None => self.index_with_message_lifetime(m).default_value(self),
+        }
+    }
+
+    // Not public because it is not implemented for all types
+    fn mut_singular_field_or_default<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectValueMut<'a> {
+        match self.singular() {
+            SingularFieldAccessorRef::Generated(g) => g.accessor.mut_field_or_default(m),
+            SingularFieldAccessorRef::Dynamic(..) => {
+                DynamicMessage::downcast_mut(m).mut_singular_field_or_default(self)
+            }
+        }
+    }
+
+    /// Runtime representation of singular field.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or field is not singular.
+    pub fn singular_runtime_type(&self) -> RuntimeType {
+        match self.runtime_field_type() {
+            RuntimeFieldType::Singular(s) => s,
+            _ => panic!("Not a singular field: {}", self),
+        }
+    }
+
+    /// Set singular field.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or
+    /// field is not singular or value is of different type.
+    pub fn set_singular_field(&self, m: &mut dyn MessageDyn, value: ReflectValueBox) {
+        match self.singular() {
+            SingularFieldAccessorRef::Generated(g) => g.accessor.set_field(m, value),
+            SingularFieldAccessorRef::Dynamic(d) => d.set_field(m, value),
+        }
+    }
+
+    /// Clear a field.
+    pub fn clear_field(&self, m: &mut dyn MessageDyn) {
+        if self.is_singular() {
+            match self.singular() {
+                SingularFieldAccessorRef::Generated(g) => g.accessor.clear_field(m),
+                SingularFieldAccessorRef::Dynamic(d) => d.clear_field(m),
+            }
+        } else if self.is_repeated() {
+            self.mut_repeated(m).clear();
+        } else if self.is_map() {
+            self.mut_map(m).clear();
+        }
+    }
+
+    /// Dynamic representation of field type with wire type.
+    pub(crate) fn protobuf_field_type(&self) -> ProtobufFieldType {
+        self.index().field_type.resolve(self.file_descriptor())
+    }
+
+    /// Dynamic representation of field type.
+    pub fn runtime_field_type(&self) -> RuntimeFieldType {
+        self.protobuf_field_type().runtime()
+    }
+
+    /// Get field of any type.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type.
+    pub fn get_reflect<'a>(&self, m: &'a dyn MessageDyn) -> ReflectFieldRef<'a> {
+        match self.get_impl() {
+            FieldDescriptorImplRef::Generated(g) => g.get_reflect(m),
+            FieldDescriptorImplRef::Dynamic(d) => d.get_reflect(m),
+        }
+    }
+
+    /// Get singular field value.
+    ///
+    /// Return `None` if field is unset.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or fields is not singular.
+    pub fn get_singular<'a>(&self, m: &'a dyn MessageDyn) -> Option<ReflectValueRef<'a>> {
+        match self.get_reflect(m) {
+            ReflectFieldRef::Optional(o) => o.value(),
+            _ => panic!("not a singular field"),
+        }
+    }
+
+    // repeated
+
+    /// Get repeated field.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or field is not repeated.
+    pub fn get_repeated<'a>(&self, m: &'a dyn MessageDyn) -> ReflectRepeatedRef<'a> {
+        match self.get_reflect(m) {
+            ReflectFieldRef::Repeated(r) => r,
+            _ => panic!("not a repeated field"),
+        }
+    }
+
+    /// Get a mutable reference to `repeated` field.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or field is not `repeated`.
+    pub fn mut_repeated<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectRepeatedMut<'a> {
+        match self.repeated() {
+            RepeatedFieldAccessorRef::Generated(g) => g.accessor.mut_repeated(m),
+            RepeatedFieldAccessorRef::Dynamic(d) => d.mut_repeated(m),
+        }
+    }
+
+    // map
+
+    /// Get `map` field.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or field is not `map`.
+    pub fn get_map<'a>(&self, m: &'a dyn MessageDyn) -> ReflectMapRef<'a> {
+        match self.get_reflect(m) {
+            ReflectFieldRef::Map(m) => m,
+            _ => panic!("not a map field"),
+        }
+    }
+
+    /// Get a mutable reference to `map` field.
+    ///
+    /// # Panics
+    ///
+    /// If this field belongs to a different message type or field is not `map`.
+    pub fn mut_map<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectMapMut<'a> {
+        match self.map() {
+            MapFieldAccessorRef::Generated(g) => g.accessor.mut_reflect(m),
+            MapFieldAccessorRef::Dynamic(d) => d.mut_map(m),
+        }
+    }
+}
+
+enum SingularFieldAccessorRef<'a> {
+    Generated(&'a SingularFieldAccessorHolder),
+    Dynamic(DynamicFieldDescriptorRef<'a>),
+}
+
+enum RepeatedFieldAccessorRef<'a> {
+    Generated(&'a RepeatedFieldAccessorHolder),
+    Dynamic(DynamicFieldDescriptorRef<'a>),
+}
+
+enum MapFieldAccessorRef<'a> {
+    Generated(&'a MapFieldAccessorHolder),
+    Dynamic(DynamicFieldDescriptorRef<'a>),
+}
+
+pub(crate) enum FieldDescriptorImplRef<'a> {
+    Generated(&'static GeneratedFieldAccessor),
+    Dynamic(DynamicFieldDescriptorRef<'a>),
+}
+
+#[cfg(test)]
+mod test {
+    use std::collections::HashMap;
+
+    use crate::descriptor::DescriptorProto;
+    use crate::reflect::ReflectValueBox;
+    use crate::well_known_types::struct_::Struct;
+    use crate::well_known_types::struct_::Value;
+    use crate::MessageFull;
+
+    #[test]
+    #[cfg_attr(miri, ignore)]
+    fn display() {
+        let field = DescriptorProto::descriptor()
+            .field_by_name("enum_type")
+            .unwrap();
+        assert_eq!(
+            "google.protobuf.DescriptorProto.enum_type",
+            field.to_string()
+        );
+    }
+}
diff --git a/src/reflect/field/protobuf_field_type.rs b/src/reflect/field/protobuf_field_type.rs
new file mode 100644
index 0000000..c50de04
--- /dev/null
+++ b/src/reflect/field/protobuf_field_type.rs
@@ -0,0 +1,25 @@
+use crate::reflect::protobuf_type_box::ProtobufType;
+use crate::reflect::RuntimeFieldType;
+
+/// Reflective representation of field type plus wire type.
+pub(crate) enum ProtobufFieldType {
+    /// Singular field (required, optional for proto2 or singular for proto3)
+    Singular(ProtobufType),
+    /// Repeated field
+    Repeated(ProtobufType),
+    /// Map field
+    Map(ProtobufType, ProtobufType),
+}
+
+impl ProtobufFieldType {
+    /// Drop wire type from the type.
+    pub fn runtime(&self) -> RuntimeFieldType {
+        match self {
+            ProtobufFieldType::Singular(t) => RuntimeFieldType::Singular(t.runtime().clone()),
+            ProtobufFieldType::Repeated(t) => RuntimeFieldType::Repeated(t.runtime().clone()),
+            ProtobufFieldType::Map(kt, vt) => {
+                RuntimeFieldType::Map(kt.runtime().clone(), vt.runtime().clone())
+            }
+        }
+    }
+}
diff --git a/src/reflect/field/runtime_field_type.rs b/src/reflect/field/runtime_field_type.rs
new file mode 100644
index 0000000..eba549b
--- /dev/null
+++ b/src/reflect/field/runtime_field_type.rs
@@ -0,0 +1,11 @@
+use crate::reflect::RuntimeType;
+
+/// Reflective representation of field type.
+pub enum RuntimeFieldType {
+    /// Singular field (required, optional for proto2 or singular for proto3)
+    Singular(RuntimeType),
+    /// Repeated field
+    Repeated(RuntimeType),
+    /// Map field
+    Map(RuntimeType, RuntimeType),
+}
diff --git a/src/reflect/file/building.rs b/src/reflect/file/building.rs
new file mode 100644
index 0000000..fb9eb54
--- /dev/null
+++ b/src/reflect/file/building.rs
@@ -0,0 +1,168 @@
+use std::collections::HashMap;
+use std::iter;
+
+use crate::descriptor::field_descriptor_proto;
+use crate::descriptor::DescriptorProto;
+use crate::descriptor::EnumDescriptorProto;
+use crate::descriptor::FieldDescriptorProto;
+use crate::descriptor::FileDescriptorProto;
+use crate::reflect::error::ReflectError;
+use crate::reflect::field::index::ForwardProtobufFieldType;
+use crate::reflect::field::index::ForwardProtobufTypeBox;
+use crate::reflect::file::index::MessageIndices;
+use crate::reflect::find_message_or_enum::find_message_or_enum;
+use crate::reflect::find_message_or_enum::MessageOrEnum;
+use crate::reflect::name::protobuf_name_starts_with_package;
+use crate::reflect::runtime_type_box::RuntimeType;
+use crate::reflect::FileDescriptor;
+
+pub(crate) struct FileDescriptorBuilding<'a> {
+    pub(crate) current_file_descriptor: &'a FileDescriptorProto,
+    pub(crate) deps_with_public: &'a [FileDescriptor],
+    pub(crate) message_by_name_to_package: &'a HashMap<String, usize>,
+    pub(crate) messages: &'a [MessageIndices],
+    pub(crate) enums_by_name_to_package: &'a HashMap<String, usize>,
+}
+
+impl<'a> FileDescriptorBuilding<'a> {
+    fn all_descriptors(&self) -> impl Iterator<Item = &'a FileDescriptorProto> {
+        iter::once(self.current_file_descriptor)
+            .chain(self.deps_with_public.iter().map(|d| d.proto()))
+    }
+
+    pub fn find_enum(&self, full_name: &str) -> &'a EnumDescriptorProto {
+        assert!(full_name.starts_with("."));
+
+        for file in self.all_descriptors() {
+            if let Some(name_to_package) =
+                protobuf_name_starts_with_package(full_name, file.package())
+            {
+                if let Some((_, me)) = find_message_or_enum(file, name_to_package) {
+                    match me {
+                        MessageOrEnum::Enum(e) => return e,
+                        MessageOrEnum::Message(_) => panic!("not an enum: {}", full_name),
+                    }
+                }
+            }
+        }
+
+        panic!(
+            "enum not found: {}, in files: {}",
+            full_name,
+            self.all_files_str()
+        );
+    }
+
+    fn all_files_str(&self) -> String {
+        self.all_descriptors()
+            .map(|d| d.name())
+            .collect::<Vec<_>>()
+            .join(", ")
+    }
+
+    pub(crate) fn resolve_field_type(
+        &self,
+        field: &FieldDescriptorProto,
+    ) -> crate::Result<ForwardProtobufFieldType> {
+        Ok(match field.label() {
+            field_descriptor_proto::Label::LABEL_OPTIONAL
+            | field_descriptor_proto::Label::LABEL_REQUIRED => {
+                ForwardProtobufFieldType::Singular(self.resolve_field_element_type(field)?)
+            }
+            field_descriptor_proto::Label::LABEL_REPEATED => {
+                let element = self.resolve_field_element_type(field)?;
+                let type_proto = match &element {
+                    ForwardProtobufTypeBox::CurrentFileMessage(m) => {
+                        Some(&*self.messages[*m].proto)
+                    }
+                    ForwardProtobufTypeBox::ProtobufTypeBox(t) => match t.runtime() {
+                        RuntimeType::Message(m) => Some(m.proto()),
+                        _ => None,
+                    },
+                    _ => None,
+                };
+                match type_proto {
+                    Some(m) if m.options.get_or_default().map_entry() => self.map_field(m)?,
+                    _ => ForwardProtobufFieldType::Repeated(element),
+                }
+            }
+        })
+    }
+
+    fn resolve_field_element_type(
+        &self,
+        field: &FieldDescriptorProto,
+    ) -> crate::Result<ForwardProtobufTypeBox> {
+        Ok(match field.type_() {
+            field_descriptor_proto::Type::TYPE_MESSAGE
+            | field_descriptor_proto::Type::TYPE_GROUP => {
+                self.resolve_message(field.type_name())?
+            }
+            field_descriptor_proto::Type::TYPE_ENUM => {
+                if let Some(name_to_package) = protobuf_name_starts_with_package(
+                    field.type_name(),
+                    self.current_file_descriptor.package(),
+                ) {
+                    if let Some(index) = self.enums_by_name_to_package.get(name_to_package) {
+                        return Ok(ForwardProtobufTypeBox::CurrentFileEnum(*index));
+                    }
+                }
+                for dep in self.deps_with_public {
+                    if let Some(m) = dep.enum_by_full_name(field.type_name()) {
+                        return Ok(ForwardProtobufTypeBox::enumeration(m));
+                    }
+                }
+                panic!(
+                    "enum not found: {}; files: {}",
+                    field.type_name(),
+                    self.all_files_str()
+                );
+            }
+            t => ForwardProtobufTypeBox::from_proto_type(t),
+        })
+    }
+
+    pub(crate) fn resolve_message(&self, type_name: &str) -> crate::Result<ForwardProtobufTypeBox> {
+        if let Some(name_to_package) =
+            protobuf_name_starts_with_package(type_name, self.current_file_descriptor.package())
+        {
+            if let Some(index) = self.message_by_name_to_package.get(name_to_package) {
+                return Ok(ForwardProtobufTypeBox::CurrentFileMessage(*index));
+            }
+        }
+        for dep in self.deps_with_public {
+            if let Some(m) = dep.message_by_full_name(type_name) {
+                return Ok(ForwardProtobufTypeBox::message(m));
+            }
+        }
+        Err(ReflectError::MessageNotFoundInFiles(type_name.to_owned(), self.all_files_str()).into())
+    }
+
+    fn map_field(&self, type_proto: &DescriptorProto) -> crate::Result<ForwardProtobufFieldType> {
+        assert!(type_proto.name().ends_with("Entry"));
+
+        assert_eq!(0, type_proto.extension.len());
+        assert_eq!(0, type_proto.extension_range.len());
+        assert_eq!(0, type_proto.nested_type.len());
+        assert_eq!(0, type_proto.enum_type.len());
+
+        assert_eq!(2, type_proto.field.len());
+        let key = &type_proto.field[0];
+        let value = &type_proto.field[1];
+
+        assert_eq!("key", key.name());
+        assert_eq!("value", value.name());
+
+        assert_eq!(1, key.number());
+        assert_eq!(2, value.number());
+
+        assert_eq!(field_descriptor_proto::Label::LABEL_OPTIONAL, key.label());
+        assert_eq!(field_descriptor_proto::Label::LABEL_OPTIONAL, value.label());
+
+        // It is OK to resolve using current descriptor because map field
+        // should always point to the same file.
+        let key = self.resolve_field_element_type(key)?;
+        let value = self.resolve_field_element_type(value)?;
+        Ok(ForwardProtobufFieldType::Map(key, value))
+    }
+}
diff --git a/src/reflect/file/dynamic.rs b/src/reflect/file/dynamic.rs
new file mode 100644
index 0000000..f577c92
--- /dev/null
+++ b/src/reflect/file/dynamic.rs
@@ -0,0 +1,63 @@
+use std::collections::HashMap;
+use std::sync::Arc;
+
+use crate::descriptor::FileDescriptorProto;
+use crate::owning_ref::OwningRef;
+use crate::reflect::error::ReflectError;
+use crate::reflect::file::index::FileDescriptorCommon;
+use crate::reflect::FileDescriptor;
+
+#[derive(Debug)]
+pub(crate) struct DynamicFileDescriptor {
+    pub(crate) proto: Arc<FileDescriptorProto>,
+    pub(crate) common: FileDescriptorCommon,
+}
+
+impl DynamicFileDescriptor {
+    pub(crate) fn new(
+        proto: FileDescriptorProto,
+        dependencies: &[FileDescriptor],
+    ) -> crate::Result<DynamicFileDescriptor> {
+        // Remove undeclared dependencies.
+        let dependencies_index: HashMap<_, &FileDescriptor> =
+            dependencies.iter().map(|d| (d.proto().name(), d)).collect();
+
+        if dependencies_index.len() != dependencies.len() {
+            return Err(ReflectError::NonUniqueDependencies(
+                dependencies
+                    .iter()
+                    .map(|d| d.proto().name())
+                    .collect::<Vec<_>>()
+                    .join(", "),
+            )
+            .into());
+        }
+
+        let dependencies: Vec<FileDescriptor> = proto
+            .dependency
+            .iter()
+            .map(|d| {
+                let dep = dependencies_index.get(d.as_str());
+                match dep {
+                    Some(dep) => Ok((*dep).clone()),
+                    None => Err(ReflectError::DependencyNotFound(
+                        d.clone(),
+                        proto.name().to_owned(),
+                        dependencies
+                            .iter()
+                            .map(|d| d.proto().name())
+                            .collect::<Vec<_>>()
+                            .join(", "),
+                    )
+                    .into()),
+                }
+            })
+            .collect::<crate::Result<Vec<_>>>()?;
+
+        let proto = Arc::new(proto);
+
+        let common = FileDescriptorCommon::new(OwningRef::new_arc(proto.clone()), dependencies)?;
+
+        Ok(DynamicFileDescriptor { proto, common })
+    }
+}
diff --git a/src/reflect/file/fds.rs b/src/reflect/file/fds.rs
new file mode 100644
index 0000000..f469b6c
--- /dev/null
+++ b/src/reflect/file/fds.rs
@@ -0,0 +1,68 @@
+use std::collections::HashMap;
+use std::collections::HashSet;
+use std::mem;
+
+use protobuf_support::toposort::toposort;
+
+use crate::descriptor::FileDescriptorProto;
+use crate::reflect::error::ReflectError;
+use crate::reflect::FileDescriptor;
+
+pub(crate) fn build_fds(
+    protos: Vec<FileDescriptorProto>,
+    dependencies: &[FileDescriptor],
+) -> crate::Result<Vec<FileDescriptor>> {
+    let mut index_by_name: HashMap<&str, usize> = HashMap::new();
+    for (i, proto) in protos.iter().enumerate() {
+        let prev = index_by_name.insert(proto.name(), i);
+        if prev.is_some() {
+            return Err(ReflectError::NonUniqueFileDescriptor(proto.name().to_owned()).into());
+        }
+    }
+
+    let sorted = match toposort(0..protos.len(), |&i| {
+        protos[i]
+            .dependency
+            .iter()
+            .filter_map(|d| index_by_name.get(d.as_str()).copied())
+    }) {
+        Ok(s) => s,
+        Err(_) => return Err(ReflectError::CycleInFileDescriptors.into()),
+    };
+
+    let mut built_descriptors_by_index = vec![None; protos.len()];
+
+    let mut protos: Vec<Option<FileDescriptorProto>> = protos.into_iter().map(Some).collect();
+
+    let mut all_descriptors = dependencies.to_vec();
+    for f in sorted {
+        let proto = mem::take(&mut protos[f]).unwrap();
+        let d = FileDescriptor::new_dynamic(proto, &all_descriptors)?;
+        all_descriptors.push(d.clone());
+        built_descriptors_by_index[f] = Some(d);
+    }
+
+    Ok(built_descriptors_by_index
+        .into_iter()
+        .map(Option::unwrap)
+        .collect())
+}
+
+pub(crate) fn fds_extend_with_public(file_descriptors: Vec<FileDescriptor>) -> Vec<FileDescriptor> {
+    let mut visited = HashSet::new();
+
+    let mut r = Vec::new();
+    let mut stack = file_descriptors;
+    stack.reverse();
+
+    while let Some(f) = stack.pop() {
+        if !visited.insert(f.proto().name().to_owned()) {
+            continue;
+        }
+
+        stack.extend(f.public_deps());
+
+        r.push(f);
+    }
+    r
+}
diff --git a/src/reflect/file/generated.rs b/src/reflect/file/generated.rs
new file mode 100644
index 0000000..54c60dd
--- /dev/null
+++ b/src/reflect/file/generated.rs
@@ -0,0 +1,101 @@
+use std::collections::HashMap;
+use std::fmt;
+use std::fmt::Formatter;
+
+use crate::descriptor::FileDescriptorProto;
+use crate::owning_ref::OwningRef;
+use crate::reflect::enums::generated::GeneratedEnumDescriptor;
+use crate::reflect::file::index::FileDescriptorCommon;
+use crate::reflect::message::generated::GeneratedMessageDescriptor;
+use crate::reflect::oneof::generated::GeneratedOneofDescriptor;
+use crate::reflect::FileDescriptor;
+use crate::reflect::GeneratedEnumDescriptorData;
+use crate::reflect::GeneratedMessageDescriptorData;
+
+/// Reflection for objects defined in `.proto` file (messages, enums, etc).
+#[doc(hidden)]
+pub struct GeneratedFileDescriptor {
+    pub(crate) proto: &'static FileDescriptorProto,
+    pub(crate) messages: Vec<GeneratedMessageDescriptor>,
+    pub(crate) enums: Vec<GeneratedEnumDescriptor>,
+    pub(crate) oneofs: Vec<GeneratedOneofDescriptor>,
+    pub(crate) common: FileDescriptorCommon,
+}
+
+impl fmt::Debug for GeneratedFileDescriptor {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        f.debug_struct("GeneratedFileDescriptor")
+            .field("proto.name", &self.proto.name())
+            .finish_non_exhaustive()
+    }
+}
+
+impl GeneratedFileDescriptor {
+    /// This function is called from generated code.
+    pub fn new_generated(
+        file_descriptor_proto: &'static FileDescriptorProto,
+        dependencies: Vec<FileDescriptor>,
+        messages: Vec<GeneratedMessageDescriptorData>,
+        enums: Vec<GeneratedEnumDescriptorData>,
+    ) -> GeneratedFileDescriptor {
+        let common =
+            FileDescriptorCommon::new(OwningRef::new_static(file_descriptor_proto), dependencies)
+                .unwrap();
+
+        let mut messages: HashMap<&str, GeneratedMessageDescriptorData> = messages
+            .into_iter()
+            .map(|m| (m.protobuf_name_to_package, m))
+            .collect();
+
+        let mut enums: HashMap<&str, GeneratedEnumDescriptorData> =
+            enums.into_iter().map(|e| (e.name_in_file, e)).collect();
+
+        let mut oneofs = Vec::new();
+        for oneof in &common.oneofs {
+            let message = &common.messages[oneof.containing_message];
+            let message_proto = &message.proto;
+            let oneof_proto = &message_proto.oneof_decl[oneof.index_in_containing_message];
+            let message = messages.get(message.name_to_package.as_str()).unwrap();
+            let oneof_data = &message.oneofs.iter().find(|o| o.name == oneof_proto.name());
+            if oneof.synthetic {
+                assert!(oneof_data.is_none());
+                oneofs.push(GeneratedOneofDescriptor::new_synthetic())
+            } else {
+                let oneof = GeneratedOneofDescriptor::new(oneof_data.unwrap());
+                oneofs.push(oneof);
+            }
+        }
+
+        let messages = common
+            .messages
+            .iter()
+            .map(|message_index| {
+                if message_index.proto.options.map_entry() {
+                    GeneratedMessageDescriptor::new_map_entry()
+                } else {
+                    let message = messages
+                        .remove(message_index.name_to_package.as_str())
+                        .unwrap();
+                    GeneratedMessageDescriptor::new(message, file_descriptor_proto, &common)
+                }
+            })
+            .collect();
+
+        let enums = common
+            .enums
+            .iter()
+            .map(|enum_index| {
+                let en = enums.remove(enum_index.name_to_package.as_str()).unwrap();
+                GeneratedEnumDescriptor::new(en, file_descriptor_proto)
+            })
+            .collect();
+
+        GeneratedFileDescriptor {
+            proto: file_descriptor_proto,
+            messages,
+            enums,
+            oneofs,
+            common,
+        }
+    }
+}
diff --git a/src/reflect/file/index.rs b/src/reflect/file/index.rs
new file mode 100644
index 0000000..f574357
--- /dev/null
+++ b/src/reflect/file/index.rs
@@ -0,0 +1,421 @@
+use std::collections::HashMap;
+use std::ops::Range;
+
+use crate::descriptor::field_descriptor_proto::Label;
+use crate::descriptor::DescriptorProto;
+use crate::descriptor::EnumDescriptorProto;
+use crate::descriptor::FileDescriptorProto;
+use crate::owning_ref::OwningRef;
+use crate::reflect::error::ReflectError;
+use crate::reflect::field::index::FieldIndex;
+use crate::reflect::file::building::FileDescriptorBuilding;
+use crate::reflect::file::fds::fds_extend_with_public;
+use crate::reflect::message::is_initialized_is_always_true::compute_is_initialized_is_always_true;
+use crate::reflect::name::concat_paths;
+use crate::reflect::service::index::ServiceIndex;
+use crate::reflect::FileDescriptor;
+
+#[derive(Debug)]
+pub(crate) struct MessageIndices {
+    pub(crate) proto: OwningRef<FileDescriptorProto, DescriptorProto>,
+    pub(crate) name_to_package: String,
+    pub(crate) full_name: String,
+    pub(crate) enclosing_message: Option<usize>,
+    pub(crate) nested_messages: Vec<usize>,
+    pub(crate) nested_enums: Range<usize>,
+    pub(crate) oneofs: Range<usize>,
+    pub(crate) map_entry: bool,
+    pub(crate) message_index: MessageFieldIndices,
+    pub(crate) is_initialized_is_always_true: bool,
+}
+
+#[derive(Debug, Default)]
+pub(crate) struct MessageFieldIndices {
+    /// Index of the first field in global field index.
+    pub(crate) first_field_index: usize,
+    pub(crate) field_count: usize,
+    /// Extensions follow fields in global field index.
+    pub(crate) extension_count: usize,
+    // Following fields map to the local field index.
+    pub(crate) field_index_by_name: HashMap<String, usize>,
+    pub(crate) field_index_by_name_or_json_name: HashMap<String, usize>,
+    pub(crate) field_index_by_number: HashMap<u32, usize>,
+}
+
+impl MessageFieldIndices {
+    pub(crate) fn regular_field_range(&self) -> Range<usize> {
+        self.first_field_index..(self.first_field_index + self.field_count)
+    }
+
+    pub(crate) fn extension_field_range(&self) -> Range<usize> {
+        self.first_field_index + self.field_count
+            ..self.first_field_index + self.field_count + self.extension_count
+    }
+
+    pub(crate) fn slice_fields<'a>(&self, file_fields: &'a [FieldIndex]) -> &'a [FieldIndex] {
+        &file_fields[self.first_field_index..self.first_field_index + self.field_count]
+    }
+}
+
+#[derive(Debug)]
+pub(crate) struct EnumIndices {
+    pub(crate) proto: OwningRef<FileDescriptorProto, EnumDescriptorProto>,
+    pub(crate) name_to_package: String,
+    pub(crate) full_name: String,
+    pub(crate) enclosing_message: Option<usize>,
+    pub(crate) index_by_name: HashMap<String, usize>,
+    pub(crate) index_by_number: HashMap<i32, usize>,
+}
+
+impl EnumIndices {
+    pub(crate) fn new(
+        name_to_package: String,
+        enclosing_message: Option<usize>,
+        proto: OwningRef<FileDescriptorProto, EnumDescriptorProto>,
+        file: &FileDescriptorProto,
+    ) -> EnumIndices {
+        let mut index_by_name = HashMap::new();
+        let mut index_by_number = HashMap::new();
+        for (i, v) in proto.value.iter().enumerate() {
+            index_by_number.insert(v.number(), i);
+            index_by_name.insert(v.name().to_owned(), i);
+        }
+        let full_name = concat_paths(file.package(), &name_to_package);
+        EnumIndices {
+            proto,
+            full_name,
+            name_to_package,
+            enclosing_message,
+            index_by_name,
+            index_by_number,
+        }
+    }
+}
+
+#[derive(Debug)]
+pub(crate) struct OneofIndices {
+    pub(crate) containing_message: usize,
+    pub(crate) index_in_containing_message: usize,
+    /// Synthetic oneof for proto3 optional field.
+    pub(crate) synthetic: bool,
+    pub(crate) fields: Vec<usize>,
+}
+
+/// Common `FileDescriptor` data for generated and dynamic file descriptors.
+#[derive(Debug)]
+pub(crate) struct FileDescriptorCommon {
+    /// Direct dependencies of this file.
+    pub(crate) dependencies: Vec<FileDescriptor>,
+    /// All messages in this file.
+    pub(crate) messages: Vec<MessageIndices>,
+    pub(crate) message_by_name_to_package: HashMap<String, usize>,
+    pub(crate) top_level_messages: Vec<usize>,
+    pub(crate) enums: Vec<EnumIndices>,
+    pub(crate) enums_by_name_to_package: HashMap<String, usize>,
+    pub(crate) oneofs: Vec<OneofIndices>,
+    pub(crate) services: Vec<ServiceIndex>,
+    pub(crate) first_extension_field_index: usize,
+    /// All fields followed by file-level extensions.
+    pub(crate) fields: Vec<FieldIndex>,
+}
+
+impl FileDescriptorCommon {
+    pub(crate) fn extension_field_range(&self) -> Range<usize> {
+        self.first_extension_field_index..self.fields.len()
+    }
+
+    pub(crate) fn new(
+        file: OwningRef<FileDescriptorProto, FileDescriptorProto>,
+        dependencies: Vec<FileDescriptor>,
+    ) -> crate::Result<FileDescriptorCommon> {
+        let deps_with_public = fds_extend_with_public(dependencies.clone());
+
+        let mut messages = Vec::new();
+        let mut enums = Vec::new();
+        let mut oneofs = Vec::new();
+        let mut top_level_messages = Vec::new();
+
+        // Top-level enums start with zero
+        for e in file.flat_map_slice(|f| &f.enum_type) {
+            enums.push(EnumIndices::new(e.name().to_owned(), None, e, file.owner()));
+        }
+
+        for message in file.flat_map_slice(|f| &f.message_type) {
+            let message_index = Self::index_message_and_inners(
+                file.owner(),
+                message,
+                None,
+                "",
+                &mut messages,
+                &mut enums,
+                &mut oneofs,
+            )?;
+            top_level_messages.push(message_index);
+        }
+
+        let message_by_name_to_package = Self::build_message_by_name_to_package(&messages);
+        let enums_by_name_to_package = Self::build_enum_by_name_to_package(&enums);
+
+        let mut services = Vec::new();
+
+        for service in &file.service {
+            let service_index = ServiceIndex::index(
+                service,
+                &FileDescriptorBuilding {
+                    current_file_descriptor: file.owner(),
+                    deps_with_public: &deps_with_public,
+                    message_by_name_to_package: &message_by_name_to_package,
+                    messages: &messages,
+                    enums_by_name_to_package: &enums_by_name_to_package,
+                },
+            )?;
+            services.push(service_index);
+        }
+
+        let mut fields = Vec::new();
+
+        Self::build_message_index(
+            file.owner(),
+            &deps_with_public,
+            &mut messages,
+            &mut fields,
+            &message_by_name_to_package,
+            &enums_by_name_to_package,
+        )?;
+
+        let first_extension_field_index = fields.len();
+        for ext in file.flat_map_slice(|f| &f.extension) {
+            fields.push(FieldIndex::index(
+                None,
+                ext,
+                &FileDescriptorBuilding {
+                    current_file_descriptor: file.owner(),
+                    deps_with_public: &deps_with_public,
+                    message_by_name_to_package: &message_by_name_to_package,
+                    messages: &messages,
+                    enums_by_name_to_package: &enums_by_name_to_package,
+                },
+            )?);
+        }
+
+        compute_is_initialized_is_always_true(&mut messages, &fields, file.owner());
+
+        Ok(FileDescriptorCommon {
+            dependencies,
+            messages,
+            message_by_name_to_package,
+            enums,
+            top_level_messages,
+            enums_by_name_to_package,
+            oneofs,
+            services,
+            first_extension_field_index,
+            fields,
+        })
+    }
+
+    fn is_map_entry(message: &DescriptorProto) -> crate::Result<bool> {
+        // Must be consistent with
+        // DescriptorBuilder::ValidateMapEntry
+
+        if !message.options.map_entry() {
+            return Ok(false);
+        }
+
+        if !message.name().ends_with("Entry") {
+            return Err(ReflectError::MapEntryNameMustEndWithEntry.into());
+        }
+        if !message.extension.is_empty()
+            || !message.extension_range.is_empty()
+            || !message.nested_type.is_empty()
+            || !message.enum_type.is_empty()
+        {
+            return Err(ReflectError::MapEntryMustHaveNo.into());
+        }
+
+        if message.field.len() != 2 {
+            return Err(ReflectError::MapEntryIncorrectFields.into());
+        }
+
+        let key = &message.field[0];
+        let value = &message.field[1];
+
+        if key.number() != 1
+            || key.name() != "key"
+            || key.label() != Label::LABEL_OPTIONAL
+            || value.number() != 2
+            || value.name() != "value"
+            || value.label() != Label::LABEL_OPTIONAL
+        {
+            return Err(ReflectError::MapEntryIncorrectFields.into());
+        }
+
+        Ok(true)
+    }
+
+    fn index_message_and_inners(
+        file: &FileDescriptorProto,
+        message: OwningRef<FileDescriptorProto, DescriptorProto>,
+        parent: Option<usize>,
+        parent_name_to_package: &str,
+        messages: &mut Vec<MessageIndices>,
+        enums: &mut Vec<EnumIndices>,
+        oneofs: &mut Vec<OneofIndices>,
+    ) -> crate::Result<usize> {
+        let name_to_package = concat_paths(parent_name_to_package, message.name());
+
+        let message_index = messages.len();
+        messages.push(MessageIndices {
+            proto: message.clone(),
+            full_name: concat_paths(file.package(), &name_to_package),
+            name_to_package: name_to_package.clone(),
+            enclosing_message: parent,
+            nested_messages: Vec::with_capacity(message.nested_type.len()),
+            nested_enums: enums.len()..enums.len() + message.enum_type.len(),
+            oneofs: oneofs.len()..oneofs.len() + message.oneof_decl.len(),
+            message_index: MessageFieldIndices::default(),
+            map_entry: Self::is_map_entry(&message)?,
+            // Initialized later.
+            is_initialized_is_always_true: false,
+        });
+
+        for e in message.flat_map_slice(|m| &m.enum_type) {
+            enums.push(EnumIndices::new(
+                concat_paths(&name_to_package, e.name()),
+                Some(message_index),
+                e,
+                file,
+            ));
+        }
+
+        for (i, _oneof) in message.oneof_decl.iter().enumerate() {
+            let fields: Vec<_> = message
+                .field
+                .iter()
+                .enumerate()
+                .filter(|(_, f)| f.has_oneof_index() && f.oneof_index() == i as i32)
+                .collect();
+            let synthetic = fields.len() == 1 && fields[0].1.proto3_optional();
+            oneofs.push(OneofIndices {
+                containing_message: message_index,
+                index_in_containing_message: i,
+                synthetic,
+                fields: fields.iter().map(|(i, _)| *i).collect(),
+            });
+        }
+
+        for nested in message.flat_map_slice(|m| &m.nested_type) {
+            let nested_index = Self::index_message_and_inners(
+                file,
+                nested,
+                Some(message_index),
+                &name_to_package,
+                messages,
+                enums,
+                oneofs,
+            )?;
+            messages[message_index].nested_messages.push(nested_index);
+        }
+
+        Ok(message_index)
+    }
+
+    fn build_message_by_name_to_package(messages: &[MessageIndices]) -> HashMap<String, usize> {
+        messages
+            .iter()
+            .enumerate()
+            .map(|(i, m)| (m.name_to_package.to_owned(), i))
+            .collect()
+    }
+
+    fn build_enum_by_name_to_package(enums: &[EnumIndices]) -> HashMap<String, usize> {
+        enums
+            .iter()
+            .enumerate()
+            .map(|(i, e)| (e.name_to_package.to_owned(), i))
+            .collect()
+    }
+
+    fn build_message_index(
+        file: &FileDescriptorProto,
+        deps_with_public: &[FileDescriptor],
+        messages: &mut [MessageIndices],
+        fields: &mut Vec<FieldIndex>,
+        message_by_name_to_package: &HashMap<String, usize>,
+        enums_by_name_to_package: &HashMap<String, usize>,
+    ) -> crate::Result<()> {
+        for i in 0..messages.len() {
+            let message_proto = &messages[i].proto;
+            let building = FileDescriptorBuilding {
+                current_file_descriptor: file,
+                deps_with_public,
+                message_by_name_to_package,
+                messages,
+                enums_by_name_to_package,
+            };
+            let message_index = Self::index_message(i, message_proto, &building, fields)?;
+            messages[i].message_index = message_index;
+        }
+        Ok(())
+    }
+
+    fn index_message(
+        message_index: usize,
+        proto: &OwningRef<FileDescriptorProto, DescriptorProto>,
+        building: &FileDescriptorBuilding,
+        fields: &mut Vec<FieldIndex>,
+    ) -> crate::Result<MessageFieldIndices> {
+        let mut index_by_name = HashMap::new();
+        let mut index_by_name_or_json_name = HashMap::new();
+        let mut index_by_number = HashMap::new();
+
+        let first_field_index = fields.len();
+
+        for field in proto.flat_map_slice(|m| &m.field) {
+            fields.push(FieldIndex::index(Some(message_index), field, building)?);
+        }
+
+        let field_count = proto.field.len();
+
+        for (i, f) in proto.field.iter().enumerate() {
+            let field_index = &fields[first_field_index + i];
+
+            if index_by_number.insert(f.number() as u32, i).is_some() {
+                return Err(ReflectError::NonUniqueFieldName(f.name().to_owned()).into());
+            }
+            if index_by_name.insert(f.name().to_owned(), i).is_some() {
+                return Err(ReflectError::NonUniqueFieldName(f.name().to_owned()).into());
+            }
+            if index_by_name_or_json_name
+                .insert(f.name().to_owned(), i)
+                .is_some()
+            {
+                return Err(ReflectError::NonUniqueFieldName(f.name().to_owned()).into());
+            }
+
+            if field_index.json_name != f.name() {
+                if index_by_name_or_json_name
+                    .insert(field_index.json_name.clone(), i)
+                    .is_some()
+                {
+                    return Err(ReflectError::NonUniqueFieldName(f.name().to_owned()).into());
+                }
+            }
+        }
+
+        for ext in proto.flat_map_slice(|m| &m.extension) {
+            fields.push(FieldIndex::index(Some(message_index), ext, building)?);
+        }
+
+        let extension_count = proto.extension.len();
+
+        Ok(MessageFieldIndices {
+            first_field_index,
+            field_count,
+            extension_count,
+            field_index_by_name: index_by_name,
+            field_index_by_name_or_json_name: index_by_name_or_json_name,
+            field_index_by_number: index_by_number,
+        })
+    }
+}
diff --git a/src/reflect/file/mod.rs b/src/reflect/file/mod.rs
new file mode 100644
index 0000000..068840b
--- /dev/null
+++ b/src/reflect/file/mod.rs
@@ -0,0 +1,283 @@
+use std::collections::HashSet;
+use std::hash::Hash;
+use std::hash::Hasher;
+use std::sync::Arc;
+
+use crate::descriptor::DescriptorProto;
+use crate::descriptor::FileDescriptorProto;
+use crate::reflect::file::dynamic::DynamicFileDescriptor;
+use crate::reflect::file::fds::build_fds;
+use crate::reflect::file::index::EnumIndices;
+use crate::reflect::file::index::FileDescriptorCommon;
+use crate::reflect::file::index::MessageIndices;
+use crate::reflect::name::protobuf_name_starts_with_package;
+use crate::reflect::service::ServiceDescriptor;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::FieldDescriptor;
+use crate::reflect::GeneratedFileDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::Syntax;
+
+pub(crate) mod building;
+pub(crate) mod dynamic;
+pub(crate) mod fds;
+pub(crate) mod generated;
+pub(crate) mod index;
+pub(crate) mod syntax;
+
+#[derive(Clone, Debug)]
+pub(crate) enum FileDescriptorImpl {
+    Generated(&'static GeneratedFileDescriptor),
+    Dynamic(Arc<DynamicFileDescriptor>),
+}
+
+impl PartialEq for FileDescriptorImpl {
+    fn eq(&self, other: &Self) -> bool {
+        match (self, other) {
+            (FileDescriptorImpl::Generated(a), FileDescriptorImpl::Generated(b)) => {
+                *a as *const GeneratedFileDescriptor == *b as *const GeneratedFileDescriptor
+            }
+            (FileDescriptorImpl::Dynamic(a), FileDescriptorImpl::Dynamic(b)) => Arc::ptr_eq(a, b),
+            _ => false,
+        }
+    }
+}
+
+impl Hash for FileDescriptorImpl {
+    fn hash<H: Hasher>(&self, state: &mut H) {
+        match self {
+            FileDescriptorImpl::Generated(g) => {
+                Hash::hash(&(*g as *const GeneratedFileDescriptor), state)
+            }
+            FileDescriptorImpl::Dynamic(a) => {
+                Hash::hash(&(&**a as *const DynamicFileDescriptor), state)
+            }
+        }
+    }
+}
+
+impl Eq for FileDescriptorImpl {}
+
+/// Reflection for objects defined in `.proto` file (messages, enums, etc).
+///
+/// The object is refcounted: clone is shallow.
+///
+/// The equality performs pointer comparison: two clones of the same `FileDescriptor`
+/// objects are equal, but two `FileDescriptor` objects created from the same `FileDescriptorProto`
+/// objects are **not** equal.
+#[derive(Clone, PartialEq, Eq, Hash, Debug)]
+pub struct FileDescriptor {
+    pub(crate) imp: FileDescriptorImpl,
+}
+
+impl FileDescriptor {
+    pub(crate) fn common(&self) -> &FileDescriptorCommon {
+        match &self.imp {
+            FileDescriptorImpl::Generated(g) => &g.common,
+            FileDescriptorImpl::Dynamic(d) => &d.common,
+        }
+    }
+
+    /// Same as `common`, but returns `&'static`.
+    pub(crate) fn common_for_generated_descriptor(&self) -> &'static FileDescriptorCommon {
+        match &self.imp {
+            FileDescriptorImpl::Generated(g) => &g.common,
+            FileDescriptorImpl::Dynamic(..) => panic!("not generated"),
+        }
+    }
+
+    pub(crate) fn message_indices(&self, index: usize) -> &MessageIndices {
+        &self.common().messages[index]
+    }
+
+    pub(crate) fn message_by_index(&self, index: usize) -> MessageDescriptor {
+        MessageDescriptor {
+            file_descriptor: self.clone(),
+            index,
+        }
+    }
+
+    pub(crate) fn message_proto_by_index(&self, index: usize) -> &DescriptorProto {
+        &self.common().messages[index].proto
+    }
+
+    pub(crate) fn enum_indices(&self, index: usize) -> &EnumIndices {
+        &self.common().enums[index]
+    }
+
+    /// The file name.
+    pub fn name(&self) -> &str {
+        self.proto().name()
+    }
+
+    /// Protobuf package.
+    pub fn package(&self) -> &str {
+        self.proto().package()
+    }
+
+    /// Syntax of current file.
+    pub fn syntax(&self) -> Syntax {
+        Syntax::parse(self.proto().syntax()).unwrap_or(Syntax::Proto2)
+    }
+
+    /// Top-level messages.
+    pub fn messages(&self) -> impl Iterator<Item = MessageDescriptor> + '_ {
+        self.common()
+            .top_level_messages
+            .iter()
+            .map(|i| MessageDescriptor::new(self.clone(), *i))
+    }
+
+    /// Get top-level enums.
+    pub fn enums(&self) -> impl Iterator<Item = EnumDescriptor> + '_ {
+        self.proto()
+            .enum_type
+            .iter()
+            .enumerate()
+            .map(|(i, _)| EnumDescriptor::new(self.clone(), i))
+    }
+
+    /// Get services defined in `.proto` file.
+    pub fn services(&self) -> impl Iterator<Item = ServiceDescriptor> + '_ {
+        self.proto()
+            .service
+            .iter()
+            .enumerate()
+            .map(|(i, _)| ServiceDescriptor::new(self.clone(), i))
+    }
+
+    /// Extension fields.
+    pub fn extensions(&self) -> impl Iterator<Item = FieldDescriptor> + '_ {
+        self.common()
+            .extension_field_range()
+            .map(move |index| FieldDescriptor {
+                file_descriptor: self.clone(),
+                index,
+            })
+    }
+
+    /// Find message by name relative to the package.
+    ///
+    /// Only search in the current file, not in any dependencies.
+    pub fn message_by_package_relative_name(&self, name: &str) -> Option<MessageDescriptor> {
+        self.common()
+            .message_by_name_to_package
+            .get(name)
+            .map(|&index| MessageDescriptor::new(self.clone(), index))
+    }
+
+    /// Find message by name relative to the package.
+    ///
+    /// Only search in the current file, not in any dependencies.
+    pub fn enum_by_package_relative_name(&self, name: &str) -> Option<EnumDescriptor> {
+        self.common()
+            .enums_by_name_to_package
+            .get(name)
+            .map(|&index| EnumDescriptor::new(self.clone(), index))
+    }
+
+    /// Find message by fully-qualified name.
+    ///
+    /// Only search in the current file, not in any dependencies.
+    pub fn message_by_full_name(&self, name: &str) -> Option<MessageDescriptor> {
+        if let Some(name_to_package) =
+            protobuf_name_starts_with_package(name, self.proto().package())
+        {
+            self.message_by_package_relative_name(name_to_package)
+        } else {
+            None
+        }
+    }
+
+    /// Find enum by name fully-qualified name.
+    ///
+    /// Only search in the current file, not in any dependencies.
+    pub fn enum_by_full_name(&self, name: &str) -> Option<EnumDescriptor> {
+        if let Some(name_to_package) =
+            protobuf_name_starts_with_package(name, self.proto().package())
+        {
+            self.enum_by_package_relative_name(name_to_package)
+        } else {
+            None
+        }
+    }
+
+    /// This function is called from generated code, it is not stable, and should not be called.
+    #[doc(hidden)]
+    pub fn new_generated_2(generated: &'static GeneratedFileDescriptor) -> FileDescriptor {
+        FileDescriptor {
+            imp: FileDescriptorImpl::Generated(generated),
+        }
+    }
+
+    /// Dynamic message created from [`FileDescriptorProto`] without generated files.
+    pub fn new_dynamic(
+        proto: FileDescriptorProto,
+        dependencies: &[FileDescriptor],
+    ) -> crate::Result<FileDescriptor> {
+        Ok(FileDescriptor {
+            imp: FileDescriptorImpl::Dynamic(Arc::new(DynamicFileDescriptor::new(
+                proto,
+                dependencies,
+            )?)),
+        })
+    }
+
+    /// Create a set of file descriptors from individual file descriptors.
+    pub fn new_dynamic_fds(
+        protos: Vec<FileDescriptorProto>,
+        dependencies: &[FileDescriptor],
+    ) -> crate::Result<Vec<FileDescriptor>> {
+        build_fds(protos, dependencies)
+    }
+
+    /// `.proto` data for this file.
+    pub fn proto(&self) -> &FileDescriptorProto {
+        match &self.imp {
+            FileDescriptorImpl::Generated(g) => &g.proto,
+            FileDescriptorImpl::Dynamic(d) => &d.proto,
+        }
+    }
+
+    /// Direct dependencies of this file.
+    pub fn deps(&self) -> &[FileDescriptor] {
+        &self.common().dependencies
+    }
+
+    /// Subset of dependencies which are public
+    pub fn public_deps(&self) -> impl Iterator<Item = FileDescriptor> + '_ {
+        self.proto()
+            .public_dependency
+            .iter()
+            .map(|&i| self.deps()[i as usize].clone())
+    }
+
+    fn _all_files(&self) -> Vec<&FileDescriptor> {
+        let mut r = Vec::new();
+        let mut visited = HashSet::new();
+
+        let mut stack = Vec::new();
+        stack.push(self);
+        while let Some(file) = stack.pop() {
+            if !visited.insert(file) {
+                continue;
+            }
+
+            r.push(file);
+            stack.extend(file.deps());
+        }
+
+        r
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use crate::descriptor;
+
+    #[test]
+    #[cfg_attr(miri, ignore)]
+    fn eq() {
+        assert!(descriptor::file_descriptor() == &descriptor::file_descriptor().clone());
+    }
+}
diff --git a/src/reflect/file/syntax.rs b/src/reflect/file/syntax.rs
new file mode 100644
index 0000000..a1b4bd0
--- /dev/null
+++ b/src/reflect/file/syntax.rs
@@ -0,0 +1,24 @@
+use crate::descriptor::FileDescriptorProto;
+
+/// `.proto` file syntax.
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+pub enum Syntax {
+    /// `syntax = "proto2"`.
+    Proto2,
+    /// `syntax = "proto3"`.
+    Proto3,
+}
+
+impl Syntax {
+    pub(crate) fn parse(syntax: &str) -> Option<Syntax> {
+        match syntax {
+            "" | "proto2" => Some(Syntax::Proto2),
+            "proto3" => Some(Syntax::Proto3),
+            _ => None,
+        }
+    }
+
+    pub(crate) fn of_file(file: &FileDescriptorProto) -> Syntax {
+        Syntax::parse(file.syntax()).unwrap_or(Syntax::Proto2)
+    }
+}
diff --git a/src/reflect/find_message_or_enum.rs b/src/reflect/find_message_or_enum.rs
index 7ee3915..32d69d5 100644
--- a/src/reflect/find_message_or_enum.rs
+++ b/src/reflect/find_message_or_enum.rs
@@ -11,12 +11,12 @@
     fn from_two_options(
         m: Option<&'a DescriptorProto>,
         e: Option<&'a EnumDescriptorProto>,
-    ) -> MessageOrEnum<'a> {
+    ) -> Option<MessageOrEnum<'a>> {
         match (m, e) {
             (Some(_), Some(_)) => panic!("enum and message with the same name"),
-            (Some(m), None) => MessageOrEnum::Message(m),
-            (None, Some(e)) => MessageOrEnum::Enum(e),
-            (None, None) => panic!("not found"),
+            (Some(m), None) => Some(MessageOrEnum::Message(m)),
+            (None, Some(e)) => Some(MessageOrEnum::Enum(e)),
+            (None, None) => None,
         }
     }
 }
@@ -24,17 +24,17 @@
 pub(crate) fn find_message_or_enum<'a>(
     file: &'a FileDescriptorProto,
     name_to_package: &str,
-) -> (String, MessageOrEnum<'a>) {
+) -> Option<(String, MessageOrEnum<'a>)> {
+    assert!(!name_to_package.starts_with("."));
+    assert!(!name_to_package.is_empty());
+
     let mut path = name_to_package.split('.');
     let first = path.next().unwrap();
-    let child_message = file
-        .get_message_type()
-        .iter()
-        .find(|m| m.get_name() == first);
-    let child_enum = file.get_enum_type().iter().find(|e| e.get_name() == first);
+    let child_message = file.message_type.iter().find(|m| m.name() == first);
+    let child_enum = file.enum_type.iter().find(|e| e.name() == first);
 
     let mut package_to_name = String::new();
-    let mut me = MessageOrEnum::from_two_options(child_message, child_enum);
+    let mut me = MessageOrEnum::from_two_options(child_message, child_enum)?;
 
     for name in path {
         let message = match me {
@@ -45,18 +45,12 @@
         if !package_to_name.is_empty() {
             package_to_name.push_str(".");
         }
-        package_to_name.push_str(message.get_name());
+        package_to_name.push_str(message.name());
 
-        let child_message = message
-            .get_nested_type()
-            .iter()
-            .find(|m| m.get_name() == name);
-        let child_enum = message
-            .get_enum_type()
-            .iter()
-            .find(|e| e.get_name() == name);
-        me = MessageOrEnum::from_two_options(child_message, child_enum)
+        let child_message = message.nested_type.iter().find(|m| m.name() == name);
+        let child_enum = message.enum_type.iter().find(|e| e.name() == name);
+        me = MessageOrEnum::from_two_options(child_message, child_enum)?;
     }
 
-    (package_to_name, me)
+    Some((package_to_name, me))
 }
diff --git a/src/reflect/map.rs b/src/reflect/map.rs
deleted file mode 100644
index c6aff60..0000000
--- a/src/reflect/map.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-use std::collections::hash_map;
-use std::collections::HashMap;
-use std::hash::Hash;
-
-use super::value::ProtobufValue;
-
-/// Implemented for `HashMap` with appropriate keys and values
-pub trait ReflectMap: 'static {
-    fn reflect_iter(&self) -> ReflectMapIter;
-
-    fn len(&self) -> usize;
-}
-
-impl<K: ProtobufValue + Eq + Hash + 'static, V: ProtobufValue + 'static> ReflectMap
-    for HashMap<K, V>
-{
-    fn reflect_iter<'a>(&'a self) -> ReflectMapIter<'a> {
-        ReflectMapIter {
-            imp: Box::new(ReflectMapIterImpl::<'a, K, V> { iter: self.iter() }),
-        }
-    }
-
-    fn len(&self) -> usize {
-        HashMap::len(self)
-    }
-}
-
-trait ReflectMapIterTrait<'a> {
-    fn next(&mut self) -> Option<(&'a dyn ProtobufValue, &'a dyn ProtobufValue)>;
-}
-
-struct ReflectMapIterImpl<'a, K: Eq + Hash + 'static, V: 'static> {
-    iter: hash_map::Iter<'a, K, V>,
-}
-
-impl<'a, K: ProtobufValue + Eq + Hash + 'static, V: ProtobufValue + 'static> ReflectMapIterTrait<'a>
-    for ReflectMapIterImpl<'a, K, V>
-{
-    fn next(&mut self) -> Option<(&'a dyn ProtobufValue, &'a dyn ProtobufValue)> {
-        match self.iter.next() {
-            Some((k, v)) => Some((k as &dyn ProtobufValue, v as &dyn ProtobufValue)),
-            None => None,
-        }
-    }
-}
-
-pub struct ReflectMapIter<'a> {
-    imp: Box<dyn ReflectMapIterTrait<'a> + 'a>,
-}
-
-impl<'a> Iterator for ReflectMapIter<'a> {
-    type Item = (&'a dyn ProtobufValue, &'a dyn ProtobufValue);
-
-    fn next(&mut self) -> Option<(&'a dyn ProtobufValue, &'a dyn ProtobufValue)> {
-        self.imp.next()
-    }
-}
-
-impl<'a> IntoIterator for &'a dyn ReflectMap {
-    type IntoIter = ReflectMapIter<'a>;
-    type Item = (&'a dyn ProtobufValue, &'a dyn ProtobufValue);
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.reflect_iter()
-    }
-}
diff --git a/src/reflect/map/empty.rs b/src/reflect/map/empty.rs
new file mode 100644
index 0000000..5ac908d
--- /dev/null
+++ b/src/reflect/map/empty.rs
@@ -0,0 +1,73 @@
+use std::fmt;
+
+use crate::reflect::map::ReflectMapIter;
+use crate::reflect::map::ReflectMapIterTrait;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+#[derive(Clone)]
+pub(crate) struct DynamicEmptyMap {
+    key_type: RuntimeType,
+    value_type: RuntimeType,
+}
+
+impl DynamicEmptyMap {
+    pub(crate) fn new(key_type: RuntimeType, value_type: RuntimeType) -> DynamicEmptyMap {
+        Self {
+            key_type,
+            value_type,
+        }
+    }
+
+    pub(crate) fn len(&self) -> usize {
+        0
+    }
+
+    pub(crate) fn is_empty(&self) -> bool {
+        true
+    }
+
+    pub(crate) fn get<'a>(&'a self, _key: ReflectValueRef) -> Option<ReflectValueRef<'a>> {
+        None
+    }
+
+    pub(crate) fn key_type(&self) -> RuntimeType {
+        self.key_type.clone()
+    }
+
+    pub(crate) fn value_type(&self) -> RuntimeType {
+        self.value_type.clone()
+    }
+
+    pub(crate) fn reflect_iter(&self) -> ReflectMapIter {
+        ReflectMapIter::new(DynamicEmptyMapIter {
+            key_type: self.key_type.clone(),
+            value_type: self.value_type.clone(),
+        })
+    }
+}
+
+impl fmt::Debug for DynamicEmptyMap {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_map().finish()
+    }
+}
+
+struct DynamicEmptyMapIter {
+    key_type: RuntimeType,
+    value_type: RuntimeType,
+}
+
+impl<'a> ReflectMapIterTrait<'a> for DynamicEmptyMapIter {
+    fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
+        None
+    }
+
+    fn key_type(&self) -> RuntimeType {
+        self.key_type.clone()
+    }
+
+    fn value_type(&self) -> RuntimeType {
+        self.value_type.clone()
+    }
+}
diff --git a/src/reflect/map/generated.rs b/src/reflect/map/generated.rs
new file mode 100644
index 0000000..ccece69
--- /dev/null
+++ b/src/reflect/map/generated.rs
@@ -0,0 +1,77 @@
+use std::collections::hash_map;
+use std::collections::HashMap;
+use std::hash::Hash;
+
+use crate::reflect::map::ReflectMap;
+use crate::reflect::map::ReflectMapIter;
+use crate::reflect::map::ReflectMapIterTrait;
+use crate::reflect::runtime_types::RuntimeTypeHashable;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+impl<K, V> ReflectMap for HashMap<K, V>
+where
+    K: ProtobufValue + Eq + Hash,
+    V: ProtobufValue,
+    K::RuntimeType: RuntimeTypeHashable,
+{
+    fn reflect_iter<'a>(&'a self) -> ReflectMapIter<'a> {
+        ReflectMapIter::new(GeneratedMapIterImpl::<'a, K, V> { iter: self.iter() })
+    }
+
+    fn len(&self) -> usize {
+        HashMap::len(self)
+    }
+
+    fn is_empty(&self) -> bool {
+        self.is_empty()
+    }
+
+    fn get<'a>(&'a self, key: ReflectValueRef) -> Option<ReflectValueRef<'a>> {
+        <K::RuntimeType as RuntimeTypeHashable>::hash_map_get(self, key).map(V::RuntimeType::as_ref)
+    }
+
+    fn insert(&mut self, key: ReflectValueBox, value: ReflectValueBox) {
+        let key: K = key.downcast().expect("wrong key type");
+        let value: V = value.downcast().expect("wrong value type");
+        self.insert(key, value);
+    }
+
+    fn clear(&mut self) {
+        self.clear();
+    }
+
+    fn key_type(&self) -> RuntimeType {
+        K::RuntimeType::runtime_type_box()
+    }
+
+    fn value_type(&self) -> RuntimeType {
+        V::RuntimeType::runtime_type_box()
+    }
+}
+
+struct GeneratedMapIterImpl<'a, K: Eq + Hash + 'static, V: 'static> {
+    iter: hash_map::Iter<'a, K, V>,
+}
+
+impl<'a, K: ProtobufValue + Eq + Hash, V: ProtobufValue> ReflectMapIterTrait<'a>
+    for GeneratedMapIterImpl<'a, K, V>
+{
+    fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
+        match self.iter.next() {
+            Some((k, v)) => Some((K::RuntimeType::as_ref(k), V::RuntimeType::as_ref(v))),
+            None => None,
+        }
+    }
+
+    fn key_type(&self) -> RuntimeType {
+        K::RuntimeType::runtime_type_box()
+    }
+
+    fn value_type(&self) -> RuntimeType {
+        V::RuntimeType::runtime_type_box()
+    }
+}
diff --git a/src/reflect/map/mod.rs b/src/reflect/map/mod.rs
new file mode 100644
index 0000000..5ec3fd8
--- /dev/null
+++ b/src/reflect/map/mod.rs
@@ -0,0 +1,281 @@
+use std::fmt;
+use std::fmt::Debug;
+use std::fmt::Formatter;
+
+use crate::reflect::map::empty::DynamicEmptyMap;
+use crate::reflect::reflect_eq::ReflectEq;
+use crate::reflect::reflect_eq::ReflectEqMode;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+mod empty;
+mod generated;
+
+/// Implemented for `HashMap` with appropriate keys and values
+pub(crate) trait ReflectMap: Debug + Send + Sync + 'static {
+    fn reflect_iter(&self) -> ReflectMapIter;
+
+    fn len(&self) -> usize;
+
+    fn is_empty(&self) -> bool;
+
+    fn get<'a>(&'a self, key: ReflectValueRef) -> Option<ReflectValueRef<'a>>;
+
+    fn insert(&mut self, key: ReflectValueBox, value: ReflectValueBox);
+
+    fn clear(&mut self);
+
+    fn key_type(&self) -> RuntimeType;
+
+    fn value_type(&self) -> RuntimeType;
+}
+
+pub(crate) trait ReflectMapIterTrait<'a> {
+    fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)>;
+    fn key_type(&self) -> RuntimeType;
+    fn value_type(&self) -> RuntimeType;
+}
+
+pub struct ReflectMapIter<'a> {
+    imp: Box<dyn ReflectMapIterTrait<'a> + 'a>,
+}
+
+impl<'a> ReflectMapIter<'a> {
+    pub(crate) fn new<I: ReflectMapIterTrait<'a> + 'a>(imp: I) -> ReflectMapIter<'a> {
+        ReflectMapIter { imp: Box::new(imp) }
+    }
+}
+
+impl<'a> Iterator for ReflectMapIter<'a> {
+    type Item = (ReflectValueRef<'a>, ReflectValueRef<'a>);
+
+    fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
+        self.imp.next()
+    }
+}
+
+impl<'a> IntoIterator for &'a dyn ReflectMap {
+    type Item = (ReflectValueRef<'a>, ReflectValueRef<'a>);
+    type IntoIter = ReflectMapIter<'a>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.reflect_iter()
+    }
+}
+
+#[derive(Clone)]
+enum ReflectMapRefImpl<'a> {
+    Generated(&'a dyn ReflectMap),
+    DynamicEmpty(DynamicEmptyMap),
+}
+
+impl<'a> fmt::Debug for ReflectMapRefImpl<'a> {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        match self {
+            ReflectMapRefImpl::Generated(m) => fmt::Debug::fmt(m, f),
+            ReflectMapRefImpl::DynamicEmpty(m) => fmt::Debug::fmt(m, f),
+        }
+    }
+}
+
+/// Dynamic reference to `map` field
+#[derive(Clone)]
+pub struct ReflectMapRef<'a> {
+    imp: ReflectMapRefImpl<'a>,
+}
+
+/// Dynamic mutable reference to `map` field
+pub struct ReflectMapMut<'a> {
+    map: &'a mut dyn ReflectMap,
+}
+
+impl<'a> fmt::Debug for ReflectMapRef<'a> {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        fmt::Debug::fmt(&self.imp, f)
+    }
+}
+
+impl<'a> fmt::Debug for ReflectMapMut<'a> {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        fmt::Debug::fmt(&self.map, f)
+    }
+}
+
+impl<'a> ReflectMapRef<'a> {
+    pub(crate) fn new(map: &'a dyn ReflectMap) -> ReflectMapRef<'a> {
+        ReflectMapRef {
+            imp: ReflectMapRefImpl::Generated(map),
+        }
+    }
+
+    pub(crate) fn new_empty(key: RuntimeType, value: RuntimeType) -> ReflectMapRef<'a> {
+        ReflectMapRef {
+            imp: ReflectMapRefImpl::DynamicEmpty(DynamicEmptyMap::new(key, value)),
+        }
+    }
+
+    /// Size of the map
+    pub fn len(&self) -> usize {
+        match &self.imp {
+            ReflectMapRefImpl::Generated(map) => map.len(),
+            ReflectMapRefImpl::DynamicEmpty(map) => map.len(),
+        }
+    }
+
+    /// Is map empty?
+    pub fn is_empty(&self) -> bool {
+        match &self.imp {
+            ReflectMapRefImpl::Generated(map) => map.is_empty(),
+            ReflectMapRefImpl::DynamicEmpty(map) => map.is_empty(),
+        }
+    }
+
+    /// Find a value by given key.
+    pub fn get(&self, key: ReflectValueRef) -> Option<ReflectValueRef> {
+        match &self.imp {
+            ReflectMapRefImpl::Generated(map) => map.get(key),
+            ReflectMapRefImpl::DynamicEmpty(map) => map.get(key),
+        }
+    }
+
+    /// Map key type
+    pub fn key_type(&self) -> RuntimeType {
+        match &self.imp {
+            ReflectMapRefImpl::Generated(map) => map.key_type(),
+            ReflectMapRefImpl::DynamicEmpty(map) => map.key_type(),
+        }
+    }
+
+    /// Map value type
+    pub fn value_type(&self) -> RuntimeType {
+        match &self.imp {
+            ReflectMapRefImpl::Generated(map) => map.value_type(),
+            ReflectMapRefImpl::DynamicEmpty(map) => map.value_type(),
+        }
+    }
+}
+
+impl<'a> PartialEq for ReflectMapRef<'a> {
+    fn eq(&self, other: &Self) -> bool {
+        self.reflect_eq(other, &ReflectEqMode::default())
+    }
+}
+
+impl<'a> ReflectEq for ReflectMapRef<'a> {
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
+        let len = self.len();
+
+        if len != that.len() {
+            return false;
+        }
+
+        if self.key_type() != that.key_type() {
+            return false;
+        }
+        if self.value_type() != that.value_type() {
+            return false;
+        }
+
+        for (k, va) in self {
+            let vb = match that.get(k) {
+                Some(v) => v,
+                None => return false,
+            };
+
+            if !va.reflect_eq(&vb, mode) {
+                return false;
+            }
+        }
+
+        true
+    }
+}
+
+impl<'a> ReflectMapMut<'a> {
+    pub(crate) fn new(map: &'a mut dyn ReflectMap) -> ReflectMapMut<'a> {
+        ReflectMapMut { map }
+    }
+
+    fn as_ref(&'a self) -> ReflectMapRef<'a> {
+        ReflectMapRef::new(self.map)
+    }
+
+    /// Map key type
+    pub fn key_type(&self) -> RuntimeType {
+        self.map.key_type()
+    }
+
+    /// Map value type
+    pub fn value_type(&self) -> RuntimeType {
+        self.map.value_type()
+    }
+
+    /// Number of map entries
+    pub fn len(&self) -> usize {
+        self.as_ref().len()
+    }
+
+    /// Is this map empty?
+    pub fn is_empty(&self) -> bool {
+        self.as_ref().is_empty()
+    }
+
+    /// Find a value for given key
+    pub fn get(&self, key: ReflectValueRef) -> Option<ReflectValueRef> {
+        self.map.get(key)
+    }
+
+    /// Insert a value into the map.
+    ///
+    /// # Panics
+    ///
+    /// If given key has an incompatible key type.
+    pub fn insert(&mut self, key: ReflectValueBox, value: ReflectValueBox) {
+        self.map.insert(key, value)
+    }
+
+    /// Clear
+    pub fn clear(&mut self) {
+        self.map.clear();
+    }
+}
+
+/// Iterator over map
+pub struct ReflectMapRefIter<'a> {
+    iter: ReflectMapIter<'a>,
+}
+
+impl<'a> ReflectMapRefIter<'a> {
+    fn _key_type(&self) -> RuntimeType {
+        self.iter.imp.key_type()
+    }
+
+    fn _value_type(&self) -> RuntimeType {
+        self.iter.imp.value_type()
+    }
+}
+
+impl<'a> Iterator for ReflectMapRefIter<'a> {
+    type Item = (ReflectValueRef<'a>, ReflectValueRef<'a>);
+
+    fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
+        self.iter.next()
+    }
+}
+
+impl<'a, 'b: 'a> IntoIterator for &'b ReflectMapRef<'a> {
+    type Item = (ReflectValueRef<'a>, ReflectValueRef<'a>);
+    type IntoIter = ReflectMapRefIter<'a>;
+
+    fn into_iter(self) -> ReflectMapRefIter<'a> {
+        match &self.imp {
+            ReflectMapRefImpl::Generated(map) => ReflectMapRefIter {
+                iter: map.reflect_iter(),
+            },
+            ReflectMapRefImpl::DynamicEmpty(map) => ReflectMapRefIter {
+                iter: map.reflect_iter(),
+            },
+        }
+    }
+}
diff --git a/src/reflect/message.rs b/src/reflect/message.rs
deleted file mode 100644
index 0db9821..0000000
--- a/src/reflect/message.rs
+++ /dev/null
@@ -1,282 +0,0 @@
-use std::collections::HashMap;
-use std::marker;
-
-use crate::descriptor::DescriptorProto;
-use crate::descriptor::FileDescriptorProto;
-use crate::descriptorx::find_message_by_rust_name;
-use crate::reflect::acc::FieldAccessor;
-use crate::reflect::find_message_or_enum::find_message_or_enum;
-use crate::reflect::find_message_or_enum::MessageOrEnum;
-use crate::reflect::FieldDescriptor;
-use crate::Message;
-
-trait MessageFactory: Send + Sync + 'static {
-    fn new_instance(&self) -> Box<dyn Message>;
-}
-
-struct MessageFactoryImpl<M>(marker::PhantomData<M>);
-
-impl<M> MessageFactory for MessageFactoryImpl<M>
-where
-    M: 'static + Message + Default + Clone + PartialEq,
-{
-    fn new_instance(&self) -> Box<dyn Message> {
-        let m: M = Default::default();
-        Box::new(m)
-    }
-}
-
-/// Dynamic message type
-pub struct MessageDescriptor {
-    full_name: String,
-    proto: &'static DescriptorProto,
-    factory: &'static dyn MessageFactory,
-    fields: Vec<FieldDescriptor>,
-
-    index_by_name: HashMap<String, usize>,
-    index_by_name_or_json_name: HashMap<String, usize>,
-    index_by_number: HashMap<u32, usize>,
-}
-
-impl MessageDescriptor {
-    /// Get underlying `DescriptorProto` object.
-    pub fn get_proto(&self) -> &DescriptorProto {
-        self.proto
-    }
-
-    /// Get a message descriptor for given message type
-    pub fn for_type<M: Message>() -> &'static MessageDescriptor {
-        M::descriptor_static()
-    }
-
-    fn compute_full_name(package: &str, path_to_package: &str, proto: &DescriptorProto) -> String {
-        let mut full_name = package.to_owned();
-        if path_to_package.len() != 0 {
-            if full_name.len() != 0 {
-                full_name.push('.');
-            }
-            full_name.push_str(path_to_package);
-        }
-        if full_name.len() != 0 {
-            full_name.push('.');
-        }
-        full_name.push_str(proto.get_name());
-        full_name
-    }
-
-    // Non-generic part of `new` is a separate function
-    // to reduce code bloat from multiple instantiations.
-    fn new_non_generic_by_rust_name(
-        rust_name: &'static str,
-        fields: Vec<FieldAccessor>,
-        file: &'static FileDescriptorProto,
-        factory: &'static dyn MessageFactory,
-    ) -> MessageDescriptor {
-        let proto = find_message_by_rust_name(file, rust_name);
-
-        let mut field_proto_by_name = HashMap::new();
-        for field_proto in proto.message.get_field() {
-            field_proto_by_name.insert(field_proto.get_name(), field_proto);
-        }
-
-        let mut index_by_name = HashMap::new();
-        let mut index_by_name_or_json_name = HashMap::new();
-        let mut index_by_number = HashMap::new();
-
-        let mut full_name = file.get_package().to_string();
-        if full_name.len() > 0 {
-            full_name.push('.');
-        }
-        full_name.push_str(proto.message.get_name());
-
-        let fields: Vec<_> = fields
-            .into_iter()
-            .map(|f| {
-                let proto = *field_proto_by_name.get(&f.name).unwrap();
-                FieldDescriptor::new(f, proto)
-            })
-            .collect();
-        for (i, f) in fields.iter().enumerate() {
-            assert!(index_by_number
-                .insert(f.proto().get_number() as u32, i)
-                .is_none());
-            assert!(index_by_name
-                .insert(f.proto().get_name().to_owned(), i)
-                .is_none());
-            assert!(index_by_name_or_json_name
-                .insert(f.proto().get_name().to_owned(), i)
-                .is_none());
-
-            let json_name = f.json_name().to_owned();
-
-            if json_name != f.proto().get_name() {
-                assert!(index_by_name_or_json_name.insert(json_name, i).is_none());
-            }
-        }
-        MessageDescriptor {
-            full_name,
-            proto: proto.message,
-            factory,
-            fields,
-            index_by_name,
-            index_by_name_or_json_name,
-            index_by_number,
-        }
-    }
-
-    // Non-generic part of `new` is a separate function
-    // to reduce code bloat from multiple instantiations.
-    fn new_non_generic_by_pb_name(
-        protobuf_name_to_package: &'static str,
-        fields: Vec<FieldAccessor>,
-        file_descriptor_proto: &'static FileDescriptorProto,
-        factory: &'static dyn MessageFactory,
-    ) -> MessageDescriptor {
-        let (path_to_package, proto) =
-            match find_message_or_enum(file_descriptor_proto, protobuf_name_to_package) {
-                (path_to_package, MessageOrEnum::Message(m)) => (path_to_package, m),
-                (_, MessageOrEnum::Enum(_)) => panic!("not a message"),
-            };
-
-        let mut field_proto_by_name = HashMap::new();
-        for field_proto in proto.get_field() {
-            field_proto_by_name.insert(field_proto.get_name(), field_proto);
-        }
-
-        let mut index_by_name = HashMap::new();
-        let mut index_by_name_or_json_name = HashMap::new();
-        let mut index_by_number = HashMap::new();
-
-        let full_name = MessageDescriptor::compute_full_name(
-            file_descriptor_proto.get_package(),
-            &path_to_package,
-            &proto,
-        );
-        let fields: Vec<_> = fields
-            .into_iter()
-            .map(|f| {
-                let proto = *field_proto_by_name.get(&f.name).unwrap();
-                FieldDescriptor::new(f, proto)
-            })
-            .collect();
-
-        for (i, f) in fields.iter().enumerate() {
-            assert!(index_by_number
-                .insert(f.proto().get_number() as u32, i)
-                .is_none());
-            assert!(index_by_name
-                .insert(f.proto().get_name().to_owned(), i)
-                .is_none());
-            assert!(index_by_name_or_json_name
-                .insert(f.proto().get_name().to_owned(), i)
-                .is_none());
-
-            let json_name = f.json_name().to_owned();
-
-            if json_name != f.proto().get_name() {
-                assert!(index_by_name_or_json_name.insert(json_name, i).is_none());
-            }
-        }
-        MessageDescriptor {
-            full_name,
-            proto,
-            factory,
-            fields,
-            index_by_name,
-            index_by_name_or_json_name,
-            index_by_number,
-        }
-    }
-
-    /// Construct a new message descriptor.
-    ///
-    /// This operation is called from generated code and rarely
-    /// need to be called directly.
-    #[doc(hidden)]
-    #[deprecated(
-        since = "2.12",
-        note = "Please regenerate .rs files from .proto files to use newer APIs"
-    )]
-    pub fn new<M: 'static + Message + Default + Clone + PartialEq>(
-        rust_name: &'static str,
-        fields: Vec<FieldAccessor>,
-        file: &'static FileDescriptorProto,
-    ) -> MessageDescriptor {
-        let factory = &MessageFactoryImpl(marker::PhantomData::<M>);
-        MessageDescriptor::new_non_generic_by_rust_name(rust_name, fields, file, factory)
-    }
-
-    /// Construct a new message descriptor.
-    ///
-    /// This operation is called from generated code and rarely
-    /// need to be called directly.
-    #[doc(hidden)]
-    pub fn new_pb_name<M: 'static + Message + Default + Clone + PartialEq>(
-        protobuf_name_to_package: &'static str,
-        fields: Vec<FieldAccessor>,
-        file_descriptor_proto: &'static FileDescriptorProto,
-    ) -> MessageDescriptor {
-        let factory = &MessageFactoryImpl(marker::PhantomData::<M>);
-        MessageDescriptor::new_non_generic_by_pb_name(
-            protobuf_name_to_package,
-            fields,
-            file_descriptor_proto,
-            factory,
-        )
-    }
-
-    /// New empty message
-    pub fn new_instance(&self) -> Box<dyn Message> {
-        self.factory.new_instance()
-    }
-
-    /// Message name as given in `.proto` file
-    pub fn name(&self) -> &'static str {
-        self.proto.get_name()
-    }
-
-    /// Fully qualified protobuf message name
-    pub fn full_name(&self) -> &str {
-        &self.full_name[..]
-    }
-
-    /// Message field descriptors.
-    pub fn fields(&self) -> &[FieldDescriptor] {
-        &self.fields
-    }
-
-    /// Find message field by protobuf field name
-    ///
-    /// Note: protobuf field name might be different for Rust field name.
-    pub fn get_field_by_name<'a>(&'a self, name: &str) -> Option<&'a FieldDescriptor> {
-        let &index = self.index_by_name.get(name)?;
-        Some(&self.fields[index])
-    }
-
-    /// Find message field by field name or field JSON name
-    pub fn get_field_by_name_or_json_name<'a>(&'a self, name: &str) -> Option<&'a FieldDescriptor> {
-        let &index = self.index_by_name_or_json_name.get(name)?;
-        Some(&self.fields[index])
-    }
-
-    /// Find message field by field name
-    pub fn get_field_by_number(&self, number: u32) -> Option<&FieldDescriptor> {
-        let &index = self.index_by_number.get(&number)?;
-        Some(&self.fields[index])
-    }
-
-    /// Find field by name
-    // TODO: deprecate
-    pub fn field_by_name<'a>(&'a self, name: &str) -> &'a FieldDescriptor {
-        // TODO: clone is weird
-        let &index = self.index_by_name.get(&name.to_string()).unwrap();
-        &self.fields[index]
-    }
-
-    /// Find field by number
-    // TODO: deprecate
-    pub fn field_by_number<'a>(&'a self, number: u32) -> &'a FieldDescriptor {
-        let &index = self.index_by_number.get(&number).unwrap();
-        &self.fields[index]
-    }
-}
diff --git a/src/reflect/message/generated.rs b/src/reflect/message/generated.rs
new file mode 100644
index 0000000..45e3ded
--- /dev/null
+++ b/src/reflect/message/generated.rs
@@ -0,0 +1,135 @@
+//! Generated messages reflection support.
+
+use std::fmt;
+use std::marker;
+
+use crate::descriptor::FileDescriptorProto;
+use crate::message_dyn::MessageDyn;
+use crate::message_full::MessageFull;
+use crate::reflect::acc::FieldAccessor;
+use crate::reflect::file::index::FileDescriptorCommon;
+use crate::reflect::find_message_or_enum::find_message_or_enum;
+use crate::reflect::find_message_or_enum::MessageOrEnum;
+use crate::reflect::GeneratedOneofDescriptorData;
+
+/// Sized to dynamic reflection operations.
+pub(crate) trait MessageFactory: Send + Sync + 'static {
+    fn new_instance(&self) -> Box<dyn MessageDyn>;
+    fn default_instance(&self) -> &dyn MessageDyn;
+    fn clone(&self, message: &dyn MessageDyn) -> Box<dyn MessageDyn>;
+    fn eq(&self, a: &dyn MessageDyn, b: &dyn MessageDyn) -> bool;
+}
+
+impl<'a> fmt::Debug for &'a dyn MessageFactory {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_struct("MessageFactory").finish()
+    }
+}
+
+/// The only message factory implementation.
+pub(crate) struct MessageFactoryImpl<M>(pub marker::PhantomData<M>);
+
+impl<M> MessageFactory for MessageFactoryImpl<M>
+where
+    M: MessageFull,
+{
+    fn new_instance(&self) -> Box<dyn MessageDyn> {
+        let m: M = Default::default();
+        Box::new(m)
+    }
+
+    fn default_instance(&self) -> &dyn MessageDyn {
+        M::default_instance() as &dyn MessageDyn
+    }
+
+    fn clone(&self, message: &dyn MessageDyn) -> Box<dyn MessageDyn> {
+        let m: &M = message.downcast_ref().expect("wrong message type");
+        Box::new(m.clone())
+    }
+
+    fn eq(&self, a: &dyn MessageDyn, b: &dyn MessageDyn) -> bool {
+        let a: &M = a.downcast_ref().expect("wrong message type");
+        let b: &M = b.downcast_ref().expect("wrong message type");
+        a == b
+    }
+}
+
+#[doc(hidden)]
+pub struct GeneratedMessageDescriptorData {
+    pub(crate) protobuf_name_to_package: &'static str,
+    pub(crate) fields: Vec<FieldAccessor>,
+    pub(crate) factory: &'static dyn MessageFactory,
+    pub(crate) oneofs: Vec<GeneratedOneofDescriptorData>,
+}
+
+impl GeneratedMessageDescriptorData {
+    /// Construct a new message descriptor.
+    ///
+    /// This operation is called from generated code and rarely
+    /// need to be called directly.
+    ///
+    /// This function is not a part of public API.
+    #[doc(hidden)]
+    pub fn new_2<M: MessageFull>(
+        protobuf_name_to_package: &'static str,
+        fields: Vec<FieldAccessor>,
+        oneofs: Vec<GeneratedOneofDescriptorData>,
+    ) -> GeneratedMessageDescriptorData {
+        let factory = &MessageFactoryImpl(marker::PhantomData::<M>);
+        GeneratedMessageDescriptorData {
+            protobuf_name_to_package,
+            fields,
+            factory,
+            oneofs,
+        }
+    }
+}
+
+#[derive(Debug)]
+pub(crate) struct NonMapMessageDescriptor {
+    pub(crate) factory: &'static dyn MessageFactory,
+
+    pub(crate) fields: Vec<FieldAccessor>,
+}
+
+#[derive(Debug)]
+pub(crate) struct GeneratedMessageDescriptor {
+    pub(crate) non_map: Option<NonMapMessageDescriptor>,
+}
+
+impl GeneratedMessageDescriptor {
+    pub(crate) fn new_map_entry() -> GeneratedMessageDescriptor {
+        GeneratedMessageDescriptor { non_map: None }
+    }
+
+    pub(crate) fn new(
+        data: GeneratedMessageDescriptorData,
+        file_descriptor_proto: &'static FileDescriptorProto,
+        _file_index: &FileDescriptorCommon,
+    ) -> GeneratedMessageDescriptor {
+        let GeneratedMessageDescriptorData {
+            protobuf_name_to_package,
+            fields,
+            factory,
+            oneofs: _,
+        } = data;
+
+        let (_path_to_package, _proto) =
+            match find_message_or_enum(file_descriptor_proto, protobuf_name_to_package) {
+                Some((path_to_package, MessageOrEnum::Message(m))) => (path_to_package, m),
+                Some((_, MessageOrEnum::Enum(_))) => panic!("not a message"),
+                None => panic!("not found"),
+            };
+
+        GeneratedMessageDescriptor {
+            non_map: Some(NonMapMessageDescriptor { factory, fields }),
+        }
+    }
+
+    pub(crate) fn non_map(&self) -> &NonMapMessageDescriptor {
+        match &self.non_map {
+            Some(non_map) => non_map,
+            None => panic!("map message"),
+        }
+    }
+}
diff --git a/src/reflect/message/is_initialized_is_always_true.rs b/src/reflect/message/is_initialized_is_always_true.rs
new file mode 100644
index 0000000..e40b56d
--- /dev/null
+++ b/src/reflect/message/is_initialized_is_always_true.rs
@@ -0,0 +1,151 @@
+use std::collections::HashMap;
+use std::collections::HashSet;
+
+use crate::descriptor::field_descriptor_proto::Label;
+use crate::descriptor::FileDescriptorProto;
+use crate::reflect::field::index::FieldIndex;
+use crate::reflect::field::index::ForwardProtobufFieldType;
+use crate::reflect::field::index::ForwardProtobufTypeBox;
+use crate::reflect::file::index::MessageIndices;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::RuntimeType;
+use crate::reflect::Syntax;
+
+pub(crate) fn compute_is_initialized_is_always_true(
+    messages: &mut [MessageIndices],
+    file_fields: &[FieldIndex],
+    file: &FileDescriptorProto,
+) {
+    for message in messages.iter_mut() {
+        message.is_initialized_is_always_true =
+            is_initialized_is_always_true_ignoring_deps(message, file);
+    }
+
+    // Map from a message to messages who include it. E.g. for:
+    // ```
+    // 0: message A {}
+    // 1: message B { A a = 10; }
+    // ```
+    // This map will contain: `{0: [1]}`
+    let mut rdeps: HashMap<usize, Vec<usize>> = HashMap::new();
+
+    for i in 0..messages.len() {
+        let message = &mut messages[i];
+
+        if !message.is_initialized_is_always_true {
+            continue;
+        }
+
+        let mut is_initialized_is_always_true = true;
+        for ft in message_field_messages(message, file_fields) {
+            match ft {
+                MessageType::ThisFile(j) => {
+                    rdeps.entry(j).or_default().push(i);
+                }
+                MessageType::OtherFile(m) => {
+                    if !m.is_initialized_is_always_true() {
+                        is_initialized_is_always_true = false;
+                    }
+                }
+            }
+        }
+        message.is_initialized_is_always_true = is_initialized_is_always_true;
+    }
+
+    let mut invalidated: HashSet<usize> = HashSet::new();
+    let mut invalidate_stack: Vec<usize> = Vec::new();
+
+    for i in 0..messages.len() {
+        let message = &messages[i];
+        if message.is_initialized_is_always_true {
+            continue;
+        }
+
+        invalidate_stack.push(i);
+    }
+
+    while let Some(i) = invalidate_stack.pop() {
+        if !invalidated.insert(i) {
+            continue;
+        }
+
+        messages[i].is_initialized_is_always_true = false;
+        let next = rdeps.get(&i).map(|v| v.as_slice()).unwrap_or_default();
+        for next in next {
+            invalidate_stack.push(*next);
+        }
+    }
+}
+
+enum MessageType<'m> {
+    ThisFile(usize),
+    OtherFile(&'m MessageDescriptor),
+}
+
+fn message_field_messages<'a>(
+    message: &'a MessageIndices,
+    file_fields: &'a [FieldIndex],
+) -> impl Iterator<Item = MessageType<'a>> + 'a {
+    message_field_types(message, file_fields).filter_map(|f| match f {
+        ForwardProtobufTypeBox::ProtobufTypeBox(t) => match t.runtime() {
+            RuntimeType::Message(m) => Some(MessageType::OtherFile(m)),
+            _ => None,
+        },
+        ForwardProtobufTypeBox::CurrentFileEnum(_) => None,
+        ForwardProtobufTypeBox::CurrentFileMessage(i) => Some(MessageType::ThisFile(*i)),
+    })
+}
+
+fn message_field_types<'a>(
+    message: &'a MessageIndices,
+    file_fields: &'a [FieldIndex],
+) -> impl Iterator<Item = &'a ForwardProtobufTypeBox> {
+    enum Either<A, B> {
+        Left(A),
+        Right(B),
+    }
+
+    impl<T, A: Iterator<Item = T>, B: Iterator<Item = T>> Iterator for Either<A, B> {
+        type Item = T;
+
+        fn next(&mut self) -> Option<T> {
+            match self {
+                Either::Left(a) => a.next(),
+                Either::Right(b) => b.next(),
+            }
+        }
+    }
+
+    message
+        .message_index
+        .slice_fields(file_fields)
+        .iter()
+        .flat_map(|f| match &f.field_type {
+            ForwardProtobufFieldType::Singular(t) => Either::Left([t].into_iter()),
+            ForwardProtobufFieldType::Repeated(t) => Either::Left([t].into_iter()),
+            ForwardProtobufFieldType::Map(k, v) => Either::Right([k, v].into_iter()),
+        })
+}
+
+fn is_initialized_is_always_true_ignoring_deps(
+    message: &MessageIndices,
+    file: &FileDescriptorProto,
+) -> bool {
+    // Shortcut.
+    if Syntax::of_file(file) == Syntax::Proto3 {
+        return true;
+    }
+
+    // We don't support extensions properly but if we did,
+    // extensions should have been checked for `is_initialized`.
+    if !message.proto.extension_range.is_empty() {
+        return false;
+    }
+
+    for field in &message.proto.field {
+        if field.label() == Label::LABEL_REQUIRED {
+            return false;
+        }
+    }
+    true
+}
diff --git a/src/reflect/message/message_ref.rs b/src/reflect/message/message_ref.rs
new file mode 100644
index 0000000..1ca5638
--- /dev/null
+++ b/src/reflect/message/message_ref.rs
@@ -0,0 +1,83 @@
+use std::fmt;
+use std::ops::Deref;
+
+use crate::message_dyn::MessageDyn;
+use crate::reflect::dynamic::DynamicMessage;
+use crate::reflect::reflect_eq::ReflectEq;
+use crate::reflect::reflect_eq::ReflectEqMode;
+use crate::reflect::MessageDescriptor;
+use crate::MessageFull;
+
+#[derive(Clone, Debug)]
+enum MessageRefImpl<'a> {
+    Message(&'a dyn MessageDyn),
+    EmptyDynamic(DynamicMessage),
+}
+
+/// Wrapper around either [`MessageFull`] reference or a container for an empty dynamic message.
+#[derive(Clone, Debug)]
+pub struct MessageRef<'a> {
+    imp: MessageRefImpl<'a>,
+}
+
+impl<'a> fmt::Display for MessageRef<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self.deref(), f)
+    }
+}
+
+impl<'a> From<&'a dyn MessageDyn> for MessageRef<'a> {
+    fn from(m: &'a dyn MessageDyn) -> Self {
+        MessageRef {
+            imp: MessageRefImpl::Message(m),
+        }
+    }
+}
+
+impl<'a, M: MessageFull> From<&'a M> for MessageRef<'a> {
+    fn from(m: &'a M) -> Self {
+        MessageRef {
+            imp: MessageRefImpl::Message(m),
+        }
+    }
+}
+
+impl<'a> ReflectEq for MessageRef<'a> {
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
+        let ad = self.descriptor_dyn();
+        let bd = that.descriptor_dyn();
+        ad == bd && ad.reflect_eq(&**self, &**that, mode)
+    }
+}
+
+impl<'a> MessageRef<'a> {
+    /// Wrap a message.
+    pub fn new(message: &'a dyn MessageDyn) -> MessageRef<'a> {
+        MessageRef {
+            imp: MessageRefImpl::Message(message),
+        }
+    }
+
+    /// Default (empty) instance of given message type.
+    pub fn default_instance(message: &MessageDescriptor) -> MessageRef<'static> {
+        // Note we create a native generated instance for generated types
+        // and dynamic message for dynamic types.
+        match message.default_instance() {
+            Some(m) => MessageRef::new(m),
+            None => MessageRef {
+                imp: MessageRefImpl::EmptyDynamic(DynamicMessage::new(message.clone())),
+            },
+        }
+    }
+}
+
+impl<'a> Deref for MessageRef<'a> {
+    type Target = dyn MessageDyn;
+
+    fn deref(&self) -> &dyn MessageDyn {
+        match &self.imp {
+            MessageRefImpl::Message(m) => *m,
+            MessageRefImpl::EmptyDynamic(e) => e,
+        }
+    }
+}
diff --git a/src/reflect/message/mod.rs b/src/reflect/message/mod.rs
new file mode 100644
index 0000000..583fa3b
--- /dev/null
+++ b/src/reflect/message/mod.rs
@@ -0,0 +1,380 @@
+use std::fmt;
+use std::io::Read;
+
+use crate::descriptor::DescriptorProto;
+use crate::descriptor::FileDescriptorProto;
+use crate::message_dyn::MessageDyn;
+use crate::message_full::MessageFull;
+use crate::reflect::dynamic::DynamicMessage;
+use crate::reflect::file::index::MessageIndices;
+use crate::reflect::file::FileDescriptorImpl;
+use crate::reflect::message::generated::GeneratedMessageDescriptor;
+use crate::reflect::reflect_eq::ReflectEq;
+use crate::reflect::reflect_eq::ReflectEqMode;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::FieldDescriptor;
+use crate::reflect::FileDescriptor;
+use crate::reflect::OneofDescriptor;
+use crate::CodedInputStream;
+
+pub(crate) mod generated;
+pub(crate) mod is_initialized_is_always_true;
+pub(crate) mod message_ref;
+
+/// Dynamic representation of message type.
+///
+/// Used for reflection.
+#[derive(Clone, Eq, PartialEq, Hash)]
+pub struct MessageDescriptor {
+    pub(crate) file_descriptor: FileDescriptor,
+    pub(crate) index: usize,
+}
+
+impl fmt::Display for MessageDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{}", self.full_name())
+    }
+}
+
+impl fmt::Debug for MessageDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_struct("MessageDescriptor").finish_non_exhaustive()
+    }
+}
+
+impl MessageDescriptor {
+    pub(crate) fn new(file_descriptor: FileDescriptor, index: usize) -> MessageDescriptor {
+        MessageDescriptor {
+            file_descriptor,
+            index,
+        }
+    }
+
+    /// Get underlying `DescriptorProto` object.
+    pub fn proto(&self) -> &DescriptorProto {
+        self.file_descriptor.message_proto_by_index(self.index)
+    }
+
+    /// Message name as specified in `.proto` file.
+    pub fn name(&self) -> &str {
+        self.proto().name()
+    }
+
+    fn index_entry(&self) -> &MessageIndices {
+        self.file_descriptor.message_indices(self.index)
+    }
+
+    /// Get a message descriptor for given message type
+    pub fn for_type<M: MessageFull>() -> MessageDescriptor {
+        M::descriptor()
+    }
+
+    /// Messages declared in this messages.
+    pub fn nested_messages(&self) -> impl Iterator<Item = MessageDescriptor> + '_ {
+        self.index_entry()
+            .nested_messages
+            .iter()
+            .map(|i| MessageDescriptor::new(self.file_descriptor.clone(), *i))
+    }
+
+    /// Get enums declared in this message.
+    pub fn nested_enums(&self) -> impl Iterator<Item = EnumDescriptor> + '_ {
+        self.index_entry()
+            .nested_enums
+            .clone()
+            .map(|i| EnumDescriptor::new(self.file_descriptor.clone(), i))
+    }
+
+    /// Get a message containing this message, or `None` if this message is declared at file level.
+    pub fn enclosing_message(&self) -> Option<MessageDescriptor> {
+        self.index_entry()
+            .enclosing_message
+            .map(|i| MessageDescriptor::new(self.file_descriptor.clone(), i))
+    }
+
+    pub(crate) fn get_impl(&self) -> MessageDescriptorImplRef {
+        match &self.file_descriptor.imp {
+            FileDescriptorImpl::Generated(g) => {
+                MessageDescriptorImplRef::Generated(&g.messages[self.index])
+            }
+            FileDescriptorImpl::Dynamic(..) => MessageDescriptorImplRef::Dynamic,
+        }
+    }
+
+    /// [`FileDescriptor`] containing this message.
+    pub fn file_descriptor(&self) -> &FileDescriptor {
+        &self.file_descriptor
+    }
+
+    /// `FileDescriptorProto` containg this message type
+    pub fn file_descriptor_proto(&self) -> &FileDescriptorProto {
+        self.file_descriptor().proto()
+    }
+
+    /// This message descriptor is a map entry.
+    pub fn is_map_entry(&self) -> bool {
+        self.index().map_entry
+    }
+
+    fn assert_not_map_entry(&self) {
+        assert!(
+            !self.is_map_entry(),
+            "message is map entry: {}",
+            self.full_name()
+        );
+    }
+
+    /// Message is considered always initialized.
+    #[doc(hidden)]
+    pub fn is_initialized_is_always_true(&self) -> bool {
+        self.index().is_initialized_is_always_true
+    }
+
+    /// New empty message.
+    ///
+    /// # Panics
+    ///
+    /// If this message is a map entry message.
+    pub fn new_instance(&self) -> Box<dyn MessageDyn> {
+        self.assert_not_map_entry();
+        match self.get_impl() {
+            MessageDescriptorImplRef::Generated(g) => g.non_map().factory.new_instance(),
+            MessageDescriptorImplRef::Dynamic => Box::new(DynamicMessage::new(self.clone())),
+        }
+    }
+
+    /// Shared immutable empty message.
+    ///
+    /// Returns `None` for dynamic message.
+    ///
+    /// # Panics
+    ///
+    /// If this message is a map entry message.
+    pub fn default_instance(&self) -> Option<&'static dyn MessageDyn> {
+        self.assert_not_map_entry();
+        match self.get_impl() {
+            MessageDescriptorImplRef::Generated(g) => Some(g.non_map().factory.default_instance()),
+            MessageDescriptorImplRef::Dynamic => None,
+        }
+    }
+
+    /// Clone a message
+    pub(crate) fn clone_message(&self, message: &dyn MessageDyn) -> Box<dyn MessageDyn> {
+        assert!(&message.descriptor_dyn() == self);
+        match self.get_impl() {
+            MessageDescriptorImplRef::Generated(g) => g.non_map().factory.clone(message),
+            MessageDescriptorImplRef::Dynamic => {
+                let message: &DynamicMessage = DynamicMessage::downcast_ref(message);
+                Box::new(message.clone())
+            }
+        }
+    }
+
+    /// Check if two messages equal.
+    ///
+    /// # Panics
+    ///
+    /// Is any message has different type than this descriptor.
+    pub fn eq(&self, a: &dyn MessageDyn, b: &dyn MessageDyn) -> bool {
+        match self.get_impl() {
+            MessageDescriptorImplRef::Generated(g) => g.non_map().factory.eq(a, b),
+            MessageDescriptorImplRef::Dynamic => unimplemented!(),
+        }
+    }
+
+    /// Similar to `eq`, but considers `NaN` values equal.
+    ///
+    /// # Panics
+    ///
+    /// Is any message has different type than this descriptor.
+    pub(crate) fn reflect_eq(
+        &self,
+        a: &dyn MessageDyn,
+        b: &dyn MessageDyn,
+        mode: &ReflectEqMode,
+    ) -> bool {
+        // Explicitly force panic even if field list is empty
+        assert_eq!(self, &a.descriptor_dyn());
+        assert_eq!(self, &b.descriptor_dyn());
+
+        for field in self.fields() {
+            let af = field.get_reflect(a);
+            let bf = field.get_reflect(b);
+            if !af.reflect_eq(&bf, mode) {
+                return false;
+            }
+        }
+        true
+    }
+
+    pub(crate) fn reflect_eq_maybe_unrelated(
+        a: &dyn MessageDyn,
+        b: &dyn MessageDyn,
+        mode: &ReflectEqMode,
+    ) -> bool {
+        let ad = a.descriptor_dyn();
+        let bd = b.descriptor_dyn();
+        ad == bd && ad.reflect_eq(a, b, mode)
+    }
+
+    /// Fully qualified protobuf message name
+    pub fn full_name(&self) -> &str {
+        &self.index_entry().full_name
+    }
+
+    /// Name relative to the package where the message is declared.
+    pub fn name_to_package(&self) -> &str {
+        &self.index_entry().name_to_package
+    }
+
+    /// Nested oneofs including synthetic.
+    pub fn all_oneofs<'a>(&'a self) -> impl Iterator<Item = OneofDescriptor> + 'a {
+        self.index_entry()
+            .oneofs
+            .clone()
+            .map(move |i| OneofDescriptor {
+                file_descriptor: self.file_descriptor.clone(),
+                index: i,
+            })
+    }
+
+    /// Non-synthetic oneofs.
+    pub fn oneofs<'a>(&'a self) -> impl Iterator<Item = OneofDescriptor> + 'a {
+        self.all_oneofs().filter(|oneof| !oneof.is_synthetic())
+    }
+
+    /// Get message oneof by name (**not implemented**).
+    pub fn oneof_by_name(&self, name: &str) -> Option<OneofDescriptor> {
+        self.all_oneofs().find(|oneof| oneof.name() == name)
+    }
+
+    /// Message field descriptors.
+    pub fn fields<'a>(&'a self) -> impl Iterator<Item = FieldDescriptor> + 'a {
+        self.index()
+            .message_index
+            .regular_field_range()
+            .map(move |index| FieldDescriptor {
+                file_descriptor: self.file_descriptor.clone(),
+                index,
+            })
+    }
+
+    /// Extension fields.
+    pub fn extensions(&self) -> impl Iterator<Item = FieldDescriptor> + '_ {
+        self.index()
+            .message_index
+            .extension_field_range()
+            .map(move |index| FieldDescriptor {
+                file_descriptor: self.file_descriptor.clone(),
+                index,
+            })
+    }
+
+    pub(crate) fn index(&self) -> &MessageIndices {
+        &self.file_descriptor.common().messages[self.index]
+    }
+
+    pub(crate) fn field_by_index(&self, index: usize) -> FieldDescriptor {
+        FieldDescriptor {
+            file_descriptor: self.file_descriptor.clone(),
+            index: self.index().message_index.first_field_index + index,
+        }
+    }
+
+    /// Find message field by protobuf field name
+    ///
+    /// Note: protobuf field name might be different for Rust field name.
+    // TODO: return value, not pointer, pointer is not compatible with dynamic message
+    pub fn field_by_name(&self, name: &str) -> Option<FieldDescriptor> {
+        let &index = self.index().message_index.field_index_by_name.get(name)?;
+        Some(self.field_by_index(index))
+    }
+
+    /// Find message field by field name or field JSON name
+    pub fn field_by_name_or_json_name<'a>(&'a self, name: &str) -> Option<FieldDescriptor> {
+        let &index = self
+            .index()
+            .message_index
+            .field_index_by_name_or_json_name
+            .get(name)?;
+        Some(self.field_by_index(index))
+    }
+
+    /// Find message field by field name
+    pub fn field_by_number(&self, number: u32) -> Option<FieldDescriptor> {
+        let &index = self
+            .index()
+            .message_index
+            .field_index_by_number
+            .get(&number)?;
+        Some(self.field_by_index(index))
+    }
+
+    /// Parse message from stream.
+    pub fn parse_from(&self, is: &mut CodedInputStream) -> crate::Result<Box<dyn MessageDyn>> {
+        let mut r = self.new_instance();
+        r.merge_from_dyn(is)?;
+        r.check_initialized_dyn()?;
+        Ok(r)
+    }
+
+    /// Parse message from reader.
+    /// Parse stops on EOF or when error encountered.
+    pub fn parse_from_reader(&self, reader: &mut dyn Read) -> crate::Result<Box<dyn MessageDyn>> {
+        let mut is = CodedInputStream::new(reader);
+        let r = self.parse_from(&mut is)?;
+        is.check_eof()?;
+        Ok(r)
+    }
+
+    /// Parse message from byte array.
+    pub fn parse_from_bytes(&self, bytes: &[u8]) -> crate::Result<Box<dyn MessageDyn>> {
+        let mut is = CodedInputStream::from_bytes(bytes);
+        let r = self.parse_from(&mut is)?;
+        is.check_eof()?;
+        Ok(r)
+    }
+}
+
+pub(crate) enum MessageDescriptorImplRef {
+    Generated(&'static GeneratedMessageDescriptor),
+    Dynamic,
+}
+
+#[cfg(test)]
+mod test {
+    use crate::descriptor::descriptor_proto::ExtensionRange;
+    use crate::descriptor::field_descriptor_proto::Type;
+    use crate::descriptor::DescriptorProto;
+    use crate::descriptor::FieldDescriptorProto;
+    use crate::EnumFull;
+    use crate::MessageFull;
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Too slow on Miri.
+    fn nested_messages() {
+        assert!(DescriptorProto::descriptor()
+            .nested_messages()
+            .collect::<Vec<_>>()
+            .contains(&ExtensionRange::descriptor()));
+    }
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Too slow on Miri.
+    fn nested_enums() {
+        assert!(FieldDescriptorProto::descriptor()
+            .nested_enums()
+            .collect::<Vec<_>>()
+            .contains(&Type::enum_descriptor()));
+    }
+
+    #[test]
+    #[cfg_attr(miri, ignore)] // Too slow on Miri.
+    fn enclosing_message() {
+        assert_eq!(
+            Some(DescriptorProto::descriptor()),
+            ExtensionRange::descriptor().enclosing_message()
+        );
+        assert_eq!(None, DescriptorProto::descriptor().enclosing_message());
+    }
+}
diff --git a/src/reflect/mod.rs b/src/reflect/mod.rs
index e120e16..c01c0e7 100644
--- a/src/reflect/mod.rs
+++ b/src/reflect/mod.rs
@@ -1,28 +1,75 @@
-//! Reflection implementation for protobuf types.
-
-use crate::message::Message;
+//! # Reflection implementation for protobuf data
+//!
+//! ## Generated vs dynamic
+//!
+//! rust-protobuf supports reflection for both:
+//! * generated messages (generated rust code)
+//! * dynamic messages (created from arbitrary `FileDescriptorProto` without code generation)
+//!
+//! The API to work with these types of messages is the same.
+//!
+//! ## API
+//!
+//! The API roughly follows Google protobuf C++ and Java API.
+//! Some minor adjustements are made to make code more idiomatic to rust.
 
 mod acc;
-pub mod accessor;
+mod dynamic;
 mod enums;
+pub(crate) mod error;
 mod field;
+mod file;
 mod find_message_or_enum;
 mod map;
-mod message;
+pub(crate) mod message;
+mod oneof;
 mod optional;
+mod protobuf_type_box;
 mod repeated;
-mod value;
+mod runtime_type_box;
+mod service;
+mod type_dynamic;
+pub(crate) mod value;
 
-pub use self::value::ProtobufValue;
-pub use self::value::ReflectValueRef;
-#[doc(hidden)]
-#[deprecated(since = "2.11", note = "Use ReflectValueRef instead")]
-pub use self::value::ReflectValueRef as ProtobufValueRef;
+// Runtime type types are public, but not visible in public API.
+pub(crate) mod runtime_types;
+
+pub(crate) mod types;
+
+pub(crate) mod reflect_eq;
 
 pub mod rt;
 
+pub(crate) mod name;
+
+#[doc(hidden)]
+pub use self::enums::generated::GeneratedEnumDescriptorData;
 pub use self::enums::EnumDescriptor;
 pub use self::enums::EnumValueDescriptor;
+pub use self::field::runtime_field_type::RuntimeFieldType;
 pub use self::field::FieldDescriptor;
 pub use self::field::ReflectFieldRef;
+#[doc(hidden)]
+pub use self::file::generated::GeneratedFileDescriptor;
+pub use self::file::syntax::Syntax;
+pub use self::file::FileDescriptor;
+pub use self::map::ReflectMapMut;
+pub use self::map::ReflectMapRef;
+#[doc(hidden)]
+pub use self::message::generated::GeneratedMessageDescriptorData;
+pub use self::message::message_ref::MessageRef;
 pub use self::message::MessageDescriptor;
+#[doc(hidden)]
+pub use self::oneof::generated::GeneratedOneofDescriptorData;
+pub use self::oneof::OneofDescriptor;
+pub use self::optional::ReflectOptionalRef;
+pub use self::reflect_eq::ReflectEq;
+pub use self::reflect_eq::ReflectEqMode;
+pub use self::repeated::ReflectRepeatedMut;
+pub use self::repeated::ReflectRepeatedRef;
+pub use self::runtime_type_box::RuntimeType;
+pub use self::service::MethodDescriptor;
+pub use self::service::ServiceDescriptor;
+pub use self::value::value_box::ReflectValueBox;
+pub use self::value::value_ref::ReflectValueRef;
+pub use self::value::ProtobufValue;
diff --git a/src/reflect/name.rs b/src/reflect/name.rs
new file mode 100644
index 0000000..7fd39af
--- /dev/null
+++ b/src/reflect/name.rs
@@ -0,0 +1,53 @@
+pub(crate) fn concat_paths(a: &str, b: &str) -> String {
+    if a.is_empty() {
+        b.to_owned()
+    } else if b.is_empty() {
+        b.to_owned()
+    } else {
+        format!("{}.{}", a, b)
+    }
+}
+
+pub(crate) fn protobuf_name_starts_with_package<'a>(
+    name: &'a str,
+    package: &str,
+) -> Option<&'a str> {
+    assert!(
+        !package.starts_with("."),
+        "package must not start with dot: {}",
+        package
+    );
+
+    assert!(
+        name.starts_with("."),
+        "full name must start with dot: {}",
+        name
+    );
+    let name = &name[1..];
+    // assert!(!name.starts_with("."), "full name must not start with dot: {}", name);
+
+    if package.is_empty() {
+        Some(name)
+    } else {
+        if name.starts_with(package) {
+            let rem = &name[package.len()..];
+            if rem.starts_with(".") {
+                Some(&rem[1..])
+            } else {
+                None
+            }
+        } else {
+            None
+        }
+    }
+}
+
+#[test]
+fn test_protobuf_name_starts_with_package() {
+    assert_eq!(
+        Some("bar"),
+        protobuf_name_starts_with_package(".foo.bar", "foo")
+    );
+    assert_eq!(None, protobuf_name_starts_with_package(".foo", "foo"));
+    assert_eq!(Some("foo"), protobuf_name_starts_with_package(".foo", ""));
+}
diff --git a/src/reflect/oneof/generated.rs b/src/reflect/oneof/generated.rs
new file mode 100644
index 0000000..6ed1a0b
--- /dev/null
+++ b/src/reflect/oneof/generated.rs
@@ -0,0 +1,30 @@
+use crate::OneofFull;
+
+#[doc(hidden)]
+pub struct GeneratedOneofDescriptorData {
+    pub(crate) name: &'static str,
+}
+
+impl GeneratedOneofDescriptorData {
+    #[doc(hidden)]
+    pub fn new<O>(name: &'static str) -> GeneratedOneofDescriptorData
+    where
+        O: OneofFull,
+    {
+        GeneratedOneofDescriptorData { name }
+    }
+}
+
+#[derive(Debug)]
+pub(crate) struct GeneratedOneofDescriptor {}
+
+impl GeneratedOneofDescriptor {
+    /// Synthetic oneof for proto3 optional field.
+    pub(crate) fn new_synthetic() -> GeneratedOneofDescriptor {
+        GeneratedOneofDescriptor {}
+    }
+
+    pub(crate) fn new(_data: &GeneratedOneofDescriptorData) -> GeneratedOneofDescriptor {
+        GeneratedOneofDescriptor {}
+    }
+}
diff --git a/src/reflect/oneof/mod.rs b/src/reflect/oneof/mod.rs
new file mode 100644
index 0000000..6c33bd9
--- /dev/null
+++ b/src/reflect/oneof/mod.rs
@@ -0,0 +1,79 @@
+pub(crate) mod generated;
+
+use crate::descriptor::OneofDescriptorProto;
+use crate::reflect::file::index::OneofIndices;
+use crate::reflect::file::FileDescriptorImpl;
+use crate::reflect::oneof::generated::GeneratedOneofDescriptor;
+use crate::reflect::FieldDescriptor;
+use crate::reflect::FileDescriptor;
+use crate::reflect::MessageDescriptor;
+
+/// Oneof descriptor.
+#[derive(Eq, PartialEq, Clone, Debug)]
+pub struct OneofDescriptor {
+    pub(crate) file_descriptor: FileDescriptor,
+    pub(crate) index: usize,
+}
+
+pub(crate) enum OneofDescriptorImplRef {
+    Generated(&'static GeneratedOneofDescriptor),
+    Dynamic,
+}
+
+impl OneofDescriptor {
+    fn index_entry(&self) -> &OneofIndices {
+        &self.file_descriptor.common().oneofs[self.index]
+    }
+
+    /// `.proto` part associated with this descriptor
+    pub fn proto(&self) -> &OneofDescriptorProto {
+        let index_entry = self.index_entry();
+        let message_descriptor = self
+            .file_descriptor
+            .message_proto_by_index(index_entry.containing_message);
+        &message_descriptor.oneof_decl[index_entry.index_in_containing_message]
+    }
+
+    /// Oneof name as specified in `.proto` file.
+    pub fn name(&self) -> &str {
+        self.proto().name()
+    }
+
+    #[allow(dead_code)]
+    pub(crate) fn _get_impl(&self) -> OneofDescriptorImplRef {
+        match &self.file_descriptor.imp {
+            FileDescriptorImpl::Generated(g) => {
+                OneofDescriptorImplRef::Generated(&g.oneofs[self.index])
+            }
+            FileDescriptorImpl::Dynamic(..) => OneofDescriptorImplRef::Dynamic,
+        }
+    }
+
+    /// Message which contains this oneof.
+    pub fn containing_message(&self) -> MessageDescriptor {
+        MessageDescriptor {
+            file_descriptor: self.file_descriptor.clone(),
+            index: self.index_entry().containing_message,
+        }
+    }
+
+    /// This oneof is not present in sources.
+    pub fn is_synthetic(&self) -> bool {
+        self.index_entry().synthetic
+    }
+
+    /// Fully qualified name of oneof (fully qualified name of enclosing message
+    /// followed by oneof name).
+    pub fn full_name(&self) -> String {
+        format!("{}.{}", self.containing_message(), self.name())
+    }
+
+    /// Fields in this oneof.
+    pub fn fields<'a>(&'a self) -> impl Iterator<Item = FieldDescriptor> + 'a {
+        let message = self.containing_message();
+        self.index_entry()
+            .fields
+            .iter()
+            .map(move |&i| message.field_by_index(i))
+    }
+}
diff --git a/src/reflect/optional.rs b/src/reflect/optional.rs
deleted file mode 100644
index f719a2c..0000000
--- a/src/reflect/optional.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-use std::mem;
-
-use super::value::ProtobufValue;
-use crate::singular::*;
-
-pub trait ReflectOptional: 'static {
-    fn to_option(&self) -> Option<&dyn ProtobufValue>;
-
-    fn set_value(&mut self, value: &dyn ProtobufValue);
-}
-
-impl<V: ProtobufValue + Clone + 'static> ReflectOptional for Option<V> {
-    fn to_option(&self) -> Option<&dyn ProtobufValue> {
-        self.as_ref().map(|v| v as &dyn ProtobufValue)
-    }
-
-    fn set_value(&mut self, value: &dyn ProtobufValue) {
-        match value.as_any().downcast_ref::<V>() {
-            Some(v) => mem::replace(self, Some(v.clone())),
-            None => panic!(),
-        };
-    }
-}
-
-impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularField<V> {
-    fn to_option(&self) -> Option<&dyn ProtobufValue> {
-        self.as_ref().map(|v| v as &dyn ProtobufValue)
-    }
-
-    fn set_value(&mut self, value: &dyn ProtobufValue) {
-        match value.as_any().downcast_ref::<V>() {
-            Some(v) => mem::replace(self, SingularField::some(v.clone())),
-            None => panic!(),
-        };
-    }
-}
-
-impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularPtrField<V> {
-    fn to_option(&self) -> Option<&dyn ProtobufValue> {
-        self.as_ref().map(|v| v as &dyn ProtobufValue)
-    }
-
-    fn set_value(&mut self, value: &dyn ProtobufValue) {
-        match value.as_any().downcast_ref::<V>() {
-            Some(v) => mem::replace(self, SingularPtrField::some(v.clone())),
-            None => panic!(),
-        };
-    }
-}
diff --git a/src/reflect/optional/mod.rs b/src/reflect/optional/mod.rs
new file mode 100644
index 0000000..9d34a30
--- /dev/null
+++ b/src/reflect/optional/mod.rs
@@ -0,0 +1,74 @@
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectEq;
+use crate::reflect::ReflectEqMode;
+use crate::reflect::ReflectValueRef;
+use crate::reflect::RuntimeType;
+
+enum Impl<'a> {
+    None(RuntimeType),
+    Some(ReflectValueRef<'a>),
+}
+
+/// Singular field field and value type.
+pub struct ReflectOptionalRef<'a>(Impl<'a>);
+
+impl<'a> PartialEq for ReflectOptionalRef<'a> {
+    fn eq(&self, other: &Self) -> bool {
+        self.reflect_eq(other, &ReflectEqMode::default())
+    }
+}
+
+impl<'a> ReflectEq for ReflectOptionalRef<'a> {
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
+        match (&self.0, &that.0) {
+            (Impl::None(at), Impl::None(bt)) => at == bt,
+            (Impl::Some(a), Impl::Some(b)) => a.reflect_eq(b, mode),
+            (Impl::None(_), Impl::Some(_)) | (Impl::Some(_), Impl::None(_)) => false,
+        }
+    }
+}
+
+impl<'a> ReflectOptionalRef<'a> {
+    /// No value.
+    pub fn none(elem: RuntimeType) -> ReflectOptionalRef<'a> {
+        ReflectOptionalRef(Impl::None(elem))
+    }
+
+    /// Has value.
+    pub fn some(value: ReflectValueRef<'a>) -> ReflectOptionalRef<'a> {
+        ReflectOptionalRef(Impl::Some(value))
+    }
+
+    pub(crate) fn none_from<V: ProtobufValue>() -> ReflectOptionalRef<'a> {
+        ReflectOptionalRef::none(V::RuntimeType::runtime_type_box())
+    }
+
+    pub(crate) fn some_from<V: ProtobufValue>(value: &'a V) -> ReflectOptionalRef<'a> {
+        ReflectOptionalRef::some(V::RuntimeType::as_ref(value))
+    }
+
+    pub(crate) fn new_filter_non_zero<V: ProtobufValue>(v: &'a V) -> ReflectOptionalRef<'a> {
+        if V::RuntimeType::is_non_zero(v) {
+            ReflectOptionalRef::some_from(v)
+        } else {
+            ReflectOptionalRef::none_from::<V>()
+        }
+    }
+
+    pub(crate) fn new_from_option<V: ProtobufValue>(v: Option<&'a V>) -> ReflectOptionalRef<'a> {
+        if let Some(v) = v {
+            ReflectOptionalRef::some_from(v)
+        } else {
+            ReflectOptionalRef::none_from::<V>()
+        }
+    }
+
+    /// Obtain the value, drop the type.
+    pub fn value(&self) -> Option<ReflectValueRef<'a>> {
+        match &self.0 {
+            Impl::None(_) => None,
+            Impl::Some(v) => Some(v.clone()),
+        }
+    }
+}
diff --git a/src/reflect/protobuf_type_box.rs b/src/reflect/protobuf_type_box.rs
new file mode 100644
index 0000000..e60739f
--- /dev/null
+++ b/src/reflect/protobuf_type_box.rs
@@ -0,0 +1,225 @@
+use crate::descriptor::field_descriptor_proto::Type;
+use crate::error::ProtobufError;
+use crate::error::WireError;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectRepeatedMut;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::RuntimeType;
+use crate::wire_format::WireType;
+use crate::CodedInputStream;
+
+/// Runtime type and protobuf type.
+#[derive(Debug, Clone)]
+pub(crate) struct ProtobufType {
+    /// Runtime type.
+    runtime: RuntimeType,
+    /// Wire type.
+    t: Type,
+}
+
+impl ProtobufType {
+    pub(crate) fn runtime(&self) -> &RuntimeType {
+        &self.runtime
+    }
+
+    pub(crate) fn t(&self) -> Type {
+        self.t
+    }
+
+    pub(crate) fn _into_runtime(self) -> RuntimeType {
+        self.runtime
+    }
+
+    pub(crate) fn message(message: MessageDescriptor) -> ProtobufType {
+        ProtobufType::new(RuntimeType::Message(message), Type::TYPE_MESSAGE).unwrap()
+    }
+
+    pub(crate) fn enumeration(enumeration: EnumDescriptor) -> ProtobufType {
+        ProtobufType::new(RuntimeType::Enum(enumeration), Type::TYPE_ENUM).unwrap()
+    }
+
+    pub(crate) fn from_proto_type(t: Type) -> ProtobufType {
+        ProtobufType::new(RuntimeType::from_proto_type(t), t).unwrap()
+    }
+
+    pub(crate) fn new(runtime: RuntimeType, t: Type) -> crate::Result<ProtobufType> {
+        match (t, &runtime) {
+            (Type::TYPE_INT32, RuntimeType::I32) => {}
+            (Type::TYPE_INT64, RuntimeType::I64) => {}
+            (Type::TYPE_UINT32, RuntimeType::U32) => {}
+            (Type::TYPE_UINT64, RuntimeType::U64) => {}
+            (Type::TYPE_SINT32, RuntimeType::I32) => {}
+            (Type::TYPE_SINT64, RuntimeType::I64) => {}
+            (Type::TYPE_FIXED32, RuntimeType::U32) => {}
+            (Type::TYPE_FIXED64, RuntimeType::U64) => {}
+            (Type::TYPE_SFIXED32, RuntimeType::I32) => {}
+            (Type::TYPE_SFIXED64, RuntimeType::I64) => {}
+            (Type::TYPE_FLOAT, RuntimeType::F32) => {}
+            (Type::TYPE_DOUBLE, RuntimeType::F64) => {}
+            (Type::TYPE_BOOL, RuntimeType::Bool) => {}
+            (Type::TYPE_STRING, RuntimeType::String) => {}
+            (Type::TYPE_BYTES, RuntimeType::VecU8) => {}
+            (Type::TYPE_MESSAGE, RuntimeType::Message(..)) => {}
+            (Type::TYPE_ENUM, RuntimeType::Enum(..)) => {}
+            (Type::TYPE_GROUP, ..) => return Err(ProtobufError::GroupIsNotImplemented.into()),
+            _ => return Err(ProtobufError::IncompatibleProtobufTypeAndRuntimeType.into()),
+        }
+        Ok(ProtobufType { runtime, t })
+    }
+
+    pub(crate) fn read(
+        &self,
+        is: &mut CodedInputStream,
+        wire_type: WireType,
+    ) -> crate::Result<ReflectValueBox> {
+        if wire_type != WireType::for_type(self.t) {
+            return Err(WireError::UnexpectedWireType(wire_type).into());
+        }
+        Ok(match self.t {
+            Type::TYPE_DOUBLE => ReflectValueBox::F64(is.read_double()?),
+            Type::TYPE_FLOAT => ReflectValueBox::F32(is.read_float()?),
+            Type::TYPE_INT64 => ReflectValueBox::I64(is.read_int64()?),
+            Type::TYPE_UINT64 => ReflectValueBox::U64(is.read_uint64()?),
+            Type::TYPE_INT32 => ReflectValueBox::I32(is.read_int32()?),
+            Type::TYPE_FIXED64 => ReflectValueBox::U64(is.read_fixed64()?),
+            Type::TYPE_FIXED32 => ReflectValueBox::U32(is.read_fixed32()?),
+            Type::TYPE_BOOL => ReflectValueBox::Bool(is.read_bool()?),
+            Type::TYPE_UINT32 => ReflectValueBox::U32(is.read_uint32()?),
+            Type::TYPE_SFIXED32 => ReflectValueBox::I32(is.read_sfixed32()?),
+            Type::TYPE_SFIXED64 => ReflectValueBox::I64(is.read_sfixed64()?),
+            Type::TYPE_SINT32 => ReflectValueBox::I32(is.read_sint32()?),
+            Type::TYPE_SINT64 => ReflectValueBox::I64(is.read_sint64()?),
+            Type::TYPE_STRING => ReflectValueBox::String(is.read_string()?),
+            Type::TYPE_BYTES => ReflectValueBox::Bytes(is.read_bytes()?),
+            Type::TYPE_ENUM => match &self.runtime {
+                RuntimeType::Enum(e) => {
+                    let v = is.read_enum_value()?;
+                    ReflectValueBox::Enum(e.clone(), v)
+                }
+                _ => unreachable!(),
+            },
+            Type::TYPE_GROUP => return Err(ProtobufError::GroupIsNotImplemented.into()),
+            Type::TYPE_MESSAGE => match &self.runtime {
+                RuntimeType::Message(m) => ReflectValueBox::Message(is.read_message_dyn(m)?),
+                _ => unreachable!(),
+            },
+        })
+    }
+
+    pub(crate) fn read_repeated_into(
+        &self,
+        is: &mut CodedInputStream,
+        wire_type: WireType,
+        repeated: &mut ReflectRepeatedMut,
+    ) -> crate::Result<()> {
+        if wire_type == WireType::for_type(self.t) {
+            let value = self.read(is, wire_type)?;
+            repeated.push(value);
+            Ok(())
+        } else if wire_type == WireType::LengthDelimited {
+            fn extend<V: ProtobufValue>(repeated: &mut ReflectRepeatedMut, mut v: Vec<V>) {
+                repeated.extend(ReflectRepeatedMut::new(&mut v));
+            }
+
+            match self.t {
+                Type::TYPE_INT32 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_int32_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_INT64 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_int64_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_UINT32 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_uint32_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_UINT64 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_uint64_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_SINT32 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_sint32_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_SINT64 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_sint64_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_FIXED32 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_fixed32_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_FIXED64 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_fixed64_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_SFIXED32 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_sfixed32_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_SFIXED64 => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_sfixed64_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_FLOAT => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_float_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_DOUBLE => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_double_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_BOOL => {
+                    let mut v = Vec::new();
+                    is.read_repeated_packed_bool_into(&mut v)?;
+                    extend(repeated, v);
+                    Ok(())
+                }
+                Type::TYPE_ENUM => match &self.runtime {
+                    RuntimeType::Enum(e) => {
+                        let mut v = Vec::new();
+                        is.read_repeated_packed_enum_values_into(&mut v)?;
+                        for e_v in v {
+                            repeated.push(ReflectValueBox::Enum(e.clone(), e_v));
+                        }
+                        Ok(())
+                    }
+                    _ => unreachable!(),
+                },
+                Type::TYPE_GROUP => Err(ProtobufError::GroupIsNotImplemented.into()),
+                Type::TYPE_MESSAGE | Type::TYPE_STRING | Type::TYPE_BYTES => {
+                    Err(WireError::UnexpectedWireType(wire_type).into())
+                }
+            }
+        } else {
+            Err(WireError::UnexpectedWireType(wire_type).into())
+        }
+    }
+}
diff --git a/src/reflect/reflect_eq.rs b/src/reflect/reflect_eq.rs
new file mode 100644
index 0000000..cfa23ed
--- /dev/null
+++ b/src/reflect/reflect_eq.rs
@@ -0,0 +1,33 @@
+/// Parameter for [`ReflectEq`].
+#[derive(Debug, Default)]
+pub struct ReflectEqMode {
+    /// When `true`, `NaN` values are considered equal to each other.
+    pub nan_equal: bool,
+    _non_exhausitve: (),
+}
+
+impl ReflectEqMode {
+    /// Default equality, similar to `#[derive(PartialEq)]`.
+    pub fn default() -> ReflectEqMode {
+        Default::default()
+    }
+
+    /// Equality where float `NaN` values are considered equal to each other.
+    ///
+    /// Useful in tests.
+    pub fn nan_equal() -> ReflectEqMode {
+        ReflectEqMode {
+            nan_equal: true,
+            ..Default::default()
+        }
+    }
+}
+
+/// Special version of eq.
+///
+/// With `mode` [`ReflectEqMode::default()`], should be equivalent
+/// to `#[derive(PartialEq)]`.
+pub trait ReflectEq {
+    /// Perform the equality comparison.
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool;
+}
diff --git a/src/reflect/repeated.rs b/src/reflect/repeated.rs
deleted file mode 100644
index 710de3e..0000000
--- a/src/reflect/repeated.rs
+++ /dev/null
@@ -1,191 +0,0 @@
-use std::slice;
-
-use super::value::ProtobufValue;
-use super::value::ReflectValueRef;
-use crate::repeated::RepeatedField;
-
-pub trait ReflectRepeated: 'static {
-    fn reflect_iter(&self) -> ReflectRepeatedIter;
-    fn len(&self) -> usize;
-    fn get(&self, index: usize) -> &dyn ProtobufValue;
-}
-
-impl<V: ProtobufValue + 'static> ReflectRepeated for Vec<V> {
-    fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
-        ReflectRepeatedIter {
-            imp: Box::new(ReflectRepeatedIterImplSlice::<'a, V> { iter: self.iter() }),
-        }
-    }
-
-    fn len(&self) -> usize {
-        Vec::len(self)
-    }
-
-    fn get(&self, index: usize) -> &dyn ProtobufValue {
-        &self[index]
-    }
-}
-
-// useless
-impl<V: ProtobufValue + 'static> ReflectRepeated for [V] {
-    fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
-        ReflectRepeatedIter {
-            imp: Box::new(ReflectRepeatedIterImplSlice::<'a, V> { iter: self.iter() }),
-        }
-    }
-
-    fn len(&self) -> usize {
-        <[_]>::len(self)
-    }
-
-    fn get(&self, index: usize) -> &dyn ProtobufValue {
-        &self[index]
-    }
-}
-
-impl<V: ProtobufValue + 'static> ReflectRepeated for RepeatedField<V> {
-    fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
-        ReflectRepeatedIter {
-            imp: Box::new(ReflectRepeatedIterImplSlice::<'a, V> { iter: self.iter() }),
-        }
-    }
-
-    fn len(&self) -> usize {
-        RepeatedField::len(self)
-    }
-
-    fn get(&self, index: usize) -> &dyn ProtobufValue {
-        &self[index]
-    }
-}
-
-trait ReflectRepeatedIterTrait<'a> {
-    fn next(&mut self) -> Option<&'a dyn ProtobufValue>;
-}
-
-struct ReflectRepeatedIterImplSlice<'a, V: ProtobufValue + 'static> {
-    iter: slice::Iter<'a, V>,
-}
-
-impl<'a, V: ProtobufValue + 'static> ReflectRepeatedIterTrait<'a>
-    for ReflectRepeatedIterImplSlice<'a, V>
-{
-    fn next(&mut self) -> Option<&'a dyn ProtobufValue> {
-        self.iter.next().map(|v| v as &dyn ProtobufValue)
-    }
-}
-
-pub struct ReflectRepeatedIter<'a> {
-    imp: Box<dyn ReflectRepeatedIterTrait<'a> + 'a>,
-}
-
-impl<'a> Iterator for ReflectRepeatedIter<'a> {
-    type Item = &'a dyn ProtobufValue;
-
-    fn next(&mut self) -> Option<Self::Item> {
-        self.imp.next()
-    }
-}
-
-impl<'a> IntoIterator for &'a dyn ReflectRepeated {
-    type IntoIter = ReflectRepeatedIter<'a>;
-    type Item = &'a dyn ProtobufValue;
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.reflect_iter()
-    }
-}
-
-pub trait ReflectRepeatedEnum<'a> {
-    fn len(&self) -> usize;
-
-    fn get(&self, index: usize) -> ReflectValueRef<'a>;
-}
-
-pub trait ReflectRepeatedMessage<'a> {
-    fn len(&self) -> usize;
-
-    fn get(&self, index: usize) -> ReflectValueRef<'a>;
-}
-
-pub enum ReflectRepeatedRef<'a> {
-    Generic(&'a dyn ReflectRepeated),
-    U32(&'a [u32]),
-    U64(&'a [u64]),
-    I32(&'a [i32]),
-    I64(&'a [i64]),
-    F32(&'a [f32]),
-    F64(&'a [f64]),
-    Bool(&'a [bool]),
-    String(&'a [String]),
-    Bytes(&'a [Vec<u8>]),
-    Enum(Box<dyn ReflectRepeatedEnum<'a> + 'a>),
-    Message(Box<dyn ReflectRepeatedMessage<'a> + 'a>),
-}
-
-impl<'a> ReflectRepeatedRef<'a> {
-    fn len(&self) -> usize {
-        match *self {
-            ReflectRepeatedRef::Generic(ref r) => r.len(),
-            ReflectRepeatedRef::U32(ref r) => r.len(),
-            ReflectRepeatedRef::U64(ref r) => r.len(),
-            ReflectRepeatedRef::I32(ref r) => r.len(),
-            ReflectRepeatedRef::I64(ref r) => r.len(),
-            ReflectRepeatedRef::F32(ref r) => r.len(),
-            ReflectRepeatedRef::F64(ref r) => r.len(),
-            ReflectRepeatedRef::Bool(ref r) => r.len(),
-            ReflectRepeatedRef::String(ref r) => r.len(),
-            ReflectRepeatedRef::Bytes(ref r) => r.len(),
-            ReflectRepeatedRef::Enum(ref r) => r.len(),
-            ReflectRepeatedRef::Message(ref r) => r.len(),
-        }
-    }
-
-    fn get(&self, index: usize) -> ReflectValueRef<'a> {
-        match *self {
-            ReflectRepeatedRef::Generic(ref r) => r.get(index).as_ref(),
-            ReflectRepeatedRef::U32(ref r) => ReflectValueRef::U32(r[index]),
-            ReflectRepeatedRef::U64(ref r) => ReflectValueRef::U64(r[index]),
-            ReflectRepeatedRef::I32(ref r) => ReflectValueRef::I32(r[index]),
-            ReflectRepeatedRef::I64(ref r) => ReflectValueRef::I64(r[index]),
-            ReflectRepeatedRef::F32(ref r) => ReflectValueRef::F32(r[index]),
-            ReflectRepeatedRef::F64(ref r) => ReflectValueRef::F64(r[index]),
-            ReflectRepeatedRef::Bool(ref r) => ReflectValueRef::Bool(r[index]),
-            ReflectRepeatedRef::String(ref r) => ReflectValueRef::String(&r[index]),
-            ReflectRepeatedRef::Bytes(ref r) => ReflectValueRef::Bytes(&r[index]),
-            ReflectRepeatedRef::Enum(ref r) => r.get(index),
-            ReflectRepeatedRef::Message(ref r) => r.get(index),
-        }
-    }
-}
-
-pub struct ReflectRepeatedRefIter<'a> {
-    repeated: &'a ReflectRepeatedRef<'a>,
-    pos: usize,
-}
-
-impl<'a> Iterator for ReflectRepeatedRefIter<'a> {
-    type Item = ReflectValueRef<'a>;
-
-    fn next(&mut self) -> Option<Self::Item> {
-        if self.pos < self.repeated.len() {
-            let pos = self.pos;
-            self.pos += 1;
-            Some(self.repeated.get(pos))
-        } else {
-            None
-        }
-    }
-}
-
-impl<'a> IntoIterator for &'a ReflectRepeatedRef<'a> {
-    type IntoIter = ReflectRepeatedRefIter<'a>;
-    type Item = ReflectValueRef<'a>;
-
-    fn into_iter(self) -> Self::IntoIter {
-        ReflectRepeatedRefIter {
-            repeated: self,
-            pos: 0,
-        }
-    }
-}
diff --git a/src/reflect/repeated/drain_iter.rs b/src/reflect/repeated/drain_iter.rs
new file mode 100644
index 0000000..67d41fd
--- /dev/null
+++ b/src/reflect/repeated/drain_iter.rs
@@ -0,0 +1,27 @@
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectValueBox;
+
+pub(crate) struct ReflectRepeatedDrainIter<'a> {
+    imp: Box<dyn Iterator<Item = ReflectValueBox> + 'a>,
+}
+
+impl<'a> ReflectRepeatedDrainIter<'a> {
+    pub(crate) fn new(
+        imp: impl Iterator<Item = ReflectValueBox> + 'a,
+    ) -> ReflectRepeatedDrainIter<'a> {
+        ReflectRepeatedDrainIter { imp: Box::new(imp) }
+    }
+
+    pub(crate) fn new_vec<V: ProtobufValue>(v: &'a mut Vec<V>) -> ReflectRepeatedDrainIter<'a> {
+        ReflectRepeatedDrainIter::new(v.drain(..).map(V::RuntimeType::into_value_box))
+    }
+}
+
+impl<'a> Iterator for ReflectRepeatedDrainIter<'a> {
+    type Item = ReflectValueBox;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.imp.next()
+    }
+}
diff --git a/src/reflect/repeated/iter.rs b/src/reflect/repeated/iter.rs
new file mode 100644
index 0000000..68c072e
--- /dev/null
+++ b/src/reflect/repeated/iter.rs
@@ -0,0 +1,29 @@
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectValueRef;
+
+pub(crate) struct ReflectRepeatedIter<'a> {
+    imp: Box<dyn Iterator<Item = ReflectValueRef<'a>> + 'a>,
+}
+
+impl<'a> ReflectRepeatedIter<'a> {
+    pub(crate) fn new(
+        iter: impl Iterator<Item = ReflectValueRef<'a>> + 'a,
+    ) -> ReflectRepeatedIter<'a> {
+        ReflectRepeatedIter {
+            imp: Box::new(iter),
+        }
+    }
+
+    pub(crate) fn new_slice<V: ProtobufValue>(slice: &'a [V]) -> ReflectRepeatedIter<'a> {
+        ReflectRepeatedIter::new(slice.into_iter().map(V::RuntimeType::as_ref))
+    }
+}
+
+impl<'a> Iterator for ReflectRepeatedIter<'a> {
+    type Item = ReflectValueRef<'a>;
+
+    fn next(&mut self) -> Option<ReflectValueRef<'a>> {
+        self.imp.next()
+    }
+}
diff --git a/src/reflect/repeated/mod.rs b/src/reflect/repeated/mod.rs
new file mode 100644
index 0000000..f8af5e4
--- /dev/null
+++ b/src/reflect/repeated/mod.rs
@@ -0,0 +1,521 @@
+pub(crate) mod drain_iter;
+pub(crate) mod iter;
+mod transmute;
+mod vec_downcast;
+
+use std::any::type_name;
+use std::fmt;
+
+use crate::reflect::dynamic::repeated::DynamicRepeated;
+use crate::reflect::reflect_eq::ReflectEq;
+use crate::reflect::reflect_eq::ReflectEqMode;
+use crate::reflect::repeated::drain_iter::ReflectRepeatedDrainIter;
+use crate::reflect::repeated::iter::ReflectRepeatedIter;
+use crate::reflect::repeated::transmute::transmute_ref_if_eq;
+use crate::reflect::repeated::vec_downcast::VecMutVariant;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::value::value_ref::ReflectValueRef;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::RuntimeType;
+
+pub(crate) trait ReflectRepeated: Sync + 'static + fmt::Debug {
+    fn reflect_iter(&self) -> ReflectRepeatedIter;
+    fn reflect_drain_iter(&mut self) -> ReflectRepeatedDrainIter;
+    fn len(&self) -> usize;
+    fn get(&self, index: usize) -> ReflectValueRef;
+    /// Set element at index.
+    ///
+    /// # Panics
+    ///
+    /// * if index is out of bounds
+    /// * if the element type does not match the collection element type
+    fn set(&mut self, index: usize, value: ReflectValueBox);
+    /// Append element.
+    ///
+    /// # Panics
+    ///
+    /// * if the element type does not match the collection element type
+    fn push(&mut self, value: ReflectValueBox);
+
+    fn reflect_extend(&mut self, values: ReflectRepeatedMut);
+
+    fn clear(&mut self);
+    /// Get the collection element type.
+    fn element_type(&self) -> RuntimeType;
+
+    /// Get array data for enum elements.
+    ///
+    /// # Panics
+    ///
+    /// * if the element type is not an enum
+    fn data_enum_values(&self) -> &[i32];
+
+    /// Get array data if the element type is bool.
+    fn data_bool(&self) -> &[bool];
+    /// Get array data if the element type is i32.
+    fn data_i32(&self) -> &[i32];
+    /// Get array data if the element type is u32.
+    fn data_u32(&self) -> &[u32];
+    /// Get array data if the element type is i64.
+    fn data_i64(&self) -> &[i64];
+    /// Get array data if the element type is u64.
+    fn data_u64(&self) -> &[u64];
+    /// Get array data if the element type is f32.
+    fn data_f32(&self) -> &[f32];
+    /// Get array data if the element type is f64.
+    fn data_f64(&self) -> &[f64];
+}
+
+fn data_impl<V: ProtobufValue, X: ProtobufValue>(v: &Vec<V>) -> &[X] {
+    match transmute_ref_if_eq::<_, Vec<X>>(v) {
+        Ok(v) => v.as_slice(),
+        Err(_) => panic!("not {}", type_name::<X>()),
+    }
+}
+
+impl<V: ProtobufValue> ReflectRepeated for Vec<V> {
+    fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
+        ReflectRepeatedIter::new_slice(self.as_slice())
+    }
+
+    fn reflect_drain_iter<'a>(&'a mut self) -> ReflectRepeatedDrainIter<'a> {
+        ReflectRepeatedDrainIter::new_vec(self)
+    }
+
+    fn len(&self) -> usize {
+        Vec::len(self)
+    }
+
+    fn get(&self, index: usize) -> ReflectValueRef {
+        V::RuntimeType::as_ref(&self[index])
+    }
+
+    fn set(&mut self, index: usize, value: ReflectValueBox) {
+        let value = value.downcast().expect("wrong type");
+        self[index] = value;
+    }
+
+    fn push(&mut self, value: ReflectValueBox) {
+        let value = value.downcast().expect("wrong type");
+        self.push(value)
+    }
+
+    fn reflect_extend(&mut self, values: ReflectRepeatedMut) {
+        match VecMutVariant::downcast(self) {
+            Some(VecMutVariant::U32(v)) => v.extend(values.repeated.data_u32()),
+            Some(VecMutVariant::U64(v)) => v.extend(values.repeated.data_u64()),
+            Some(VecMutVariant::I32(v)) => v.extend(values.repeated.data_i32()),
+            Some(VecMutVariant::I64(v)) => v.extend(values.repeated.data_i64()),
+            Some(VecMutVariant::F32(v)) => v.extend(values.repeated.data_f32()),
+            Some(VecMutVariant::F64(v)) => v.extend(values.repeated.data_f64()),
+            Some(VecMutVariant::Bool(v)) => v.extend(values.repeated.data_bool()),
+            None => {
+                for value in values.repeated.reflect_drain_iter() {
+                    // Less efficient.
+                    ReflectRepeated::push(self, value);
+                }
+            }
+        }
+    }
+
+    fn clear(&mut self) {
+        self.clear()
+    }
+
+    fn element_type(&self) -> RuntimeType {
+        V::RuntimeType::runtime_type_box()
+    }
+
+    fn data_enum_values(&self) -> &[i32] {
+        V::RuntimeType::cast_to_enum_values(&self)
+    }
+
+    fn data_bool(&self) -> &[bool] {
+        data_impl(self)
+    }
+
+    fn data_i32(&self) -> &[i32] {
+        data_impl(self)
+    }
+
+    fn data_u32(&self) -> &[u32] {
+        data_impl(self)
+    }
+
+    fn data_i64(&self) -> &[i64] {
+        data_impl(self)
+    }
+
+    fn data_u64(&self) -> &[u64] {
+        data_impl(self)
+    }
+
+    fn data_f32(&self) -> &[f32] {
+        data_impl(self)
+    }
+
+    fn data_f64(&self) -> &[f64] {
+        data_impl(self)
+    }
+}
+
+impl<'a> IntoIterator for &'a dyn ReflectRepeated {
+    type Item = ReflectValueRef<'a>;
+    type IntoIter = ReflectRepeatedIter<'a>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.reflect_iter()
+    }
+}
+
+#[derive(Clone)]
+enum ReflectRepeatedRefImpl<'a> {
+    Generated(&'a dyn ReflectRepeated),
+    DynamicEmpty(DynamicRepeated),
+}
+
+impl<'a> fmt::Debug for ReflectRepeatedRefImpl<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            ReflectRepeatedRefImpl::Generated(r) => fmt::Debug::fmt(r, f),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => fmt::Debug::fmt(r, f),
+        }
+    }
+}
+
+/// Dynamic reference to repeated field
+#[derive(Clone)]
+pub struct ReflectRepeatedRef<'a> {
+    imp: ReflectRepeatedRefImpl<'a>,
+}
+
+/// Dynamic mutable reference to repeated field
+pub struct ReflectRepeatedMut<'a> {
+    pub(crate) repeated: &'a mut dyn ReflectRepeated,
+}
+
+impl<'a> ReflectRepeatedRef<'a> {
+    pub(crate) fn new(repeated: &'a dyn ReflectRepeated) -> ReflectRepeatedRef<'a> {
+        ReflectRepeatedRef {
+            imp: ReflectRepeatedRefImpl::Generated(repeated),
+        }
+    }
+
+    pub(crate) fn new_empty(elem: RuntimeType) -> ReflectRepeatedRef<'static> {
+        ReflectRepeatedRef {
+            imp: ReflectRepeatedRefImpl::DynamicEmpty(DynamicRepeated::new(elem)),
+        }
+    }
+
+    /// Number of elements in repeated field
+    pub fn len(&self) -> usize {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(g) => g.len(),
+            ReflectRepeatedRefImpl::DynamicEmpty(d) => d.len(),
+        }
+    }
+
+    /// Repeated field is empty
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    /// Get item by index
+    // TODO: replace with index
+    pub fn get(&self, index: usize) -> ReflectValueRef<'a> {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.get(index),
+            ReflectRepeatedRefImpl::DynamicEmpty(..) => panic!("empty"),
+        }
+    }
+
+    /// Runtime type of element
+    pub fn element_type(&self) -> RuntimeType {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.element_type(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.element_type(),
+        }
+    }
+
+    pub(crate) fn data_enum_values(&self) -> &[i32] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_enum_values(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_enum_values(),
+        }
+    }
+
+    pub(crate) fn data_bool(&self) -> &[bool] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_bool(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_bool(),
+        }
+    }
+
+    pub(crate) fn data_u32(&self) -> &[u32] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_u32(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_u32(),
+        }
+    }
+
+    pub(crate) fn data_i32(&self) -> &[i32] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_i32(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_i32(),
+        }
+    }
+
+    pub(crate) fn data_u64(&self) -> &[u64] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_u64(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_u64(),
+        }
+    }
+
+    pub(crate) fn data_i64(&self) -> &[i64] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_i64(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_i64(),
+        }
+    }
+
+    pub(crate) fn data_f32(&self) -> &[f32] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_f32(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_f32(),
+        }
+    }
+
+    pub(crate) fn data_f64(&self) -> &[f64] {
+        match &self.imp {
+            ReflectRepeatedRefImpl::Generated(r) => r.data_f64(),
+            ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_f64(),
+        }
+    }
+}
+
+impl<'a> ReflectEq for ReflectRepeatedRef<'a> {
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
+        let len = self.len();
+
+        if len != that.len() {
+            return false;
+        }
+
+        if self.element_type() != that.element_type() {
+            return false;
+        }
+
+        for i in 0..len {
+            let a = self.get(i);
+            let b = that.get(i);
+            if !a.reflect_eq(&b, mode) {
+                return false;
+            }
+        }
+
+        true
+    }
+}
+
+impl<'a> PartialEq for ReflectRepeatedRef<'a> {
+    fn eq(&self, other: &Self) -> bool {
+        self.reflect_eq(other, &ReflectEqMode::default())
+    }
+}
+
+impl<'a> PartialEq<[ReflectValueBox]> for ReflectRepeatedRef<'a> {
+    fn eq(&self, other: &[ReflectValueBox]) -> bool {
+        if self.len() != other.len() {
+            return false;
+        }
+
+        for i in 0..self.len() {
+            if self.get(i) != other[i] {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
+
+impl<'a> PartialEq<ReflectRepeatedRef<'a>> for [ReflectValueBox] {
+    fn eq(&self, other: &ReflectRepeatedRef) -> bool {
+        other == self
+    }
+}
+
+impl<'a> PartialEq<Vec<ReflectValueBox>> for ReflectRepeatedRef<'a> {
+    fn eq(&self, other: &Vec<ReflectValueBox>) -> bool {
+        self == other.as_slice()
+    }
+}
+
+impl<'a> PartialEq<ReflectRepeatedRef<'a>> for Vec<ReflectValueBox> {
+    fn eq(&self, other: &ReflectRepeatedRef) -> bool {
+        self.as_slice() == other
+    }
+}
+
+impl<'a> ReflectRepeatedMut<'a> {
+    pub(crate) fn new(repeated: &'a mut dyn ReflectRepeated) -> ReflectRepeatedMut<'a> {
+        ReflectRepeatedMut { repeated }
+    }
+
+    fn as_ref(&'a self) -> ReflectRepeatedRef<'a> {
+        ReflectRepeatedRef::new(self.repeated)
+    }
+
+    /// Number of elements in repeated field
+    pub fn len(&self) -> usize {
+        self.repeated.len()
+    }
+
+    /// Self-explanatory
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    /// Get an item by index
+    ///
+    /// Note: return immutable reference.
+    pub fn get(&'a self, index: usize) -> ReflectValueRef<'a> {
+        self.repeated.get(index)
+    }
+
+    /// Runtime type of element
+    pub fn element_type(&self) -> RuntimeType {
+        self.repeated.element_type()
+    }
+
+    /// Set a value at given index.
+    ///
+    /// # Panics
+    ///
+    /// If index if out of range or value type does not match container element type
+    pub fn set(&mut self, index: usize, value: ReflectValueBox) {
+        self.repeated.set(index, value);
+    }
+
+    /// Push an item to repeated field.
+    ///
+    /// # Panics
+    ///
+    /// If index if out of range or value type does not match container element type
+    pub fn push(&mut self, value: ReflectValueBox) {
+        self.repeated.push(value);
+    }
+
+    pub(crate) fn extend(&mut self, values: ReflectRepeatedMut) {
+        self.repeated.reflect_extend(values);
+    }
+
+    /// Self-explanatory
+    pub fn clear(&mut self) {
+        self.repeated.clear();
+    }
+}
+
+/// Iterator over repeated field.
+pub struct ReflectRepeatedRefIter<'a> {
+    repeated: ReflectRepeatedRef<'a>,
+    index: usize,
+}
+
+impl<'a> Iterator for ReflectRepeatedRefIter<'a> {
+    type Item = ReflectValueRef<'a>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        let index = self.index;
+        if index != self.repeated.len() {
+            let r = self.repeated.get(index);
+            self.index += 1;
+            Some(r)
+        } else {
+            None
+        }
+    }
+}
+
+impl<'a> IntoIterator for &'a ReflectRepeatedRef<'a> {
+    type Item = ReflectValueRef<'a>;
+    type IntoIter = ReflectRepeatedRefIter<'a>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        ReflectRepeatedRefIter {
+            repeated: self.clone(),
+            index: 0,
+        }
+    }
+}
+
+impl<'a> IntoIterator for ReflectRepeatedRef<'a> {
+    type Item = ReflectValueRef<'a>;
+    type IntoIter = ReflectRepeatedRefIter<'a>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        ReflectRepeatedRefIter {
+            repeated: self,
+            index: 0,
+        }
+    }
+}
+
+impl<'a> IntoIterator for &'a ReflectRepeatedMut<'a> {
+    type Item = ReflectValueRef<'a>;
+    type IntoIter = ReflectRepeatedRefIter<'a>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.as_ref().into_iter()
+    }
+}
+
+impl<'a> fmt::Debug for ReflectRepeatedRef<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Debug::fmt(&self.imp, f)
+    }
+}
+
+impl<'a> fmt::Debug for ReflectRepeatedMut<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Debug::fmt(self.repeated, f)
+    }
+}
+
+impl<'a> PartialEq for ReflectRepeatedMut<'a> {
+    fn eq(&self, other: &Self) -> bool {
+        self.as_ref() == other.as_ref()
+    }
+}
+
+impl<'a> PartialEq<ReflectRepeatedRef<'a>> for ReflectRepeatedMut<'a> {
+    fn eq(&self, other: &ReflectRepeatedRef) -> bool {
+        PartialEq::eq(&self.as_ref(), other)
+    }
+}
+
+impl<'a> PartialEq<[ReflectValueBox]> for ReflectRepeatedMut<'a> {
+    fn eq(&self, other: &[ReflectValueBox]) -> bool {
+        PartialEq::eq(&self.as_ref(), other)
+    }
+}
+
+impl<'a> PartialEq<ReflectRepeatedMut<'a>> for [ReflectValueBox] {
+    fn eq(&self, other: &ReflectRepeatedMut) -> bool {
+        PartialEq::eq(self, &other.as_ref())
+    }
+}
+
+impl<'a> PartialEq<Vec<ReflectValueBox>> for ReflectRepeatedMut<'a> {
+    fn eq(&self, other: &Vec<ReflectValueBox>) -> bool {
+        self == other.as_slice()
+    }
+}
+
+impl<'a> PartialEq<ReflectRepeatedMut<'a>> for Vec<ReflectValueBox> {
+    fn eq(&self, other: &ReflectRepeatedMut) -> bool {
+        self.as_slice() == other
+    }
+}
diff --git a/src/reflect/repeated/transmute.rs b/src/reflect/repeated/transmute.rs
new file mode 100644
index 0000000..36d9e0c
--- /dev/null
+++ b/src/reflect/repeated/transmute.rs
@@ -0,0 +1,19 @@
+use std::any::TypeId;
+
+pub(crate) fn transmute_mut_if_eq<A: 'static, B: 'static>(a: &mut A) -> Result<&mut B, &mut A> {
+    if TypeId::of::<A>() == TypeId::of::<B>() {
+        // SAFETY: we check type before transmuting.
+        Ok(unsafe { &mut *(a as *mut A as *mut B) })
+    } else {
+        Err(a)
+    }
+}
+
+pub(crate) fn transmute_ref_if_eq<A: 'static, B: 'static>(a: &A) -> Result<&B, &A> {
+    if TypeId::of::<A>() == TypeId::of::<B>() {
+        // SAFETY: we check type before transmuting.
+        Ok(unsafe { &*(a as *const A as *const B) })
+    } else {
+        Err(a)
+    }
+}
diff --git a/src/reflect/repeated/vec_downcast.rs b/src/reflect/repeated/vec_downcast.rs
new file mode 100644
index 0000000..4bf44ae
--- /dev/null
+++ b/src/reflect/repeated/vec_downcast.rs
@@ -0,0 +1,47 @@
+use crate::reflect::repeated::transmute::transmute_mut_if_eq;
+use crate::reflect::ProtobufValue;
+
+pub(crate) enum VecMutVariant<'a> {
+    U32(&'a mut Vec<u32>),
+    U64(&'a mut Vec<u64>),
+    I32(&'a mut Vec<i32>),
+    I64(&'a mut Vec<i64>),
+    F32(&'a mut Vec<f32>),
+    F64(&'a mut Vec<f64>),
+    Bool(&'a mut Vec<bool>),
+}
+
+impl<'a> VecMutVariant<'a> {
+    pub(crate) fn downcast<V: ProtobufValue>(vec: &'a mut Vec<V>) -> Option<VecMutVariant<'a>> {
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::U32(vec)),
+            Err(vec) => vec,
+        };
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::U64(vec)),
+            Err(vec) => vec,
+        };
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::I32(vec)),
+            Err(vec) => vec,
+        };
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::I64(vec)),
+            Err(vec) => vec,
+        };
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::F32(vec)),
+            Err(vec) => vec,
+        };
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::F64(vec)),
+            Err(vec) => vec,
+        };
+        let vec = match transmute_mut_if_eq(vec) {
+            Ok(vec) => return Some(VecMutVariant::Bool(vec)),
+            Err(vec) => vec,
+        };
+        let _ = vec;
+        None
+    }
+}
diff --git a/src/reflect/rt/mod.rs b/src/reflect/rt/mod.rs
index d715d92..43479ef 100644
--- a/src/reflect/rt/mod.rs
+++ b/src/reflect/rt/mod.rs
@@ -2,4 +2,7 @@
 
 #![doc(hidden)]
 
+pub mod v2;
+
 pub use crate::reflect::acc::FieldAccessor;
+pub use crate::reflect::runtime_types::RuntimeTypeMessage;
diff --git a/src/reflect/rt/v2.rs b/src/reflect/rt/v2.rs
new file mode 100644
index 0000000..ef3077b
--- /dev/null
+++ b/src/reflect/rt/v2.rs
@@ -0,0 +1,13 @@
+//! This module contains functions references for reflection in generated code.
+
+#![doc(hidden)]
+
+pub use crate::reflect::acc::v2::map::make_map_simpler_accessor;
+pub use crate::reflect::acc::v2::repeated::make_vec_simpler_accessor;
+pub use crate::reflect::acc::v2::singular::make_message_field_accessor;
+pub use crate::reflect::acc::v2::singular::make_option_accessor;
+pub use crate::reflect::acc::v2::singular::make_simpler_field_accessor;
+pub use crate::reflect::acc::v2::singular::oneof::make_oneof_copy_has_get_set_simpler_accessors;
+pub use crate::reflect::acc::v2::singular::oneof::make_oneof_deref_has_get_set_simpler_accessor;
+pub use crate::reflect::acc::v2::singular::oneof::make_oneof_enum_accessors;
+pub use crate::reflect::acc::v2::singular::oneof::make_oneof_message_has_get_mut_set_accessor;
diff --git a/src/reflect/runtime_type_box.rs b/src/reflect/runtime_type_box.rs
new file mode 100644
index 0000000..e1eec48
--- /dev/null
+++ b/src/reflect/runtime_type_box.rs
@@ -0,0 +1,151 @@
+use std::fmt;
+
+use protobuf_support::lexer::float::parse_protobuf_float;
+use protobuf_support::lexer::str_lit::StrLit;
+
+use crate::descriptor::field_descriptor_proto;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::MessageRef;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+
+/// Runtime representation of elementary protobuf type.
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum RuntimeType {
+    /// `i32`
+    I32,
+    /// `i64`
+    I64,
+    /// `u32`
+    U32,
+    /// `u64`
+    U64,
+    /// `f32`
+    F32,
+    /// `f64`
+    F64,
+    /// `bool`
+    Bool,
+    /// [`String`](std::string::String)
+    String,
+    /// [`Vec<u8>`](std::vec::Vec)
+    VecU8,
+    /// `enum`
+    Enum(EnumDescriptor),
+    /// `message`
+    Message(MessageDescriptor),
+}
+
+impl RuntimeType {
+    pub(crate) fn default_value_ref(&self) -> ReflectValueRef<'static> {
+        match self {
+            RuntimeType::I32 => ReflectValueRef::I32(0),
+            RuntimeType::I64 => ReflectValueRef::I64(0),
+            RuntimeType::U32 => ReflectValueRef::U32(0),
+            RuntimeType::U64 => ReflectValueRef::U64(0),
+            RuntimeType::F32 => ReflectValueRef::F32(0.0),
+            RuntimeType::F64 => ReflectValueRef::F64(0.0),
+            RuntimeType::Bool => ReflectValueRef::Bool(false),
+            RuntimeType::String => ReflectValueRef::String(""),
+            RuntimeType::VecU8 => ReflectValueRef::Bytes(b""),
+            RuntimeType::Enum(e) => ReflectValueRef::Enum(e.clone(), e.default_value().value()),
+            RuntimeType::Message(m) => ReflectValueRef::Message(MessageRef::default_instance(m)),
+        }
+    }
+
+    pub(crate) fn default_value_box(&self) -> ReflectValueBox {
+        self.default_value_ref().to_box()
+    }
+
+    /// Rust type from protobuf type.
+    ///
+    /// # Panics
+    ///
+    /// Panics for message or enum types (because they can't be resolved without context).
+    pub(crate) fn from_proto_type(t: field_descriptor_proto::Type) -> RuntimeType {
+        match t {
+            field_descriptor_proto::Type::TYPE_UINT32 => RuntimeType::U32,
+            field_descriptor_proto::Type::TYPE_UINT64 => RuntimeType::U64,
+            field_descriptor_proto::Type::TYPE_INT32 => RuntimeType::I32,
+            field_descriptor_proto::Type::TYPE_INT64 => RuntimeType::I64,
+            field_descriptor_proto::Type::TYPE_SINT32 => RuntimeType::I32,
+            field_descriptor_proto::Type::TYPE_SINT64 => RuntimeType::I64,
+            field_descriptor_proto::Type::TYPE_FIXED32 => RuntimeType::U32,
+            field_descriptor_proto::Type::TYPE_FIXED64 => RuntimeType::U64,
+            field_descriptor_proto::Type::TYPE_SFIXED64 => RuntimeType::I64,
+            field_descriptor_proto::Type::TYPE_SFIXED32 => RuntimeType::I32,
+            field_descriptor_proto::Type::TYPE_BOOL => RuntimeType::Bool,
+            field_descriptor_proto::Type::TYPE_STRING => RuntimeType::String,
+            field_descriptor_proto::Type::TYPE_BYTES => RuntimeType::VecU8,
+            field_descriptor_proto::Type::TYPE_FLOAT => RuntimeType::F32,
+            field_descriptor_proto::Type::TYPE_DOUBLE => RuntimeType::F64,
+            field_descriptor_proto::Type::TYPE_ENUM
+            | field_descriptor_proto::Type::TYPE_MESSAGE
+            | field_descriptor_proto::Type::TYPE_GROUP => panic!(
+                "{:?} cannot be converted to runtime type without context",
+                t
+            ),
+        }
+    }
+
+    pub(crate) fn parse_proto_default_value(&self, value: &str) -> Result<ReflectValueBox, ()> {
+        match self {
+            // For booleans, "true" or "false"
+            RuntimeType::Bool => {
+                if value == "true" {
+                    Ok(ReflectValueBox::Bool(true))
+                } else if value == "false" {
+                    Ok(ReflectValueBox::Bool(false))
+                } else {
+                    Err(())
+                }
+            }
+            RuntimeType::I32 => value.parse().map_err(|_| ()).map(ReflectValueBox::I32),
+            RuntimeType::I64 => value.parse().map_err(|_| ()).map(ReflectValueBox::I64),
+            RuntimeType::U32 => value.parse().map_err(|_| ()).map(ReflectValueBox::U32),
+            RuntimeType::U64 => value.parse().map_err(|_| ()).map(ReflectValueBox::U64),
+            RuntimeType::F32 => parse_protobuf_float(value)
+                .map_err(|_| ())
+                .map(|v| ReflectValueBox::F32(v as f32)),
+            RuntimeType::F64 => parse_protobuf_float(value)
+                .map_err(|_| ())
+                .map(ReflectValueBox::F64),
+            // For strings, contains the default text contents (not escaped in any way)
+            RuntimeType::String => Ok(ReflectValueBox::String(value.to_owned())),
+            // For bytes, contains the C escaped value.  All bytes >= 128 are escaped
+            RuntimeType::VecU8 => StrLit {
+                escaped: value.to_owned(),
+            }
+            .decode_bytes()
+            .map_err(|_| ())
+            .map(ReflectValueBox::Bytes),
+            RuntimeType::Enum(_) => {
+                // Handled outside.
+                Err(())
+            }
+            RuntimeType::Message(_) => {
+                // Message cannot have default value.
+                Err(())
+            }
+        }
+    }
+}
+
+impl fmt::Display for RuntimeType {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            RuntimeType::I32 => write!(f, "i32"),
+            RuntimeType::I64 => write!(f, "i64"),
+            RuntimeType::U32 => write!(f, "u32"),
+            RuntimeType::U64 => write!(f, "u64"),
+            RuntimeType::F32 => write!(f, "f32"),
+            RuntimeType::F64 => write!(f, "f64"),
+            RuntimeType::Bool => write!(f, "bool"),
+            RuntimeType::String => write!(f, "String"),
+            RuntimeType::VecU8 => write!(f, "Vec<u8>"),
+            RuntimeType::Enum(e) => write!(f, "{}", e.full_name()),
+            RuntimeType::Message(m) => write!(f, "{}", m.full_name()),
+        }
+    }
+}
diff --git a/src/reflect/runtime_types.rs b/src/reflect/runtime_types.rs
new file mode 100644
index 0000000..26bfe96
--- /dev/null
+++ b/src/reflect/runtime_types.rs
@@ -0,0 +1,877 @@
+//! Implementations of `RuntimeType` for all types.
+
+use std::collections::HashMap;
+use std::fmt;
+use std::marker;
+
+#[cfg(feature = "bytes")]
+use bytes::Bytes;
+
+#[cfg(feature = "bytes")]
+use crate::chars::Chars;
+use crate::descriptor::field_descriptor_proto::Type;
+use crate::enum_or_unknown::EnumOrUnknown;
+use crate::message_full::MessageFull;
+use crate::reflect::runtime_type_box::RuntimeType;
+use crate::reflect::types::ProtobufTypeBool;
+use crate::reflect::types::ProtobufTypeBytes;
+use crate::reflect::types::ProtobufTypeDouble;
+use crate::reflect::types::ProtobufTypeEnumOrUnknown;
+use crate::reflect::types::ProtobufTypeFixed32;
+use crate::reflect::types::ProtobufTypeFixed64;
+use crate::reflect::types::ProtobufTypeFloat;
+use crate::reflect::types::ProtobufTypeInt32;
+use crate::reflect::types::ProtobufTypeInt64;
+use crate::reflect::types::ProtobufTypeMessage;
+use crate::reflect::types::ProtobufTypeSfixed32;
+use crate::reflect::types::ProtobufTypeSfixed64;
+use crate::reflect::types::ProtobufTypeSint32;
+use crate::reflect::types::ProtobufTypeSint64;
+use crate::reflect::types::ProtobufTypeString;
+#[cfg(feature = "bytes")]
+use crate::reflect::types::ProtobufTypeTokioBytes;
+#[cfg(feature = "bytes")]
+use crate::reflect::types::ProtobufTypeTokioChars;
+use crate::reflect::types::ProtobufTypeTrait;
+use crate::reflect::types::ProtobufTypeUint32;
+use crate::reflect::types::ProtobufTypeUint64;
+use crate::reflect::value::value_ref::ReflectValueMut;
+use crate::reflect::MessageRef;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::ReflectValueRef;
+use crate::EnumFull;
+use crate::UnknownValueRef;
+
+/// `RuntimeType` is not implemented by all protobuf types directly
+/// because it's not possible to implement `RuntimeType` for all `Message`
+/// implementations at once: each `Message` implementation has to reimplement
+/// all the methods again. With current strategy there's only implementation
+/// for all messages, which is `RuntimeTypeMessage`.
+///
+/// The downside is that we have to explicitly specify type parameters
+/// in a lot of places.
+pub trait RuntimeTypeTrait: fmt::Debug + Send + Sync + Sized + 'static {
+    /// Actual value for this type.
+    type Value: ProtobufValue + Clone + Sized + fmt::Debug + Default;
+
+    /// "Box" version of type type.
+    fn runtime_type_box() -> RuntimeType;
+
+    /// Default value for this type.
+    fn default_value_ref() -> ReflectValueRef<'static>;
+
+    /// Construct a value from given reflective value.
+    ///
+    /// # Panics
+    ///
+    /// If reflective value is of incompatible type.
+    fn from_value_box(value_box: ReflectValueBox) -> Result<Self::Value, ReflectValueBox>;
+
+    /// Convert a value into a refletive box value.
+    fn into_value_box(value: Self::Value) -> ReflectValueBox;
+
+    /// Convert a value into a ref value if possible.
+    ///
+    /// # Panics
+    ///
+    /// For message and enum.
+    // TODO: move the operation into a separate trait
+    fn into_static_value_ref(value: Self::Value) -> ReflectValueRef<'static> {
+        panic!("value {:?} cannot be converted to static ref", value)
+    }
+
+    /// Pointer to a dynamic reference.
+    fn as_ref(value: &Self::Value) -> ReflectValueRef;
+    /// Mutable pointer to a dynamic mutable reference.
+    fn as_mut(value: &mut Self::Value) -> ReflectValueMut;
+
+    /// Value is non-default?
+    fn is_non_zero(value: &Self::Value) -> bool;
+
+    /// Write the value.
+    fn set_from_value_box(target: &mut Self::Value, value_box: ReflectValueBox) {
+        *target = Self::from_value_box(value_box).expect("wrong type");
+    }
+
+    /// Cast values to enum values.
+    ///
+    /// # Panics
+    ///
+    /// If self is not an enum.
+    fn cast_to_enum_values(values: &[Self::Value]) -> &[i32] {
+        let _ = values;
+        panic!("not enum")
+    }
+
+    /// Parse the value from unknown fields.
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value>;
+}
+
+/// Runtime type which can be dereferenced.
+pub trait RuntimeTypeWithDeref: RuntimeTypeTrait {
+    /// Deref target.
+    type DerefTarget: ?Sized;
+
+    /// Deref.
+    // TODO: rename to `deref`
+    fn deref_as_ref(value: &Self::DerefTarget) -> ReflectValueRef;
+}
+
+/// Types which can be hashmap keys.
+pub trait RuntimeTypeHashable: RuntimeTypeTrait {
+    /// Query hash map with a given key.
+    fn hash_map_get<'a, V>(map: &'a HashMap<Self::Value, V>, key: ReflectValueRef)
+        -> Option<&'a V>;
+}
+
+/// Implementation for `f32`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeF32;
+/// Implementation for `f64`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeF64;
+/// Implementation for `i32`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeI32;
+/// Implementation for `f32`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeI64;
+/// Implementation for `u32`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeU32;
+/// Implementation for `u64`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeU64;
+/// Implementation for `bool`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeBool;
+/// Implementation for `String`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeString;
+/// Implementation for `Vec<u8>`
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeVecU8;
+
+/// Implementation for [`Bytes`].
+#[cfg(feature = "bytes")]
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeTokioBytes;
+/// Implementation for [`Chars`].
+#[cfg(feature = "bytes")]
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeTokioChars;
+
+/// Implementation for enum.
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeEnumOrUnknown<E: EnumFull>(marker::PhantomData<E>);
+/// Implementation for [`MessageFull`].
+#[derive(Debug, Copy, Clone)]
+pub struct RuntimeTypeMessage<M: MessageFull>(marker::PhantomData<M>);
+
+impl RuntimeTypeTrait for RuntimeTypeF32 {
+    type Value = f32;
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::F32
+    }
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::F32(0.0)
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<f32, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::F32(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+    fn into_value_box(value: f32) -> ReflectValueBox {
+        ReflectValueBox::F32(value)
+    }
+
+    fn into_static_value_ref(value: f32) -> ReflectValueRef<'static> {
+        ReflectValueRef::F32(value)
+    }
+    fn as_ref(value: &f32) -> ReflectValueRef {
+        ReflectValueRef::F32(*value)
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn is_non_zero(value: &f32) -> bool {
+        *value != 0.0
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_FLOAT);
+        ProtobufTypeFloat::get_from_unknown(unknown)
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeF64 {
+    type Value = f64;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::F64(0.0)
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::F64
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<f64, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::F64(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: f64) -> ReflectValueBox {
+        ReflectValueBox::F64(value)
+    }
+
+    fn into_static_value_ref(value: f64) -> ReflectValueRef<'static> {
+        ReflectValueRef::F64(value)
+    }
+
+    fn as_ref(value: &f64) -> ReflectValueRef {
+        ReflectValueRef::F64(*value)
+    }
+
+    fn is_non_zero(value: &f64) -> bool {
+        *value != 0.0
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_DOUBLE);
+        ProtobufTypeDouble::get_from_unknown(unknown)
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeI32 {
+    type Value = i32;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::I32(0)
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::I32
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<i32, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::I32(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: i32) -> ReflectValueBox {
+        ReflectValueBox::I32(value)
+    }
+
+    fn into_static_value_ref(value: i32) -> ReflectValueRef<'static> {
+        ReflectValueRef::I32(value)
+    }
+
+    fn as_ref(value: &i32) -> ReflectValueRef {
+        ReflectValueRef::I32(*value)
+    }
+
+    fn is_non_zero(value: &i32) -> bool {
+        *value != 0
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        match field_type {
+            Type::TYPE_INT32 => ProtobufTypeInt32::get_from_unknown(unknown),
+            Type::TYPE_SINT32 => ProtobufTypeSint32::get_from_unknown(unknown),
+            Type::TYPE_SFIXED32 => ProtobufTypeSfixed32::get_from_unknown(unknown),
+            _ => panic!("wrong type: {:?}", field_type),
+        }
+    }
+}
+impl RuntimeTypeHashable for RuntimeTypeI32 {
+    fn hash_map_get<'a, V>(map: &'a HashMap<i32, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::I32(i) => map.get(&i),
+            _ => None,
+        }
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeI64 {
+    type Value = i64;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::I64(0)
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::I64
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<i64, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::I64(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: i64) -> ReflectValueBox {
+        ReflectValueBox::I64(value)
+    }
+
+    fn into_static_value_ref(value: i64) -> ReflectValueRef<'static> {
+        ReflectValueRef::I64(value)
+    }
+
+    fn as_ref(value: &i64) -> ReflectValueRef {
+        ReflectValueRef::I64(*value)
+    }
+
+    fn is_non_zero(value: &i64) -> bool {
+        *value != 0
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        match field_type {
+            Type::TYPE_INT64 => ProtobufTypeInt64::get_from_unknown(unknown),
+            Type::TYPE_SINT64 => ProtobufTypeSint64::get_from_unknown(unknown),
+            Type::TYPE_SFIXED64 => ProtobufTypeSfixed64::get_from_unknown(unknown),
+            _ => panic!("wrong type: {:?}", field_type),
+        }
+    }
+}
+impl RuntimeTypeHashable for RuntimeTypeI64 {
+    fn hash_map_get<'a, V>(map: &'a HashMap<i64, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::I64(i) => map.get(&i),
+            _ => None,
+        }
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeU32 {
+    type Value = u32;
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::U32
+    }
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::U32(0)
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<u32, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::U32(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: u32) -> ReflectValueBox {
+        ReflectValueBox::U32(value)
+    }
+
+    fn into_static_value_ref(value: u32) -> ReflectValueRef<'static> {
+        ReflectValueRef::U32(value)
+    }
+
+    fn as_ref(value: &u32) -> ReflectValueRef {
+        ReflectValueRef::U32(*value)
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn is_non_zero(value: &u32) -> bool {
+        *value != 0
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        match field_type {
+            Type::TYPE_UINT32 => ProtobufTypeUint32::get_from_unknown(unknown),
+            Type::TYPE_FIXED32 => ProtobufTypeFixed32::get_from_unknown(unknown),
+            _ => panic!("wrong type: {:?}", field_type),
+        }
+    }
+}
+impl RuntimeTypeHashable for RuntimeTypeU32 {
+    fn hash_map_get<'a, V>(map: &'a HashMap<u32, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::U32(i) => map.get(&i),
+            _ => None,
+        }
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeU64 {
+    type Value = u64;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::U64(0)
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::U64
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<u64, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::U64(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: u64) -> ReflectValueBox {
+        ReflectValueBox::U64(value)
+    }
+
+    fn into_static_value_ref(value: u64) -> ReflectValueRef<'static> {
+        ReflectValueRef::U64(value)
+    }
+
+    fn as_ref(value: &u64) -> ReflectValueRef {
+        ReflectValueRef::U64(*value)
+    }
+
+    fn is_non_zero(value: &u64) -> bool {
+        *value != 0
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        match field_type {
+            Type::TYPE_UINT64 => ProtobufTypeUint64::get_from_unknown(unknown),
+            Type::TYPE_FIXED64 => ProtobufTypeFixed64::get_from_unknown(unknown),
+            _ => panic!("wrong type: {:?}", field_type),
+        }
+    }
+}
+impl RuntimeTypeHashable for RuntimeTypeU64 {
+    fn hash_map_get<'a, V>(map: &'a HashMap<u64, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::U64(i) => map.get(&i),
+            _ => None,
+        }
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeBool {
+    type Value = bool;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::Bool(false)
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::Bool
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<bool, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::Bool(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: bool) -> ReflectValueBox {
+        ReflectValueBox::Bool(value)
+    }
+
+    fn into_static_value_ref(value: bool) -> ReflectValueRef<'static> {
+        ReflectValueRef::Bool(value)
+    }
+
+    fn as_ref(value: &bool) -> ReflectValueRef {
+        ReflectValueRef::Bool(*value)
+    }
+
+    fn is_non_zero(value: &bool) -> bool {
+        *value
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_BOOL);
+        ProtobufTypeBool::get_from_unknown(unknown)
+    }
+}
+impl RuntimeTypeHashable for RuntimeTypeBool {
+    fn hash_map_get<'a, V>(map: &'a HashMap<bool, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::Bool(i) => map.get(&i),
+            _ => None,
+        }
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeString {
+    type Value = String;
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::String
+    }
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::String("")
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<String, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::String(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: String) -> ReflectValueBox {
+        ReflectValueBox::String(value)
+    }
+
+    fn as_ref(value: &String) -> ReflectValueRef {
+        ReflectValueRef::String(&*value)
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn is_non_zero(value: &String) -> bool {
+        !value.is_empty()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_STRING);
+        ProtobufTypeString::get_from_unknown(unknown)
+    }
+}
+impl RuntimeTypeWithDeref for RuntimeTypeString {
+    type DerefTarget = str;
+
+    fn deref_as_ref(value: &str) -> ReflectValueRef {
+        ReflectValueRef::String(value)
+    }
+}
+impl RuntimeTypeHashable for RuntimeTypeString {
+    fn hash_map_get<'a, V>(map: &'a HashMap<String, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::String(s) => map.get(*&s),
+            _ => None,
+        }
+    }
+}
+
+impl RuntimeTypeTrait for RuntimeTypeVecU8 {
+    type Value = Vec<u8>;
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::VecU8
+    }
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::Bytes(b"")
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<Vec<u8>, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::Bytes(v) => Ok(v),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: Vec<u8>) -> ReflectValueBox {
+        ReflectValueBox::Bytes(value)
+    }
+
+    fn as_ref(value: &Vec<u8>) -> ReflectValueRef {
+        ReflectValueRef::Bytes(value.as_slice())
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn is_non_zero(value: &Vec<u8>) -> bool {
+        !value.is_empty()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_BYTES);
+        ProtobufTypeBytes::get_from_unknown(unknown)
+    }
+}
+impl RuntimeTypeWithDeref for RuntimeTypeVecU8 {
+    type DerefTarget = [u8];
+
+    fn deref_as_ref(value: &[u8]) -> ReflectValueRef {
+        ReflectValueRef::Bytes(value)
+    }
+}
+
+#[cfg(feature = "bytes")]
+impl RuntimeTypeTrait for RuntimeTypeTokioBytes {
+    type Value = Bytes;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::Bytes(b"")
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::VecU8
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<Bytes, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::Bytes(v) => Ok(v.into()),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: Bytes) -> ReflectValueBox {
+        // TODO: copies here
+        ReflectValueBox::Bytes(value.as_ref().to_owned())
+    }
+
+    fn as_ref(value: &Bytes) -> ReflectValueRef {
+        ReflectValueRef::Bytes(value.as_ref())
+    }
+
+    fn is_non_zero(value: &Bytes) -> bool {
+        !value.is_empty()
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_BYTES);
+        ProtobufTypeTokioBytes::get_from_unknown(unknown)
+    }
+}
+#[cfg(feature = "bytes")]
+impl RuntimeTypeWithDeref for RuntimeTypeTokioBytes {
+    type DerefTarget = [u8];
+
+    fn deref_as_ref(value: &[u8]) -> ReflectValueRef {
+        ReflectValueRef::Bytes(value)
+    }
+}
+
+#[cfg(feature = "bytes")]
+impl RuntimeTypeTrait for RuntimeTypeTokioChars {
+    type Value = Chars;
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::String("")
+    }
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::String
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<Chars, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::String(v) => Ok(v.into()),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: Chars) -> ReflectValueBox {
+        ReflectValueBox::String(value.into())
+    }
+
+    fn as_ref(value: &Chars) -> ReflectValueRef {
+        ReflectValueRef::String(value.as_ref())
+    }
+
+    fn is_non_zero(value: &Chars) -> bool {
+        !value.is_empty()
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_STRING);
+        ProtobufTypeTokioChars::get_from_unknown(unknown)
+    }
+}
+#[cfg(feature = "bytes")]
+impl RuntimeTypeWithDeref for RuntimeTypeTokioChars {
+    type DerefTarget = str;
+
+    fn deref_as_ref(value: &str) -> ReflectValueRef {
+        ReflectValueRef::String(value)
+    }
+}
+#[cfg(feature = "bytes")]
+impl RuntimeTypeHashable for RuntimeTypeTokioChars {
+    fn hash_map_get<'a, V>(map: &'a HashMap<Chars, V>, key: ReflectValueRef) -> Option<&'a V> {
+        match key {
+            ReflectValueRef::String(s) => map.get(&*s),
+            _ => None,
+        }
+    }
+}
+
+impl<E> RuntimeTypeTrait for RuntimeTypeEnumOrUnknown<E>
+where
+    E: EnumFull + fmt::Debug,
+{
+    type Value = EnumOrUnknown<E>;
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::Enum(E::enum_descriptor())
+    }
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::from(E::enum_descriptor().default_value())
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<EnumOrUnknown<E>, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::Enum(d, v) if d == E::enum_descriptor() => {
+                Ok(EnumOrUnknown::from_i32(v))
+            }
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: EnumOrUnknown<E>) -> ReflectValueBox {
+        ReflectValueBox::Enum(E::enum_descriptor(), value.value())
+    }
+
+    fn into_static_value_ref(value: EnumOrUnknown<E>) -> ReflectValueRef<'static> {
+        ReflectValueRef::Enum(E::enum_descriptor(), value.value())
+    }
+
+    fn as_ref(value: &EnumOrUnknown<E>) -> ReflectValueRef {
+        ReflectValueRef::Enum(E::enum_descriptor(), value.value())
+    }
+
+    fn as_mut(_value: &mut Self::Value) -> ReflectValueMut {
+        unimplemented!()
+    }
+
+    fn is_non_zero(value: &EnumOrUnknown<E>) -> bool {
+        value.value() != 0
+    }
+
+    fn cast_to_enum_values(values: &[EnumOrUnknown<E>]) -> &[i32] {
+        EnumOrUnknown::cast_to_values(values)
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_ENUM);
+        ProtobufTypeEnumOrUnknown::<E>::get_from_unknown(unknown)
+    }
+}
+
+impl<M> RuntimeTypeTrait for RuntimeTypeMessage<M>
+where
+    M: MessageFull + ProtobufValue + Clone + Default,
+{
+    type Value = M;
+
+    fn runtime_type_box() -> RuntimeType
+    where
+        Self: Sized,
+    {
+        RuntimeType::Message(M::descriptor())
+    }
+
+    fn default_value_ref() -> ReflectValueRef<'static> {
+        ReflectValueRef::Message(MessageRef::new(M::default_instance()))
+    }
+
+    fn from_value_box(value_box: ReflectValueBox) -> Result<M, ReflectValueBox> {
+        match value_box {
+            ReflectValueBox::Message(v) => v
+                .downcast_box()
+                .map(|v| *v)
+                .map_err(ReflectValueBox::Message),
+            b => Err(b),
+        }
+    }
+
+    fn into_value_box(value: M) -> ReflectValueBox {
+        ReflectValueBox::Message(Box::new(value))
+    }
+    fn as_ref(value: &M) -> ReflectValueRef {
+        ReflectValueRef::Message(MessageRef::new(value))
+    }
+
+    fn as_mut(value: &mut M) -> ReflectValueMut {
+        ReflectValueMut::Message(value)
+    }
+
+    fn is_non_zero(_value: &M) -> bool {
+        true
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef, field_type: Type) -> Option<Self::Value> {
+        assert_eq!(field_type, Type::TYPE_MESSAGE);
+        ProtobufTypeMessage::<M>::get_from_unknown(unknown)
+    }
+}
diff --git a/src/reflect/service/index.rs b/src/reflect/service/index.rs
new file mode 100644
index 0000000..c002db2
--- /dev/null
+++ b/src/reflect/service/index.rs
@@ -0,0 +1,43 @@
+use crate::descriptor::MethodDescriptorProto;
+use crate::descriptor::ServiceDescriptorProto;
+use crate::reflect::field::index::ForwardProtobufTypeBox;
+use crate::reflect::file::building::FileDescriptorBuilding;
+
+#[derive(Debug)]
+pub(crate) struct ServiceIndex {
+    pub(crate) methods: Vec<MethodIndex>,
+}
+
+impl ServiceIndex {
+    pub(crate) fn index(
+        proto: &ServiceDescriptorProto,
+        building: &FileDescriptorBuilding,
+    ) -> crate::Result<ServiceIndex> {
+        let methods = proto
+            .method
+            .iter()
+            .map(|method| MethodIndex::index(method, building))
+            .collect::<crate::Result<Vec<_>>>()?;
+        Ok(ServiceIndex { methods })
+    }
+}
+
+#[derive(Debug)]
+pub(crate) struct MethodIndex {
+    pub(crate) input_type: ForwardProtobufTypeBox,
+    pub(crate) output_type: ForwardProtobufTypeBox,
+}
+
+impl MethodIndex {
+    pub(crate) fn index(
+        proto: &MethodDescriptorProto,
+        building: &FileDescriptorBuilding,
+    ) -> crate::Result<MethodIndex> {
+        let input_type = building.resolve_message(proto.input_type())?;
+        let output_type = building.resolve_message(proto.output_type())?;
+        Ok(MethodIndex {
+            input_type,
+            output_type,
+        })
+    }
+}
diff --git a/src/reflect/service/mod.rs b/src/reflect/service/mod.rs
new file mode 100644
index 0000000..9896aec
--- /dev/null
+++ b/src/reflect/service/mod.rs
@@ -0,0 +1,78 @@
+use crate::descriptor::MethodDescriptorProto;
+use crate::descriptor::ServiceDescriptorProto;
+use crate::reflect::service::index::MethodIndex;
+use crate::reflect::service::index::ServiceIndex;
+use crate::reflect::FileDescriptor;
+use crate::reflect::MessageDescriptor;
+
+pub(crate) mod index;
+
+/// Dynamic representation of service type.
+///
+/// Rust-protobuf does not support services (it is not an RPC library),
+/// but it support querying service description. Which might be useful
+/// for example to generate source files for the services.
+/// or to perform invocations dynamically.
+#[derive(Clone, Eq, PartialEq)]
+pub struct ServiceDescriptor {
+    file_descriptor: FileDescriptor,
+    index: usize,
+}
+
+impl ServiceDescriptor {
+    pub(crate) fn new(file_descriptor: FileDescriptor, index: usize) -> ServiceDescriptor {
+        ServiceDescriptor {
+            file_descriptor,
+            index,
+        }
+    }
+
+    fn index(&self) -> &ServiceIndex {
+        &self.file_descriptor.common().services[self.index]
+    }
+
+    /// Proto snippet describing this service.
+    pub fn proto(&self) -> &ServiceDescriptorProto {
+        &self.file_descriptor.proto().service[self.index]
+    }
+
+    /// Method descriptors of this service.
+    pub fn methods(&self) -> impl Iterator<Item = MethodDescriptor> + '_ {
+        let value_len = self.proto().method.len();
+        (0..value_len).map(move |index| MethodDescriptor {
+            service_descriptor: self.clone(),
+            index,
+        })
+    }
+}
+
+/// Service method descriptor.
+pub struct MethodDescriptor {
+    service_descriptor: ServiceDescriptor,
+    index: usize,
+}
+
+impl MethodDescriptor {
+    fn index(&self) -> &MethodIndex {
+        &self.service_descriptor.index().methods[self.index]
+    }
+
+    /// Proto snippet describing this method.
+    pub fn proto(&self) -> &MethodDescriptorProto {
+        &self.service_descriptor.proto().method[self.index]
+    }
+
+    /// Method input type.
+    pub fn input_type(&self) -> MessageDescriptor {
+        self.index()
+            .input_type
+            .resolve_message(&self.service_descriptor.file_descriptor)
+    }
+
+    /// Method output type.
+    pub fn output_type(&self) -> MessageDescriptor {
+        self.index()
+            .output_type
+            .resolve_message(&self.service_descriptor.file_descriptor)
+    }
+}
diff --git a/src/reflect/type_dynamic.rs b/src/reflect/type_dynamic.rs
new file mode 100644
index 0000000..1c623f2
--- /dev/null
+++ b/src/reflect/type_dynamic.rs
@@ -0,0 +1,36 @@
+//! Reflection internals.
+
+use std::marker;
+
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::types::ProtobufTypeTrait;
+use crate::reflect::ProtobufValue;
+use crate::reflect::RuntimeType;
+use crate::wire_format::WireType;
+
+/// Dynamic version of [`ProtobufType`](crate::reflect::types::ProtobufType).
+///
+/// This is used internally.
+pub trait ProtobufTypeDynamic: Send + Sync + 'static {
+    /// Wire type for this type.
+    fn wire_type(&self) -> WireType;
+
+    /// Get runtime type for this protobuf type.
+    fn runtime_type(&self) -> RuntimeType;
+}
+
+pub(crate) struct ProtobufTypeDynamicImpl<T: ProtobufTypeTrait>(pub marker::PhantomData<T>);
+
+impl<T> ProtobufTypeDynamic for ProtobufTypeDynamicImpl<T>
+where
+    T: ProtobufTypeTrait,
+    <T as ProtobufTypeTrait>::ProtobufValue: ProtobufValue,
+{
+    fn wire_type(&self) -> WireType {
+        T::WIRE_TYPE
+    }
+
+    fn runtime_type(&self) -> RuntimeType {
+        <T::ProtobufValue as ProtobufValue>::RuntimeType::runtime_type_box()
+    }
+}
diff --git a/src/reflect/types.rs b/src/reflect/types.rs
new file mode 100644
index 0000000..33ba68d
--- /dev/null
+++ b/src/reflect/types.rs
@@ -0,0 +1,730 @@
+//! Implementations of `ProtobufType` for all types.
+
+#![doc(hidden)]
+
+use std::marker;
+
+#[cfg(feature = "bytes")]
+use ::bytes::Bytes;
+
+#[cfg(feature = "bytes")]
+use crate::chars::Chars;
+use crate::coded_input_stream::CodedInputStream;
+use crate::coded_output_stream::CodedOutputStream;
+use crate::enums::Enum;
+use crate::error::Result;
+pub use crate::reflect::type_dynamic::ProtobufTypeDynamic;
+use crate::reflect::type_dynamic::ProtobufTypeDynamicImpl;
+use crate::reflect::ProtobufValue;
+use crate::rt;
+use crate::rt::singular::value_varint_zigzag_size_no_tag;
+use crate::wire_format::WireType;
+use crate::zigzag::decode_zig_zag_32;
+use crate::zigzag::decode_zig_zag_64;
+use crate::EnumOrUnknown;
+use crate::Message;
+use crate::UnknownValueRef;
+
+/// Encapsulate type-specific serialization and conversion logic
+pub(crate) trait ProtobufTypeTrait: Send + Sync + Clone + Sized + 'static {
+    /// Rust type for this protobuf type.
+    type ProtobufValue: Default;
+
+    /// Dynamic version of this
+    fn dynamic() -> &'static dyn ProtobufTypeDynamic
+    where
+        Self::ProtobufValue: ProtobufValue,
+    {
+        &ProtobufTypeDynamicImpl::<Self>(marker::PhantomData)
+    }
+
+    /// Wire type for encoding objects of this type
+    const WIRE_TYPE: WireType;
+
+    /// Read a value from `CodedInputStream`
+    fn read(is: &mut CodedInputStream) -> Result<Self::ProtobufValue>;
+
+    /// Take a value from `UnknownValues`
+    fn get_from_unknown(_unknown: UnknownValueRef) -> Option<Self::ProtobufValue>;
+
+    /// Compute serialized size of a value
+    fn compute_size(value: &Self::ProtobufValue) -> u64;
+
+    /// Compute size adding length prefix if wire type is length delimited
+    /// (i. e. string, bytes, message)
+    fn compute_size_with_length_delimiter(value: &Self::ProtobufValue) -> u64 {
+        let size = Self::compute_size(value);
+        if Self::WIRE_TYPE == WireType::LengthDelimited {
+            rt::compute_raw_varint64_size(size) + size
+        } else {
+            size
+        }
+    }
+
+    /// Get previously computed size
+    #[inline]
+    fn get_cached_size(value: &Self::ProtobufValue) -> u32 {
+        Self::compute_size(value) as u32
+    }
+
+    /// Get previously cached size with length prefix
+    #[inline]
+    fn get_cached_size_with_length_delimiter(value: &Self::ProtobufValue) -> u32 {
+        let size = Self::get_cached_size(value);
+        if Self::WIRE_TYPE == WireType::LengthDelimited {
+            rt::compute_raw_varint32_size(size) as u32 + size
+        } else {
+            size
+        }
+    }
+
+    /// Write a value with previously cached size
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &Self::ProtobufValue,
+        os: &mut CodedOutputStream,
+    ) -> Result<()>;
+}
+
+/// All fixed size types
+pub(crate) trait ProtobufTypeFixed: ProtobufTypeTrait {
+    /// Encoded size of value in bytes of this type.
+    ///
+    /// E. g. it is `4` for `fixed32`
+    const ENCODED_SIZE: u32;
+}
+
+/// `float`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeFloat;
+/// `double`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeDouble;
+/// `int32`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeInt32;
+/// `int64`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeInt64;
+/// `uint32`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeUint32;
+/// `uint64`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeUint64;
+/// `sint32`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeSint32;
+/// `sint64`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeSint64;
+/// `fixed32`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeFixed32;
+/// `fixed64`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeFixed64;
+/// `sfixed32`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeSfixed32;
+/// `sfixed64`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeSfixed64;
+/// `bool`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeBool;
+/// `string`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeString;
+/// `bytes`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeBytes;
+
+/// `bytes` as [`Bytes`](bytes::Bytes)
+#[cfg(feature = "bytes")]
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeTokioBytes;
+/// `string` as [`Chars`](crate::Chars)
+#[cfg(feature = "bytes")]
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeTokioChars;
+
+/// `enum` as `ProtobufEnumOrUnknown`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeEnumOrUnknown<E: Enum>(marker::PhantomData<E>);
+/// `message`
+#[derive(Copy, Clone)]
+pub struct ProtobufTypeMessage<M: Message>(marker::PhantomData<M>);
+
+impl ProtobufTypeTrait for ProtobufTypeFloat {
+    type ProtobufValue = f32;
+
+    const WIRE_TYPE: WireType = WireType::Fixed32;
+
+    fn read(is: &mut CodedInputStream) -> Result<f32> {
+        is.read_float()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<f32> {
+        match unknown {
+            UnknownValueRef::Fixed32(v) => Some(f32::from_bits(v)),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &f32) -> u64 {
+        Self::ENCODED_SIZE as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &f32,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_float(field_number, *value)
+    }
+}
+
+impl ProtobufTypeFixed for ProtobufTypeFloat {
+    const ENCODED_SIZE: u32 = 4;
+}
+
+impl ProtobufTypeTrait for ProtobufTypeDouble {
+    type ProtobufValue = f64;
+
+    const WIRE_TYPE: WireType = WireType::Fixed64;
+
+    fn read(is: &mut CodedInputStream) -> Result<f64> {
+        is.read_double()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<f64> {
+        match unknown {
+            UnknownValueRef::Fixed64(v) => Some(f64::from_bits(v)),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &f64) -> u64 {
+        Self::ENCODED_SIZE as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &f64,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_double(field_number, *value)
+    }
+}
+
+impl ProtobufTypeFixed for ProtobufTypeDouble {
+    const ENCODED_SIZE: u32 = 8;
+}
+
+impl ProtobufTypeTrait for ProtobufTypeInt32 {
+    type ProtobufValue = i32;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<i32> {
+        is.read_int32()
+    }
+
+    fn compute_size(value: &i32) -> u64 {
+        // See also: https://github.com/protocolbuffers/protobuf/blob/bd00671b924310c0353a730bf8fa77c44e0a9c72/src/google/protobuf/io/coded_stream.h#L1300-L1306
+        if *value < 0 {
+            return 10;
+        }
+        rt::compute_raw_varint32_size(*value as u32)
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &i32,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_int32(field_number, *value)
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<i32> {
+        match unknown {
+            UnknownValueRef::Varint(v) => Some(v as i32),
+            _ => None,
+        }
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeInt64 {
+    type ProtobufValue = i64;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<i64> {
+        is.read_int64()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<i64> {
+        match unknown {
+            UnknownValueRef::Varint(v) => Some(v as i64),
+            _ => None,
+        }
+    }
+
+    fn compute_size(value: &i64) -> u64 {
+        rt::compute_raw_varint64_size(*value as u64)
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &i64,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_int64(field_number, *value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeUint32 {
+    type ProtobufValue = u32;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<u32> {
+        is.read_uint32()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<u32> {
+        match unknown {
+            UnknownValueRef::Varint(v) => Some(v as u32),
+            _ => None,
+        }
+    }
+
+    fn compute_size(value: &u32) -> u64 {
+        rt::compute_raw_varint32_size(*value)
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &u32,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_uint32(field_number, *value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeUint64 {
+    type ProtobufValue = u64;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<u64> {
+        is.read_uint64()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<u64> {
+        match unknown {
+            UnknownValueRef::Varint(v) => Some(v as u64),
+            _ => None,
+        }
+    }
+
+    fn compute_size(value: &u64) -> u64 {
+        rt::compute_raw_varint64_size(*value)
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &u64,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_uint64(field_number, *value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeSint32 {
+    type ProtobufValue = i32;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<i32> {
+        is.read_sint32()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<i32> {
+        ProtobufTypeUint32::get_from_unknown(unknown).map(decode_zig_zag_32)
+    }
+
+    fn compute_size(value: &i32) -> u64 {
+        value_varint_zigzag_size_no_tag(*value)
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &i32,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_sint32(field_number, *value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeSint64 {
+    type ProtobufValue = i64;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<i64> {
+        is.read_sint64()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<i64> {
+        ProtobufTypeUint64::get_from_unknown(unknown).map(decode_zig_zag_64)
+    }
+
+    fn compute_size(value: &i64) -> u64 {
+        value_varint_zigzag_size_no_tag(*value)
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &i64,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_sint64(field_number, *value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeFixed32 {
+    type ProtobufValue = u32;
+
+    const WIRE_TYPE: WireType = WireType::Fixed32;
+
+    fn read(is: &mut CodedInputStream) -> Result<u32> {
+        is.read_fixed32()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<u32> {
+        match unknown {
+            UnknownValueRef::Fixed32(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &u32) -> u64 {
+        Self::ENCODED_SIZE as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &u32,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_fixed32(field_number, *value)
+    }
+}
+
+impl ProtobufTypeFixed for ProtobufTypeFixed32 {
+    const ENCODED_SIZE: u32 = 4;
+}
+
+impl ProtobufTypeTrait for ProtobufTypeFixed64 {
+    type ProtobufValue = u64;
+
+    const WIRE_TYPE: WireType = WireType::Fixed64;
+
+    fn read(is: &mut CodedInputStream) -> Result<u64> {
+        is.read_fixed64()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<u64> {
+        match unknown {
+            UnknownValueRef::Fixed64(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &u64) -> u64 {
+        Self::ENCODED_SIZE as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &u64,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_fixed64(field_number, *value)
+    }
+}
+
+impl ProtobufTypeFixed for ProtobufTypeFixed64 {
+    const ENCODED_SIZE: u32 = 8;
+}
+
+impl ProtobufTypeTrait for ProtobufTypeSfixed32 {
+    type ProtobufValue = i32;
+
+    const WIRE_TYPE: WireType = WireType::Fixed32;
+
+    fn read(is: &mut CodedInputStream) -> Result<i32> {
+        is.read_sfixed32()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<i32> {
+        match unknown {
+            UnknownValueRef::Fixed32(v) => Some(v as i32),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &i32) -> u64 {
+        Self::ENCODED_SIZE as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &i32,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_sfixed32(field_number, *value)
+    }
+}
+
+impl ProtobufTypeFixed for ProtobufTypeSfixed32 {
+    const ENCODED_SIZE: u32 = 4;
+}
+
+impl ProtobufTypeTrait for ProtobufTypeSfixed64 {
+    type ProtobufValue = i64;
+
+    const WIRE_TYPE: WireType = WireType::Fixed64;
+
+    fn read(is: &mut CodedInputStream) -> Result<i64> {
+        is.read_sfixed64()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<i64> {
+        match unknown {
+            UnknownValueRef::Fixed64(v) => Some(v as i64),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &i64) -> u64 {
+        8
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &i64,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_sfixed64(field_number, *value)
+    }
+}
+
+impl ProtobufTypeFixed for ProtobufTypeSfixed64 {
+    const ENCODED_SIZE: u32 = 8;
+}
+
+impl ProtobufTypeTrait for ProtobufTypeBool {
+    type ProtobufValue = bool;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<bool> {
+        is.read_bool()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<bool> {
+        match unknown {
+            UnknownValueRef::Varint(b) => Some(b != 0),
+            _ => None,
+        }
+    }
+
+    fn compute_size(_value: &bool) -> u64 {
+        1
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &bool,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_bool(field_number, *value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeString {
+    type ProtobufValue = String;
+
+    const WIRE_TYPE: WireType = WireType::LengthDelimited;
+
+    fn read(is: &mut CodedInputStream) -> Result<String> {
+        is.read_string()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<String> {
+        match unknown {
+            UnknownValueRef::LengthDelimited(v) => String::from_utf8(v.to_vec()).ok(),
+            _ => None,
+        }
+    }
+
+    fn compute_size(value: &String) -> u64 {
+        value.len() as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &String,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_string(field_number, &value)
+    }
+}
+
+impl ProtobufTypeTrait for ProtobufTypeBytes {
+    type ProtobufValue = Vec<u8>;
+
+    const WIRE_TYPE: WireType = WireType::LengthDelimited;
+
+    fn read(is: &mut CodedInputStream) -> Result<Vec<u8>> {
+        is.read_bytes()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<Vec<u8>> {
+        match unknown {
+            UnknownValueRef::LengthDelimited(v) => Some(v.to_vec()),
+            _ => None,
+        }
+    }
+
+    fn compute_size(value: &Vec<u8>) -> u64 {
+        value.len() as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &Vec<u8>,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_bytes(field_number, &value)
+    }
+}
+
+#[cfg(feature = "bytes")]
+impl ProtobufTypeTrait for ProtobufTypeTokioBytes {
+    type ProtobufValue = bytes::Bytes;
+
+    const WIRE_TYPE: WireType = ProtobufTypeBytes::WIRE_TYPE;
+
+    fn read(is: &mut CodedInputStream) -> Result<Bytes> {
+        is.read_tokio_bytes()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<Bytes> {
+        ProtobufTypeBytes::get_from_unknown(unknown).map(Bytes::from)
+    }
+
+    fn compute_size(value: &Bytes) -> u64 {
+        value.len() as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &Bytes,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_bytes(field_number, &value)
+    }
+}
+
+#[cfg(feature = "bytes")]
+impl ProtobufTypeTrait for ProtobufTypeTokioChars {
+    type ProtobufValue = Chars;
+
+    const WIRE_TYPE: WireType = ProtobufTypeBytes::WIRE_TYPE;
+
+    fn read(is: &mut CodedInputStream) -> Result<Chars> {
+        is.read_tokio_chars()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<Chars> {
+        ProtobufTypeString::get_from_unknown(unknown).map(Chars::from)
+    }
+
+    fn compute_size(value: &Chars) -> u64 {
+        value.len() as u64
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &Chars,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_string(field_number, &value)
+    }
+}
+
+impl<E: Enum> ProtobufTypeTrait for ProtobufTypeEnumOrUnknown<E> {
+    type ProtobufValue = EnumOrUnknown<E>;
+
+    const WIRE_TYPE: WireType = WireType::Varint;
+
+    fn read(is: &mut CodedInputStream) -> Result<EnumOrUnknown<E>> {
+        is.read_enum_or_unknown()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<EnumOrUnknown<E>> {
+        ProtobufTypeInt32::get_from_unknown(unknown).map(|i| EnumOrUnknown::from_i32(i))
+    }
+
+    fn compute_size(value: &EnumOrUnknown<E>) -> u64 {
+        ProtobufTypeInt32::compute_size(&value.value())
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &EnumOrUnknown<E>,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_enum_or_unknown(field_number, *value)
+    }
+}
+
+impl<M: Message + Clone + Default> ProtobufTypeTrait for ProtobufTypeMessage<M> {
+    type ProtobufValue = M;
+
+    const WIRE_TYPE: WireType = WireType::LengthDelimited;
+
+    fn read(is: &mut CodedInputStream) -> Result<M> {
+        is.read_message()
+    }
+
+    fn get_from_unknown(unknown: UnknownValueRef) -> Option<M> {
+        match unknown {
+            UnknownValueRef::LengthDelimited(v) => M::parse_from_bytes(&v).ok(),
+            _ => None,
+        }
+    }
+
+    fn compute_size(value: &M) -> u64 {
+        value.compute_size()
+    }
+
+    fn get_cached_size(value: &M) -> u32 {
+        value.cached_size()
+    }
+
+    fn write_with_cached_size(
+        field_number: u32,
+        value: &Self::ProtobufValue,
+        os: &mut CodedOutputStream,
+    ) -> Result<()> {
+        os.write_tag(field_number, WireType::LengthDelimited)?;
+        os.write_raw_varint32(value.cached_size())?;
+        value.write_to_with_cached_sizes(os)?;
+        Ok(())
+    }
+}
diff --git a/src/reflect/value.rs b/src/reflect/value.rs
deleted file mode 100644
index 9598b9f..0000000
--- a/src/reflect/value.rs
+++ /dev/null
@@ -1,185 +0,0 @@
-use std::any::Any;
-
-#[cfg(feature = "bytes")]
-use bytes::Bytes;
-
-use super::*;
-#[cfg(feature = "bytes")]
-use crate::chars::Chars;
-
-/// Type implemented by all protobuf elementary types
-/// (ints, floats, bool, string, bytes, enums, messages).
-pub trait ProtobufValue: Any + 'static {
-    /// As ref
-    fn as_ref(&self) -> ReflectValueRef;
-
-    /// Convert to `Any`
-    fn as_any(&self) -> &dyn Any {
-        unimplemented!()
-    }
-
-    /// Is value non-zero?
-    fn is_non_zero(&self) -> bool {
-        self.as_ref().is_non_zero()
-    }
-
-    /// Return `ProtobufValueRef` if self is `Copy`.
-    ///
-    /// # Panics
-    ///
-    /// if `Self` is not `Copy`.
-    fn as_ref_copy(&self) -> ReflectValueRef<'static>
-//where Self : Copy // TODO
-    {
-        match self.as_ref() {
-            ReflectValueRef::Bool(v) => ReflectValueRef::Bool(v),
-            ReflectValueRef::U32(v) => ReflectValueRef::U32(v),
-            ReflectValueRef::U64(v) => ReflectValueRef::U64(v),
-            ReflectValueRef::I32(v) => ReflectValueRef::I32(v),
-            ReflectValueRef::I64(v) => ReflectValueRef::I64(v),
-            ReflectValueRef::F32(v) => ReflectValueRef::F32(v),
-            ReflectValueRef::F64(v) => ReflectValueRef::F64(v),
-            ReflectValueRef::Enum(v) => ReflectValueRef::Enum(v),
-            ReflectValueRef::String(..)
-            | ReflectValueRef::Bytes(..)
-            | ReflectValueRef::Message(..) => unreachable!(),
-        }
-    }
-}
-
-impl ProtobufValue for u32 {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::U32(*self)
-    }
-}
-
-impl ProtobufValue for u64 {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::U64(*self)
-    }
-}
-
-impl ProtobufValue for i32 {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::I32(*self)
-    }
-}
-
-impl ProtobufValue for i64 {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::I64(*self)
-    }
-}
-
-impl ProtobufValue for f32 {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::F32(*self)
-    }
-}
-
-impl ProtobufValue for f64 {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::F64(*self)
-    }
-}
-
-impl ProtobufValue for bool {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::Bool(*self)
-    }
-}
-
-impl ProtobufValue for String {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::String(*&self)
-    }
-}
-
-impl ProtobufValue for str {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::String(self)
-    }
-}
-
-impl ProtobufValue for Vec<u8> {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::Bytes(*&self)
-    }
-}
-
-#[cfg(feature = "bytes")]
-impl ProtobufValue for Bytes {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::Bytes(&*self)
-    }
-}
-
-#[cfg(feature = "bytes")]
-impl ProtobufValue for Chars {
-    fn as_ref(&self) -> ReflectValueRef {
-        ReflectValueRef::String(&*self)
-    }
-}
-
-// conflicting implementations, so generated code is used instead
-/*
-impl<E : ProtobufEnum> ProtobufValue for E {
-    fn as_ref(&self) -> ProtobufValueRef {
-        ProtobufValueRef::Enum(self.descriptor())
-    }
-}
-
-impl<M : Message> ProtobufValue for M {
-    fn as_ref(&self) -> ProtobufValueRef {
-        ProtobufValueRef::Message(self)
-    }
-}
-*/
-
-/// A reference to a value
-#[derive(Debug)]
-pub enum ReflectValueRef<'a> {
-    /// `u32`
-    U32(u32),
-    /// `u64`
-    U64(u64),
-    /// `i32`
-    I32(i32),
-    /// `i64`
-    I64(i64),
-    /// `f32`
-    F32(f32),
-    /// `f64`
-    F64(f64),
-    /// `bool`
-    Bool(bool),
-    /// `string`
-    String(&'a str),
-    /// `bytes`
-    Bytes(&'a [u8]),
-    /// `enum`
-    // TODO: change to (i32, EnumDescriptor)
-    Enum(&'static EnumValueDescriptor),
-    /// `message`
-    Message(&'a dyn Message),
-}
-
-impl<'a> ReflectValueRef<'a> {
-    /// Value is "non-zero"?
-    #[doc(hidden)]
-    pub fn is_non_zero(&self) -> bool {
-        match *self {
-            ReflectValueRef::U32(v) => v != 0,
-            ReflectValueRef::U64(v) => v != 0,
-            ReflectValueRef::I32(v) => v != 0,
-            ReflectValueRef::I64(v) => v != 0,
-            ReflectValueRef::F32(v) => v != 0.,
-            ReflectValueRef::F64(v) => v != 0.,
-            ReflectValueRef::Bool(v) => v,
-            ReflectValueRef::String(v) => !v.is_empty(),
-            ReflectValueRef::Bytes(v) => !v.is_empty(),
-            ReflectValueRef::Enum(v) => v.value() != 0,
-            ReflectValueRef::Message(_) => true,
-        }
-    }
-}
diff --git a/src/reflect/value/mod.rs b/src/reflect/value/mod.rs
new file mode 100644
index 0000000..3d04909
--- /dev/null
+++ b/src/reflect/value/mod.rs
@@ -0,0 +1,88 @@
+use std::fmt;
+
+#[cfg(feature = "bytes")]
+use ::bytes::Bytes;
+
+#[cfg(feature = "bytes")]
+use crate::chars::Chars;
+use crate::reflect::runtime_types::RuntimeTypeBool;
+use crate::reflect::runtime_types::RuntimeTypeF32;
+use crate::reflect::runtime_types::RuntimeTypeF64;
+use crate::reflect::runtime_types::RuntimeTypeI32;
+use crate::reflect::runtime_types::RuntimeTypeI64;
+use crate::reflect::runtime_types::RuntimeTypeString;
+#[cfg(feature = "bytes")]
+use crate::reflect::runtime_types::RuntimeTypeTokioBytes;
+#[cfg(feature = "bytes")]
+use crate::reflect::runtime_types::RuntimeTypeTokioChars;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::runtime_types::RuntimeTypeU32;
+use crate::reflect::runtime_types::RuntimeTypeU64;
+use crate::reflect::runtime_types::RuntimeTypeVecU8;
+
+pub(crate) mod value_box;
+pub(crate) mod value_ref;
+
+/// Type implemented by all protobuf singular types
+/// (primitives, string, messages, enums).
+///
+/// Used in reflection.
+pub trait ProtobufValue: Clone + Default + fmt::Debug + Send + Sync + Sized + 'static {
+    /// Actual implementation of type properties.
+    type RuntimeType: RuntimeTypeTrait<Value = Self>;
+}
+
+impl ProtobufValue for u32 {
+    type RuntimeType = RuntimeTypeU32;
+}
+
+impl ProtobufValue for u64 {
+    type RuntimeType = RuntimeTypeU64;
+}
+
+impl ProtobufValue for i32 {
+    type RuntimeType = RuntimeTypeI32;
+}
+
+impl ProtobufValue for i64 {
+    type RuntimeType = RuntimeTypeI64;
+}
+
+impl ProtobufValue for f32 {
+    type RuntimeType = RuntimeTypeF32;
+}
+
+impl ProtobufValue for f64 {
+    type RuntimeType = RuntimeTypeF64;
+}
+
+impl ProtobufValue for bool {
+    type RuntimeType = RuntimeTypeBool;
+}
+
+impl ProtobufValue for String {
+    type RuntimeType = RuntimeTypeString;
+}
+
+impl ProtobufValue for Vec<u8> {
+    type RuntimeType = RuntimeTypeVecU8;
+}
+
+#[cfg(feature = "bytes")]
+impl ProtobufValue for Bytes {
+    type RuntimeType = RuntimeTypeTokioBytes;
+}
+
+#[cfg(feature = "bytes")]
+impl ProtobufValue for Chars {
+    type RuntimeType = RuntimeTypeTokioChars;
+}
+
+// conflicting implementations, so generated code is used instead
+/*
+impl<E : ProtobufEnum> ProtobufValue for E {
+}
+
+impl<M : Message> ProtobufValue for M {
+}
+*/
diff --git a/src/reflect/value/value_box.rs b/src/reflect/value/value_box.rs
new file mode 100644
index 0000000..69fe338
--- /dev/null
+++ b/src/reflect/value/value_box.rs
@@ -0,0 +1,197 @@
+use crate::reflect::message::message_ref::MessageRef;
+use crate::reflect::runtime_types::RuntimeTypeTrait;
+use crate::reflect::value::value_ref::ReflectValueMut;
+use crate::reflect::value::value_ref::ReflectValueRef;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::EnumValueDescriptor;
+use crate::reflect::ProtobufValue;
+use crate::reflect::RuntimeType;
+use crate::MessageDyn;
+
+/// Owner value of any elementary type
+#[derive(Debug, Clone)]
+pub enum ReflectValueBox {
+    /// `u32`
+    U32(u32),
+    /// `u64`
+    U64(u64),
+    /// `i32`
+    I32(i32),
+    /// `i64`
+    I64(i64),
+    /// `f32`
+    F32(f32),
+    /// `f64`
+    F64(f64),
+    /// `bool`
+    Bool(bool),
+    /// `string`
+    String(String),
+    /// `bytes`
+    Bytes(Vec<u8>),
+    /// `enum`
+    Enum(EnumDescriptor, i32),
+    /// `message`
+    Message(Box<dyn MessageDyn>),
+}
+
+impl From<u32> for ReflectValueBox {
+    fn from(v: u32) -> Self {
+        ReflectValueBox::U32(v)
+    }
+}
+
+impl From<u64> for ReflectValueBox {
+    fn from(v: u64) -> Self {
+        ReflectValueBox::U64(v)
+    }
+}
+
+impl From<i32> for ReflectValueBox {
+    fn from(v: i32) -> Self {
+        ReflectValueBox::I32(v)
+    }
+}
+
+impl From<i64> for ReflectValueBox {
+    fn from(v: i64) -> Self {
+        ReflectValueBox::I64(v)
+    }
+}
+
+impl From<f32> for ReflectValueBox {
+    fn from(v: f32) -> Self {
+        ReflectValueBox::F32(v)
+    }
+}
+
+impl From<f64> for ReflectValueBox {
+    fn from(v: f64) -> Self {
+        ReflectValueBox::F64(v)
+    }
+}
+
+impl From<bool> for ReflectValueBox {
+    fn from(v: bool) -> Self {
+        ReflectValueBox::Bool(v)
+    }
+}
+
+impl From<String> for ReflectValueBox {
+    fn from(v: String) -> Self {
+        ReflectValueBox::String(v)
+    }
+}
+
+impl From<Vec<u8>> for ReflectValueBox {
+    fn from(v: Vec<u8>) -> Self {
+        ReflectValueBox::Bytes(v)
+    }
+}
+
+impl<'a> From<&'a EnumValueDescriptor> for ReflectValueBox {
+    fn from(v: &'a EnumValueDescriptor) -> Self {
+        ReflectValueBox::from(v.clone())
+    }
+}
+
+impl From<EnumValueDescriptor> for ReflectValueBox {
+    fn from(v: EnumValueDescriptor) -> Self {
+        let number = v.value();
+        ReflectValueBox::Enum(v.enum_descriptor, number)
+    }
+}
+
+impl From<Box<dyn MessageDyn>> for ReflectValueBox {
+    fn from(v: Box<dyn MessageDyn>) -> Self {
+        ReflectValueBox::Message(v)
+    }
+}
+
+fn _assert_value_box_send_sync() {
+    fn _assert_send_sync<T: Send + Sync>() {}
+    _assert_send_sync::<ReflectValueBox>();
+}
+
+impl ReflectValueBox {
+    /// Type of this value.
+    pub fn get_type(&self) -> RuntimeType {
+        self.as_value_ref().get_type()
+    }
+
+    /// As ref
+    pub fn as_value_ref(&self) -> ReflectValueRef {
+        match self {
+            ReflectValueBox::U32(v) => ReflectValueRef::U32(*v),
+            ReflectValueBox::U64(v) => ReflectValueRef::U64(*v),
+            ReflectValueBox::I32(v) => ReflectValueRef::I32(*v),
+            ReflectValueBox::I64(v) => ReflectValueRef::I64(*v),
+            ReflectValueBox::F32(v) => ReflectValueRef::F32(*v),
+            ReflectValueBox::F64(v) => ReflectValueRef::F64(*v),
+            ReflectValueBox::Bool(v) => ReflectValueRef::Bool(*v),
+            ReflectValueBox::String(ref v) => ReflectValueRef::String(v.as_str()),
+            ReflectValueBox::Bytes(ref v) => ReflectValueRef::Bytes(v.as_slice()),
+            ReflectValueBox::Enum(d, v) => ReflectValueRef::Enum(d.clone(), *v),
+            ReflectValueBox::Message(v) => ReflectValueRef::Message(MessageRef::from(&**v)),
+        }
+    }
+
+    pub(crate) fn as_value_mut(&mut self) -> ReflectValueMut {
+        match self {
+            ReflectValueBox::Message(m) => ReflectValueMut::Message(&mut **m),
+            _ => panic!(
+                "ReflectValueMut cannot be constructed from {:?}",
+                self.get_type()
+            ),
+        }
+    }
+
+    /// Downcast to real typed value.
+    ///
+    /// For `enum` `V` can be either `V: ProtobufEnum` or `V: ProtobufEnumOrUnknown<E>`.
+    pub fn downcast<V: ProtobufValue>(self) -> Result<V, Self> {
+        V::RuntimeType::from_value_box(self)
+    }
+}
+
+impl<'a> PartialEq for ReflectValueBox {
+    fn eq(&self, other: &Self) -> bool {
+        self.as_value_ref() == other.as_value_ref()
+    }
+}
+
+impl<'a> PartialEq<ReflectValueBox> for ReflectValueRef<'a> {
+    fn eq(&self, other: &ReflectValueBox) -> bool {
+        *self == other.as_value_ref()
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn reflect_value_box_downcast_primitive() {
+        assert_eq!(Ok(10), ReflectValueBox::U32(10).downcast::<u32>());
+        assert_eq!(
+            Err(ReflectValueBox::I32(10)),
+            ReflectValueBox::I32(10).downcast::<u32>()
+        );
+    }
+
+    #[test]
+    fn reflect_value_box_downcast_string() {
+        assert_eq!(
+            Ok("aa".to_owned()),
+            ReflectValueBox::String("aa".to_owned()).downcast::<String>()
+        );
+        assert_eq!(
+            Err(ReflectValueBox::String("aa".to_owned())),
+            ReflectValueBox::String("aa".to_owned()).downcast::<u32>()
+        );
+        assert_eq!(
+            Err(ReflectValueBox::Bool(false)),
+            ReflectValueBox::Bool(false).downcast::<String>()
+        );
+    }
+}
diff --git a/src/reflect/value/value_ref.rs b/src/reflect/value/value_ref.rs
new file mode 100644
index 0000000..18f8241
--- /dev/null
+++ b/src/reflect/value/value_ref.rs
@@ -0,0 +1,370 @@
+use std::fmt;
+use std::hash::Hash;
+use std::hash::Hasher;
+use std::mem;
+
+use crate::reflect::value::value_box::ReflectValueBox;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::EnumValueDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::MessageRef;
+use crate::reflect::ProtobufValue;
+use crate::reflect::ReflectEq;
+use crate::reflect::ReflectEqMode;
+use crate::reflect::RuntimeType;
+use crate::MessageDyn;
+
+/// A reference to a value
+#[derive(Debug, Clone)]
+pub enum ReflectValueRef<'a> {
+    /// `u32`
+    U32(u32),
+    /// `u64`
+    U64(u64),
+    /// `i32`
+    I32(i32),
+    /// `i64`
+    I64(i64),
+    /// `f32`
+    F32(f32),
+    /// `f64`
+    F64(f64),
+    /// `bool`
+    Bool(bool),
+    /// `string`
+    String(&'a str),
+    /// `bytes`
+    Bytes(&'a [u8]),
+    /// `enum`
+    Enum(
+        EnumDescriptor,
+        /// Enum value.
+        ///
+        /// Note when `allow_alias` option is enabled, more than one enum variant
+        /// may have the same value.
+        i32,
+    ),
+    /// `message`
+    Message(MessageRef<'a>),
+}
+
+impl<'a> fmt::Display for ReflectValueRef<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ReflectValueRef::U32(v) => write!(f, "{}", v),
+            ReflectValueRef::U64(v) => write!(f, "{}", v),
+            ReflectValueRef::I32(v) => write!(f, "{}", v),
+            ReflectValueRef::I64(v) => write!(f, "{}", v),
+            ReflectValueRef::F32(v) => write!(f, "{}", v),
+            ReflectValueRef::F64(v) => write!(f, "{}", v),
+            ReflectValueRef::Bool(v) => write!(f, "{}", v),
+            ReflectValueRef::String(v) => write!(f, "{}", v),
+            // TODO: better display
+            ReflectValueRef::Bytes(v) => write!(f, "{:?}", v),
+            ReflectValueRef::Enum(descriptor, value) => match descriptor.value_by_number(*value) {
+                Some(v) => write!(f, "{}", v.name()),
+                None => write!(f, "{}", value),
+            },
+            ReflectValueRef::Message(msg) => write!(f, "{}", msg),
+        }
+    }
+}
+
+impl<'a> ReflectValueRef<'a> {
+    /// Get type of this value.
+    pub fn get_type(&self) -> RuntimeType {
+        match self {
+            ReflectValueRef::U32(..) => RuntimeType::U32,
+            ReflectValueRef::U64(..) => RuntimeType::U64,
+            ReflectValueRef::I32(..) => RuntimeType::I32,
+            ReflectValueRef::I64(..) => RuntimeType::I64,
+            ReflectValueRef::F32(..) => RuntimeType::F32,
+            ReflectValueRef::F64(..) => RuntimeType::F64,
+            ReflectValueRef::Bool(..) => RuntimeType::Bool,
+            ReflectValueRef::String(..) => RuntimeType::String,
+            ReflectValueRef::Bytes(..) => RuntimeType::VecU8,
+            ReflectValueRef::Enum(d, ..) => RuntimeType::Enum(d.clone()),
+            ReflectValueRef::Message(m) => RuntimeType::Message(m.descriptor_dyn()),
+        }
+    }
+
+    /// Value is "non-zero"?
+    pub(crate) fn is_non_zero(&self) -> bool {
+        match self {
+            ReflectValueRef::U32(v) => *v != 0,
+            ReflectValueRef::U64(v) => *v != 0,
+            ReflectValueRef::I32(v) => *v != 0,
+            ReflectValueRef::I64(v) => *v != 0,
+            ReflectValueRef::F32(v) => *v != 0.,
+            ReflectValueRef::F64(v) => *v != 0.,
+            ReflectValueRef::Bool(v) => *v,
+            ReflectValueRef::String(v) => !v.is_empty(),
+            ReflectValueRef::Bytes(v) => !v.is_empty(),
+            ReflectValueRef::Enum(_d, v) => *v != 0,
+            ReflectValueRef::Message(_) => true,
+        }
+    }
+
+    pub(crate) fn is_initialized(&self) -> bool {
+        if let ReflectValueRef::Message(m) = self {
+            m.is_initialized_dyn()
+        } else {
+            true
+        }
+    }
+
+    /// Take `i32` value.
+    pub fn to_i32(&self) -> Option<i32> {
+        match *self {
+            ReflectValueRef::I32(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `i64` value.
+    pub fn to_i64(&self) -> Option<i64> {
+        match *self {
+            ReflectValueRef::I64(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `u32` value.
+    pub fn to_u32(&self) -> Option<u32> {
+        match *self {
+            ReflectValueRef::U32(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `u64` value.
+    pub fn to_u64(&self) -> Option<u64> {
+        match *self {
+            ReflectValueRef::U64(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `f32` value.
+    pub fn to_f32(&self) -> Option<f32> {
+        match *self {
+            ReflectValueRef::F32(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `f64` value.
+    pub fn to_f64(&self) -> Option<f64> {
+        match *self {
+            ReflectValueRef::F64(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `bool` value.
+    pub fn to_bool(&self) -> Option<bool> {
+        match *self {
+            ReflectValueRef::Bool(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `str` value.
+    pub fn to_str(&self) -> Option<&str> {
+        match *self {
+            ReflectValueRef::String(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take `[u8]` value.
+    pub fn to_bytes(&self) -> Option<&[u8]> {
+        match *self {
+            ReflectValueRef::Bytes(v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take enum value.
+    pub fn to_enum_value(&self) -> Option<i32> {
+        match *self {
+            ReflectValueRef::Enum(_, v) => Some(v),
+            _ => None,
+        }
+    }
+
+    /// Take message value.
+    pub fn to_message(&self) -> Option<MessageRef<'a>> {
+        match self {
+            ReflectValueRef::Message(m) => Some(m.clone()),
+            _ => None,
+        }
+    }
+
+    /// Clone to a box
+    pub fn to_box(&self) -> ReflectValueBox {
+        match self {
+            ReflectValueRef::U32(v) => ReflectValueBox::U32(*v),
+            ReflectValueRef::U64(v) => ReflectValueBox::U64(*v),
+            ReflectValueRef::I32(v) => ReflectValueBox::I32(*v),
+            ReflectValueRef::I64(v) => ReflectValueBox::I64(*v),
+            ReflectValueRef::F32(v) => ReflectValueBox::F32(*v),
+            ReflectValueRef::F64(v) => ReflectValueBox::F64(*v),
+            ReflectValueRef::Bool(v) => ReflectValueBox::Bool(*v),
+            ReflectValueRef::String(v) => ReflectValueBox::String((*v).to_owned()),
+            ReflectValueRef::Bytes(v) => ReflectValueBox::Bytes((*v).to_owned()),
+            ReflectValueRef::Enum(d, v) => ReflectValueBox::Enum(d.clone(), *v),
+            ReflectValueRef::Message(v) => ReflectValueBox::Message(v.clone_box()),
+        }
+    }
+
+    /// Convert a value to arbitrary value.
+    pub fn downcast_clone<V: ProtobufValue>(&self) -> Result<V, Self> {
+        self.to_box().downcast().map_err(|_| self.clone())
+    }
+}
+
+pub enum ReflectValueMut<'a> {
+    Message(&'a mut dyn MessageDyn),
+}
+
+impl<'a> ReflectEq for ReflectValueRef<'a> {
+    fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
+        use crate::reflect::value::value_ref::ReflectValueRef::*;
+        match (self, that) {
+            (U32(a), U32(b)) => a == b,
+            (U64(a), U64(b)) => a == b,
+            (I32(a), I32(b)) => a == b,
+            (I64(a), I64(b)) => a == b,
+            (F32(a), F32(b)) => {
+                if a.is_nan() || b.is_nan() {
+                    a.is_nan() == b.is_nan() && mode.nan_equal
+                } else {
+                    a == b
+                }
+            }
+            (F64(a), F64(b)) => {
+                if a.is_nan() || b.is_nan() {
+                    a.is_nan() == b.is_nan() && mode.nan_equal
+                } else {
+                    a == b
+                }
+            }
+            (Bool(a), Bool(b)) => a == b,
+            (String(a), String(b)) => a == b,
+            (Bytes(a), Bytes(b)) => a == b,
+            (Enum(ad, a), Enum(bd, b)) => ad == bd && a == b,
+            (Message(a), Message(b)) => a.reflect_eq(b, mode),
+            _ => false,
+        }
+    }
+}
+
+impl<'a> PartialEq for ReflectValueRef<'a> {
+    fn eq(&self, other: &ReflectValueRef) -> bool {
+        use self::ReflectValueRef::*;
+        match (self, other) {
+            (U32(a), U32(b)) => a == b,
+            (U64(a), U64(b)) => a == b,
+            (I32(a), I32(b)) => a == b,
+            (I64(a), I64(b)) => a == b,
+            // should probably NaN == NaN here
+            (F32(a), F32(b)) => a == b,
+            (F64(a), F64(b)) => a == b,
+            (Bool(a), Bool(b)) => a == b,
+            (String(a), String(b)) => a == b,
+            (Bytes(a), Bytes(b)) => a == b,
+            (Enum(da, a), Enum(db, b)) => da == db && a == b,
+            (Message(a), Message(b)) => {
+                MessageDescriptor::reflect_eq_maybe_unrelated(&**a, &**b, &ReflectEqMode::default())
+            }
+            _ => false,
+        }
+    }
+}
+
+impl<'a> PartialEq<ReflectValueRef<'a>> for ReflectValueBox {
+    fn eq(&self, other: &ReflectValueRef) -> bool {
+        self.as_value_ref() == *other
+    }
+}
+
+// Panics if contained type is not hashable
+impl<'a> Hash for ReflectValueRef<'a> {
+    fn hash<H: Hasher>(&self, state: &mut H) {
+        use self::ReflectValueRef::*;
+        Hash::hash(&mem::discriminant(self), state);
+        match self {
+            U32(v) => Hash::hash(&v, state),
+            U64(v) => Hash::hash(&v, state),
+            I32(v) => Hash::hash(&v, state),
+            I64(v) => Hash::hash(&v, state),
+            Bool(v) => Hash::hash(&v, state),
+            String(v) => Hash::hash(&v, state),
+            Bytes(v) => Hash::hash(&v, state),
+            Enum(_d, v) => Hash::hash(v, state),
+            F32(_) | F64(_) | Message(_) => panic!("not hashable: {:?}", self),
+        }
+    }
+}
+
+impl<'a> From<EnumValueDescriptor> for ReflectValueRef<'a> {
+    fn from(v: EnumValueDescriptor) -> Self {
+        let number = v.value();
+        ReflectValueRef::Enum(v.enum_descriptor, number)
+    }
+}
+
+impl From<u32> for ReflectValueRef<'_> {
+    fn from(v: u32) -> Self {
+        ReflectValueRef::U32(v)
+    }
+}
+
+impl From<i32> for ReflectValueRef<'_> {
+    fn from(v: i32) -> Self {
+        ReflectValueRef::I32(v)
+    }
+}
+
+impl From<u64> for ReflectValueRef<'_> {
+    fn from(v: u64) -> Self {
+        ReflectValueRef::U64(v)
+    }
+}
+
+impl From<i64> for ReflectValueRef<'_> {
+    fn from(v: i64) -> Self {
+        ReflectValueRef::I64(v)
+    }
+}
+
+impl From<f32> for ReflectValueRef<'_> {
+    fn from(v: f32) -> Self {
+        ReflectValueRef::F32(v)
+    }
+}
+
+impl From<f64> for ReflectValueRef<'_> {
+    fn from(v: f64) -> Self {
+        ReflectValueRef::F64(v)
+    }
+}
+
+impl From<bool> for ReflectValueRef<'_> {
+    fn from(v: bool) -> Self {
+        ReflectValueRef::Bool(v)
+    }
+}
+
+impl<'a> From<&'a str> for ReflectValueRef<'a> {
+    fn from(v: &'a str) -> Self {
+        ReflectValueRef::String(v)
+    }
+}
+
+impl<'a> From<&'a [u8]> for ReflectValueRef<'a> {
+    fn from(v: &'a [u8]) -> Self {
+        ReflectValueRef::Bytes(v)
+    }
+}
diff --git a/src/repeated.rs b/src/repeated.rs
deleted file mode 100644
index 0b749d9..0000000
--- a/src/repeated.rs
+++ /dev/null
@@ -1,563 +0,0 @@
-use std::borrow::Borrow;
-use std::cmp::Ordering;
-use std::default::Default;
-use std::fmt;
-use std::hash::Hash;
-use std::hash::Hasher;
-use std::iter::FromIterator;
-use std::iter::IntoIterator;
-use std::ops::Deref;
-use std::ops::DerefMut;
-use std::ops::Index;
-use std::ops::IndexMut;
-use std::slice;
-use std::vec;
-
-#[cfg(feature = "with-serde")]
-use serde;
-
-use crate::clear::Clear;
-
-/// Wrapper around vector to avoid deallocations on clear.
-pub struct RepeatedField<T> {
-    vec: Vec<T>,
-    len: usize,
-}
-
-impl<T> RepeatedField<T> {
-    /// Return number of elements in this container.
-    #[inline]
-    pub fn len(&self) -> usize {
-        self.len
-    }
-
-    /// Clear.
-    #[inline]
-    pub fn clear(&mut self) {
-        self.len = 0;
-    }
-}
-
-impl<T> Clear for RepeatedField<T> {
-    #[inline]
-    fn clear(&mut self) {
-        self.len = 0;
-    }
-}
-
-impl<T> Default for RepeatedField<T> {
-    #[inline]
-    fn default() -> RepeatedField<T> {
-        RepeatedField {
-            vec: Vec::new(),
-            len: 0,
-        }
-    }
-}
-
-impl<T> RepeatedField<T> {
-    /// Create new empty container.
-    #[inline]
-    pub fn new() -> RepeatedField<T> {
-        Default::default()
-    }
-
-    /// Create a contained with data from given vec.
-    #[inline]
-    pub fn from_vec(vec: Vec<T>) -> RepeatedField<T> {
-        let len = vec.len();
-        RepeatedField { vec: vec, len: len }
-    }
-
-    /// Convert data into vec.
-    #[inline]
-    pub fn into_vec(self) -> Vec<T> {
-        let mut vec = self.vec;
-        vec.truncate(self.len);
-        vec
-    }
-
-    /// Return current capacity.
-    #[inline]
-    pub fn capacity(&self) -> usize {
-        self.vec.capacity()
-    }
-
-    /// View data as slice.
-    #[inline]
-    pub fn as_slice<'a>(&'a self) -> &'a [T] {
-        &self.vec[..self.len]
-    }
-
-    /// View data as mutable slice.
-    #[inline]
-    pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T] {
-        &mut self.vec[..self.len]
-    }
-
-    /// Get subslice of this container.
-    #[inline]
-    pub fn slice(&self, start: usize, end: usize) -> &[T] {
-        &self.as_ref()[start..end]
-    }
-
-    /// Get mutable subslice of this container.
-    #[inline]
-    pub fn slice_mut(&mut self, start: usize, end: usize) -> &mut [T] {
-        &mut self.as_mut_slice()[start..end]
-    }
-
-    /// Get slice from given index.
-    #[inline]
-    pub fn slice_from(&self, start: usize) -> &[T] {
-        &self.as_ref()[start..]
-    }
-
-    /// Get mutable slice from given index.
-    #[inline]
-    pub fn slice_from_mut(&mut self, start: usize) -> &mut [T] {
-        &mut self.as_mut_slice()[start..]
-    }
-
-    /// Get slice to given index.
-    #[inline]
-    pub fn slice_to(&self, end: usize) -> &[T] {
-        &self.as_ref()[..end]
-    }
-
-    /// Get mutable slice to given index.
-    #[inline]
-    pub fn slice_to_mut(&mut self, end: usize) -> &mut [T] {
-        &mut self.as_mut_slice()[..end]
-    }
-
-    /// View this container as two slices split at given index.
-    #[inline]
-    pub fn split_at<'a>(&'a self, mid: usize) -> (&'a [T], &'a [T]) {
-        self.as_ref().split_at(mid)
-    }
-
-    /// View this container as two mutable slices split at given index.
-    #[inline]
-    pub fn split_at_mut<'a>(&'a mut self, mid: usize) -> (&'a mut [T], &'a mut [T]) {
-        self.as_mut_slice().split_at_mut(mid)
-    }
-
-    /// View all but first elements of this container.
-    #[inline]
-    pub fn tail(&self) -> &[T] {
-        &self.as_ref()[1..]
-    }
-
-    /// Last element of this container.
-    #[inline]
-    pub fn last(&self) -> Option<&T> {
-        self.as_ref().last()
-    }
-
-    /// Mutable last element of this container.
-    #[inline]
-    pub fn last_mut<'a>(&'a mut self) -> Option<&'a mut T> {
-        self.as_mut_slice().last_mut()
-    }
-
-    /// View all but last elements of this container.
-    #[inline]
-    pub fn init<'a>(&'a self) -> &'a [T] {
-        let s = self.as_ref();
-        &s[0..s.len() - 1]
-    }
-
-    /// Push an element to the end.
-    #[inline]
-    pub fn push(&mut self, value: T) {
-        if self.len == self.vec.len() {
-            self.vec.push(value);
-        } else {
-            self.vec[self.len] = value;
-        }
-        self.len += 1;
-    }
-
-    /// Pop last element.
-    #[inline]
-    pub fn pop(&mut self) -> Option<T> {
-        if self.len == 0 {
-            None
-        } else {
-            self.vec.truncate(self.len);
-            self.len -= 1;
-            self.vec.pop()
-        }
-    }
-
-    /// Insert an element at specified position.
-    #[inline]
-    pub fn insert(&mut self, index: usize, value: T) {
-        assert!(index <= self.len);
-        self.vec.insert(index, value);
-        self.len += 1;
-    }
-
-    /// Remove an element from specified position.
-    #[inline]
-    pub fn remove(&mut self, index: usize) -> T {
-        assert!(index < self.len);
-        self.len -= 1;
-        self.vec.remove(index)
-    }
-
-    /// Retains only the elements specified by the predicate.
-    ///
-    /// In other words, remove all elements `e` such that `f(&e)` returns `false`.
-    /// This method operates in place, visiting each element exactly once in the
-    /// original order, and preserves the order of the retained elements.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// # use protobuf::RepeatedField;
-    ///
-    /// let mut vec = RepeatedField::from(vec![1, 2, 3, 4]);
-    /// vec.retain(|&x| x % 2 == 0);
-    /// assert_eq!(vec, RepeatedField::from(vec![2, 4]));
-    /// ```
-    pub fn retain<F>(&mut self, f: F)
-    where
-        F: FnMut(&T) -> bool,
-    {
-        // suboptimal
-        self.vec.truncate(self.len);
-        self.vec.retain(f);
-        self.len = self.vec.len();
-    }
-
-    /// Truncate at specified length.
-    #[inline]
-    pub fn truncate(&mut self, len: usize) {
-        if self.len > len {
-            self.len = len;
-        }
-    }
-
-    /// Reverse in place.
-    #[inline]
-    pub fn reverse(&mut self) {
-        self.as_mut_slice().reverse()
-    }
-
-    /// Into owned iterator.
-    #[inline]
-    pub fn into_iter(mut self) -> vec::IntoIter<T> {
-        self.vec.truncate(self.len);
-        self.vec.into_iter()
-    }
-
-    /// Immutable data iterator.
-    #[inline]
-    pub fn iter<'a>(&'a self) -> slice::Iter<'a, T> {
-        self.as_ref().iter()
-    }
-
-    /// Mutable data iterator.
-    #[inline]
-    pub fn iter_mut<'a>(&'a mut self) -> slice::IterMut<'a, T> {
-        self.as_mut_slice().iter_mut()
-    }
-
-    /// Sort elements with given comparator.
-    #[inline]
-    pub fn sort_by<F>(&mut self, compare: F)
-    where
-        F: Fn(&T, &T) -> Ordering,
-    {
-        self.as_mut_slice().sort_by(compare)
-    }
-
-    /// Get data as raw pointer.
-    #[inline]
-    pub fn as_ptr(&self) -> *const T {
-        self.vec.as_ptr()
-    }
-
-    /// Get data a mutable raw pointer.
-    #[inline]
-    pub fn as_mut_ptr(&mut self) -> *mut T {
-        self.vec.as_mut_ptr()
-    }
-}
-
-impl<T: Default + Clear> RepeatedField<T> {
-    /// Push default value.
-    /// This operation could be faster than `rf.push(Default::default())`,
-    /// because it may reuse previously allocated and cleared element.
-    pub fn push_default<'a>(&'a mut self) -> &'a mut T {
-        if self.len == self.vec.len() {
-            self.vec.push(Default::default());
-        } else {
-            self.vec[self.len].clear();
-        }
-        self.len += 1;
-        self.last_mut().unwrap()
-    }
-}
-
-impl<T> From<Vec<T>> for RepeatedField<T> {
-    #[inline]
-    fn from(values: Vec<T>) -> RepeatedField<T> {
-        RepeatedField::from_vec(values)
-    }
-}
-
-impl<'a, T: Clone> From<&'a [T]> for RepeatedField<T> {
-    #[inline]
-    fn from(values: &'a [T]) -> RepeatedField<T> {
-        RepeatedField::from_slice(values)
-    }
-}
-
-impl<T> Into<Vec<T>> for RepeatedField<T> {
-    #[inline]
-    fn into(self) -> Vec<T> {
-        self.into_vec()
-    }
-}
-
-impl<T: Clone> RepeatedField<T> {
-    /// Copy slice data to `RepeatedField`
-    #[inline]
-    pub fn from_slice(values: &[T]) -> RepeatedField<T> {
-        RepeatedField::from_vec(values.to_vec())
-    }
-
-    /// Copy slice data to `RepeatedField`
-    #[inline]
-    pub fn from_ref<X: AsRef<[T]>>(values: X) -> RepeatedField<T> {
-        RepeatedField::from_slice(values.as_ref())
-    }
-
-    /// Copy this data into new vec.
-    #[inline]
-    pub fn to_vec(&self) -> Vec<T> {
-        self.as_ref().to_vec()
-    }
-}
-
-impl<T: Clone> Clone for RepeatedField<T> {
-    #[inline]
-    fn clone(&self) -> RepeatedField<T> {
-        RepeatedField {
-            vec: self.to_vec(),
-            len: self.len(),
-        }
-    }
-}
-
-impl<T> FromIterator<T> for RepeatedField<T> {
-    #[inline]
-    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> RepeatedField<T> {
-        RepeatedField::from_vec(FromIterator::from_iter(iter))
-    }
-}
-
-impl<'a, T> IntoIterator for &'a RepeatedField<T> {
-    type Item = &'a T;
-    type IntoIter = slice::Iter<'a, T>;
-
-    fn into_iter(self) -> slice::Iter<'a, T> {
-        self.iter()
-    }
-}
-
-impl<'a, T> IntoIterator for &'a mut RepeatedField<T> {
-    type Item = &'a mut T;
-    type IntoIter = slice::IterMut<'a, T>;
-
-    fn into_iter(self) -> slice::IterMut<'a, T> {
-        self.iter_mut()
-    }
-}
-
-impl<'a, T> IntoIterator for RepeatedField<T> {
-    type Item = T;
-    type IntoIter = vec::IntoIter<T>;
-
-    fn into_iter(self) -> vec::IntoIter<T> {
-        self.into_iter()
-    }
-}
-
-impl<T: PartialEq> PartialEq for RepeatedField<T> {
-    #[inline]
-    fn eq(&self, other: &RepeatedField<T>) -> bool {
-        self.as_ref() == other.as_ref()
-    }
-}
-
-impl<T: Eq> Eq for RepeatedField<T> {}
-
-impl<T: PartialEq> PartialEq<[T]> for RepeatedField<T> {
-    fn eq(&self, other: &[T]) -> bool {
-        self.as_slice() == other
-    }
-}
-
-impl<T: PartialEq> PartialEq<RepeatedField<T>> for [T] {
-    fn eq(&self, other: &RepeatedField<T>) -> bool {
-        self == other.as_slice()
-    }
-}
-
-impl<T: PartialEq> RepeatedField<T> {
-    /// True iff this container contains given element.
-    #[inline]
-    pub fn contains(&self, value: &T) -> bool {
-        self.as_ref().contains(value)
-    }
-}
-
-impl<T: Hash> Hash for RepeatedField<T> {
-    fn hash<H: Hasher>(&self, state: &mut H) {
-        self.as_ref().hash(state);
-    }
-}
-
-impl<T> AsRef<[T]> for RepeatedField<T> {
-    #[inline]
-    fn as_ref<'a>(&'a self) -> &'a [T] {
-        &self.vec[..self.len]
-    }
-}
-
-impl<T> Borrow<[T]> for RepeatedField<T> {
-    #[inline]
-    fn borrow(&self) -> &[T] {
-        &self.vec[..self.len]
-    }
-}
-
-impl<T> Deref for RepeatedField<T> {
-    type Target = [T];
-    #[inline]
-    fn deref(&self) -> &[T] {
-        &self.vec[..self.len]
-    }
-}
-
-impl<T> DerefMut for RepeatedField<T> {
-    #[inline]
-    fn deref_mut(&mut self) -> &mut [T] {
-        &mut self.vec[..self.len]
-    }
-}
-
-impl<T> Index<usize> for RepeatedField<T> {
-    type Output = T;
-
-    #[inline]
-    fn index<'a>(&'a self, index: usize) -> &'a T {
-        &self.as_ref()[index]
-    }
-}
-
-impl<T> IndexMut<usize> for RepeatedField<T> {
-    #[inline]
-    fn index_mut<'a>(&'a mut self, index: usize) -> &'a mut T {
-        &mut self.as_mut_slice()[index]
-    }
-}
-
-impl<T> Extend<T> for RepeatedField<T> {
-    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
-        self.vec.truncate(self.len);
-        self.vec.extend(iter);
-        self.len = self.vec.len();
-    }
-}
-
-impl<'a, T: Copy + 'a> Extend<&'a T> for RepeatedField<T> {
-    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
-        self.vec.truncate(self.len);
-        self.vec.extend(iter);
-        self.len = self.vec.len();
-    }
-}
-
-impl<T: fmt::Debug> fmt::Debug for RepeatedField<T> {
-    #[inline]
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        self.as_ref().fmt(f)
-    }
-}
-
-#[cfg(feature = "with-serde")]
-impl<T: serde::Serialize> serde::Serialize for RepeatedField<T> {
-    fn serialize<S>(
-        &self,
-        serializer: S,
-    ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error>
-    where
-        S: serde::Serializer,
-    {
-        self.as_ref().serialize(serializer)
-    }
-}
-
-#[cfg(feature = "with-serde")]
-impl<'de, T: serde::Deserialize<'de> + Default> serde::Deserialize<'de> for RepeatedField<T> {
-    fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        Vec::deserialize(deserializer).map(RepeatedField::from)
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::RepeatedField;
-
-    #[test]
-    fn as_mut_slice() {
-        let mut v = RepeatedField::new();
-        v.push(10);
-        v.push(20);
-        v.clear();
-        assert_eq!(v.as_mut_slice(), &mut []);
-        v.push(30);
-        assert_eq!(v.as_mut_slice(), &mut [30]);
-    }
-
-    #[test]
-    fn push_default() {
-        let mut v = RepeatedField::new();
-        v.push("aa".to_string());
-        v.push("bb".to_string());
-        v.clear();
-        assert_eq!("".to_string(), *v.push_default());
-    }
-
-    #[test]
-    fn extend_values() {
-        let mut r = RepeatedField::new();
-        r.push(10);
-        r.push(20);
-        r.clear();
-        // self-check
-        assert_eq!(2, r.vec.len());
-        r.extend(vec![30, 40]);
-        assert_eq!(&[30, 40][..], &r);
-    }
-
-    #[test]
-    fn extend_copy() {
-        let mut r = RepeatedField::new();
-        r.push(10);
-        r.push(20);
-        r.clear();
-        // self-check
-        assert_eq!(2, r.vec.len());
-        r.extend(&[30, 40]);
-        assert_eq!(&[30, 40][..], &r);
-    }
-}
diff --git a/src/rt.rs b/src/rt.rs
deleted file mode 100644
index fca1254..0000000
--- a/src/rt.rs
+++ /dev/null
@@ -1,929 +0,0 @@
-//! Functions used by generated protobuf code.
-//! Should not be used by programs written by hands.
-
-use std::collections::HashMap;
-use std::default::Default;
-use std::hash::Hash;
-
-#[cfg(feature = "bytes")]
-use bytes::Bytes;
-
-#[cfg(feature = "bytes")]
-use crate::chars::Chars;
-use crate::coded_input_stream::CodedInputStream;
-use crate::coded_output_stream::CodedOutputStream;
-use crate::enums::ProtobufEnum;
-use crate::error::ProtobufError;
-use crate::error::ProtobufResult;
-use crate::error::WireError;
-pub use crate::lazy_v2::LazyV2;
-use crate::message::*;
-use crate::repeated::RepeatedField;
-use crate::singular::SingularField;
-use crate::singular::SingularPtrField;
-use crate::types::*;
-use crate::unknown::UnknownFields;
-use crate::wire_format;
-use crate::wire_format::WireType;
-use crate::zigzag::*;
-
-/// Given `u64` value compute varint encoded length.
-pub fn compute_raw_varint64_size(value: u64) -> u32 {
-    if (value & (0xffffffffffffffffu64 << 7)) == 0 {
-        return 1;
-    }
-    if (value & (0xffffffffffffffffu64 << 14)) == 0 {
-        return 2;
-    }
-    if (value & (0xffffffffffffffffu64 << 21)) == 0 {
-        return 3;
-    }
-    if (value & (0xffffffffffffffffu64 << 28)) == 0 {
-        return 4;
-    }
-    if (value & (0xffffffffffffffffu64 << 35)) == 0 {
-        return 5;
-    }
-    if (value & (0xffffffffffffffffu64 << 42)) == 0 {
-        return 6;
-    }
-    if (value & (0xffffffffffffffffu64 << 49)) == 0 {
-        return 7;
-    }
-    if (value & (0xffffffffffffffffu64 << 56)) == 0 {
-        return 8;
-    }
-    if (value & (0xffffffffffffffffu64 << 63)) == 0 {
-        return 9;
-    }
-    10
-}
-
-/// Given `u32` value compute varint encoded length.
-pub fn compute_raw_varint32_size(value: u32) -> u32 {
-    compute_raw_varint64_size(value as u64)
-}
-
-/// Helper trait implemented by integer types which could be encoded as varint.
-pub trait ProtobufVarint {
-    /// Size of self when encoded as varint.
-    fn len_varint(&self) -> u32;
-}
-
-/// Helper trait implemented by integer types which could be encoded as zigzag varint.
-pub trait ProtobufVarintZigzag {
-    /// Size of self when encoded as zigzag varint.
-    fn len_varint_zigzag(&self) -> u32;
-}
-
-impl ProtobufVarint for u64 {
-    fn len_varint(&self) -> u32 {
-        compute_raw_varint64_size(*self)
-    }
-}
-
-impl ProtobufVarint for u32 {
-    fn len_varint(&self) -> u32 {
-        (*self as u64).len_varint()
-    }
-}
-
-impl ProtobufVarint for i64 {
-    fn len_varint(&self) -> u32 {
-        // same as length of u64
-        (*self as u64).len_varint()
-    }
-}
-
-impl ProtobufVarintZigzag for i64 {
-    fn len_varint_zigzag(&self) -> u32 {
-        compute_raw_varint64_size(encode_zig_zag_64(*self))
-    }
-}
-
-impl ProtobufVarint for i32 {
-    fn len_varint(&self) -> u32 {
-        // sign-extend and then compute
-        (*self as i64).len_varint()
-    }
-}
-
-impl ProtobufVarintZigzag for i32 {
-    fn len_varint_zigzag(&self) -> u32 {
-        compute_raw_varint32_size(encode_zig_zag_32(*self))
-    }
-}
-
-impl ProtobufVarint for bool {
-    fn len_varint(&self) -> u32 {
-        1
-    }
-}
-
-/* Commented out due to https://github.com/mozilla/rust/issues/8075
-impl<E:ProtobufEnum> ProtobufVarint for E {
-    fn len_varint(&self) -> u32 {
-        self.value().len_varint()
-    }
-}
-*/
-
-/// Size of serialized repeated packed field, excluding length and tag.
-pub fn vec_packed_varint_data_size<T: ProtobufVarint>(vec: &[T]) -> u32 {
-    vec.iter().map(|v| v.len_varint()).fold(0, |a, i| a + i)
-}
-
-/// Size of serialized repeated packed field, excluding length and tag.
-pub fn vec_packed_varint_zigzag_data_size<T: ProtobufVarintZigzag>(vec: &[T]) -> u32 {
-    vec.iter()
-        .map(|v| v.len_varint_zigzag())
-        .fold(0, |a, i| a + i)
-}
-
-/// Size of serialized repeated packed enum field, excluding length and tag.
-pub fn vec_packed_enum_data_size<E: ProtobufEnum>(vec: &[E]) -> u32 {
-    vec.iter()
-        .map(|e| compute_raw_varint32_size(e.value() as u32))
-        .fold(0, |a, i| a + i)
-}
-
-/// Size of serialized data with length prefix and tag
-pub fn vec_packed_varint_size<T: ProtobufVarint>(field_number: u32, vec: &[T]) -> u32 {
-    if vec.is_empty() {
-        0
-    } else {
-        let data_size = vec_packed_varint_data_size(vec);
-        tag_size(field_number) + data_size.len_varint() + data_size
-    }
-}
-
-/// Size of serialized data with length prefix and tag
-pub fn vec_packed_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, vec: &[T]) -> u32 {
-    if vec.is_empty() {
-        0
-    } else {
-        let data_size = vec_packed_varint_zigzag_data_size(vec);
-        tag_size(field_number) + data_size.len_varint() + data_size
-    }
-}
-
-/// Size of serialized data with length prefix and tag
-pub fn vec_packed_enum_size<E: ProtobufEnum>(field_number: u32, vec: &[E]) -> u32 {
-    if vec.is_empty() {
-        0
-    } else {
-        let data_size = vec_packed_enum_data_size(vec);
-        tag_size(field_number) + data_size.len_varint() + data_size
-    }
-}
-
-/// Compute tag size. Size of tag does not depend on wire type.
-pub fn tag_size(field_number: u32) -> u32 {
-    wire_format::Tag::make(field_number, WireType::WireTypeFixed64)
-        .value()
-        .len_varint()
-}
-
-fn value_size_no_tag<T: ProtobufVarint>(value: T, wt: WireType) -> u32 {
-    match wt {
-        WireType::WireTypeFixed64 => 8,
-        WireType::WireTypeFixed32 => 4,
-        WireType::WireTypeVarint => value.len_varint(),
-        _ => panic!(),
-    }
-}
-
-/// Integer value size when encoded as specified wire type.
-pub fn value_size<T: ProtobufVarint>(field_number: u32, value: T, wt: WireType) -> u32 {
-    tag_size(field_number) + value_size_no_tag(value, wt)
-}
-
-/// Integer value size when encoded as specified wire type.
-pub fn value_varint_zigzag_size_no_tag<T: ProtobufVarintZigzag>(value: T) -> u32 {
-    value.len_varint_zigzag()
-}
-
-/// Length of value when encoding with zigzag encoding with tag
-pub fn value_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, value: T) -> u32 {
-    tag_size(field_number) + value_varint_zigzag_size_no_tag(value)
-}
-
-fn enum_size_no_tag<E: ProtobufEnum>(value: E) -> u32 {
-    value.value().len_varint()
-}
-
-/// Size of encoded enum field value.
-pub fn enum_size<E: ProtobufEnum>(field_number: u32, value: E) -> u32 {
-    tag_size(field_number) + enum_size_no_tag(value)
-}
-
-fn bytes_size_no_tag(bytes: &[u8]) -> u32 {
-    compute_raw_varint64_size(bytes.len() as u64) + bytes.len() as u32
-}
-
-/// Size of encoded bytes field.
-pub fn bytes_size(field_number: u32, bytes: &[u8]) -> u32 {
-    tag_size(field_number) + bytes_size_no_tag(bytes)
-}
-
-fn string_size_no_tag(s: &str) -> u32 {
-    bytes_size_no_tag(s.as_bytes())
-}
-
-/// Size of encoded string field.
-pub fn string_size(field_number: u32, s: &str) -> u32 {
-    tag_size(field_number) + string_size_no_tag(s)
-}
-
-/// Size of encoded unknown fields size.
-pub fn unknown_fields_size(unknown_fields: &UnknownFields) -> u32 {
-    let mut r = 0;
-    for (number, values) in unknown_fields {
-        r += (tag_size(number) + 4) * values.fixed32.len() as u32;
-        r += (tag_size(number) + 8) * values.fixed64.len() as u32;
-
-        r += tag_size(number) * values.varint.len() as u32;
-        for varint in &values.varint {
-            r += varint.len_varint();
-        }
-
-        r += tag_size(number) * values.length_delimited.len() as u32;
-        for bytes in &values.length_delimited {
-            r += bytes_size_no_tag(&bytes);
-        }
-    }
-    r
-}
-
-/// Read repeated `int32` field into given vec.
-pub fn read_repeated_int32_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<i32>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_int32_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_int32()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `int64` field into given vec.
-pub fn read_repeated_int64_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<i64>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_int64_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_int64()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `uint32` field into given vec.
-pub fn read_repeated_uint32_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<u32>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_uint32_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_uint32()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `uint64` field into given vec.
-pub fn read_repeated_uint64_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<u64>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_uint64_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_uint64()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `sint32` field into given vec.
-pub fn read_repeated_sint32_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<i32>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_sint32_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_sint32()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `sint64` field into given vec.
-pub fn read_repeated_sint64_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<i64>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_sint64_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_sint64()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `fixed32` field into given vec.
-pub fn read_repeated_fixed32_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<u32>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_fixed32_into(target),
-        WireType::WireTypeFixed32 => {
-            target.push(is.read_fixed32()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `fixed64` field into given vec.
-pub fn read_repeated_fixed64_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<u64>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_fixed64_into(target),
-        WireType::WireTypeFixed64 => {
-            target.push(is.read_fixed64()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `sfixed32` field into given vec.
-pub fn read_repeated_sfixed32_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<i32>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_sfixed32_into(target),
-        WireType::WireTypeFixed32 => {
-            target.push(is.read_sfixed32()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `sfixed64` field into given vec.
-pub fn read_repeated_sfixed64_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<i64>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_sfixed64_into(target),
-        WireType::WireTypeFixed64 => {
-            target.push(is.read_sfixed64()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `double` field into given vec.
-pub fn read_repeated_double_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<f64>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_double_into(target),
-        WireType::WireTypeFixed64 => {
-            target.push(is.read_double()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `float` field into given vec.
-pub fn read_repeated_float_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<f32>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_float_into(target),
-        WireType::WireTypeFixed32 => {
-            target.push(is.read_float()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `bool` field into given vec.
-pub fn read_repeated_bool_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<bool>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_bool_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_bool()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `enum` field into given vec.
-/// This function is no longer called from generated code, remove in 1.5.
-pub fn read_repeated_enum_into<E: ProtobufEnum>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<E>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_repeated_packed_enum_into(target),
-        WireType::WireTypeVarint => {
-            target.push(is.read_enum()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Helper function to read single enum value.
-#[inline]
-fn read_enum_with_unknown_fields_into<E: ProtobufEnum, C>(
-    is: &mut CodedInputStream,
-    target: C,
-    field_number: u32,
-    unknown_fields: &mut UnknownFields,
-) -> ProtobufResult<()>
-where
-    C: FnOnce(E),
-{
-    let i = is.read_int32()?;
-    match ProtobufEnum::from_i32(i) {
-        Some(e) => target(e),
-        None => unknown_fields.add_varint(field_number, i as i64 as u64),
-    }
-    Ok(())
-}
-
-fn read_repeated_packed_enum_with_unknown_fields_into<E: ProtobufEnum>(
-    is: &mut CodedInputStream,
-    target: &mut Vec<E>,
-    field_number: u32,
-    unknown_fields: &mut UnknownFields,
-) -> ProtobufResult<()> {
-    let len = is.read_raw_varint64()?;
-    let old_limit = is.push_limit(len)?;
-    while !is.eof()? {
-        read_enum_with_unknown_fields_into(is, |e| target.push(e), field_number, unknown_fields)?;
-    }
-    is.pop_limit(old_limit);
-    Ok(())
-}
-
-/// Read repeated `enum` field into given vec,
-/// and when value is unknown store it in unknown fields
-/// which matches proto2 spec.
-///
-/// See explanation
-/// [here](https://github.com/stepancheg/rust-protobuf/issues/233#issuecomment-375142710)
-pub fn read_repeated_enum_with_unknown_fields_into<E: ProtobufEnum>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<E>,
-    field_number: u32,
-    unknown_fields: &mut UnknownFields,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => read_repeated_packed_enum_with_unknown_fields_into(
-            is,
-            target,
-            field_number,
-            unknown_fields,
-        ),
-        WireType::WireTypeVarint => {
-            read_enum_with_unknown_fields_into(is, |e| target.push(e), field_number, unknown_fields)
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `enum` field into given vec,
-/// and when value is unknown store it in unknown fields
-/// which matches proto2 spec.
-///
-/// See explanation
-/// [here](https://github.com/stepancheg/rust-protobuf/issues/233#issuecomment-375142710)
-pub fn read_proto3_enum_with_unknown_fields_into<E: ProtobufEnum>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut E,
-    field_number: u32,
-    unknown_fields: &mut UnknownFields,
-) -> ProtobufResult<()> {
-    if wire_type != WireType::WireTypeVarint {
-        return Err(unexpected_wire_type(wire_type));
-    }
-
-    read_enum_with_unknown_fields_into(is, |e| *target = e, field_number, unknown_fields)
-}
-
-/// Read repeated `enum` field into given vec,
-/// and when value is unknown store it in unknown fields
-/// which matches proto2 spec.
-///
-/// See explanation
-/// [here](https://github.com/stepancheg/rust-protobuf/issues/233#issuecomment-375142710)
-pub fn read_proto2_enum_with_unknown_fields_into<E: ProtobufEnum>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Option<E>,
-    field_number: u32,
-    unknown_fields: &mut UnknownFields,
-) -> ProtobufResult<()> {
-    if wire_type != WireType::WireTypeVarint {
-        return Err(unexpected_wire_type(wire_type));
-    }
-
-    read_enum_with_unknown_fields_into(is, |e| *target = Some(e), field_number, unknown_fields)
-}
-
-/// Read repeated `string` field into given vec.
-pub fn read_repeated_string_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut RepeatedField<String>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            let tmp = target.push_default();
-            is.read_string_into(tmp)
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `Chars` field into given vec.
-#[cfg(feature = "bytes")]
-pub fn read_repeated_carllerche_string_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<Chars>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            target.push(is.read_carllerche_chars()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `string` field.
-pub fn read_singular_string_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut SingularField<String>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            let tmp = target.set_default();
-            is.read_string_into(tmp)
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `Chars` field.
-#[cfg(feature = "bytes")]
-pub fn read_singular_carllerche_string_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Option<Chars>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            *target = Some(is.read_carllerche_chars()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `string` field for proto3.
-pub fn read_singular_proto3_string_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut String,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_string_into(target),
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `Chars` field for proto3.
-#[cfg(feature = "bytes")]
-pub fn read_singular_proto3_carllerche_string_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Chars,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            *target = is.read_carllerche_chars()?;
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `bytes` field into given vec.
-pub fn read_repeated_bytes_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut RepeatedField<Vec<u8>>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            let tmp = target.push_default();
-            is.read_bytes_into(tmp)
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `Bytes` field into given vec.
-#[cfg(feature = "bytes")]
-pub fn read_repeated_carllerche_bytes_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<Bytes>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            target.push(is.read_carllerche_bytes()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `bytes` field.
-pub fn read_singular_bytes_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut SingularField<Vec<u8>>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            let tmp = target.set_default();
-            is.read_bytes_into(tmp)
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `Bytes` field.
-#[cfg(feature = "bytes")]
-pub fn read_singular_carllerche_bytes_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Option<Bytes>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            *target = Some(is.read_carllerche_bytes()?);
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `bytes` field for proto3.
-pub fn read_singular_proto3_bytes_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Vec<u8>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => is.read_bytes_into(target),
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `Bytes` field for proto3.
-#[cfg(feature = "bytes")]
-pub fn read_singular_proto3_carllerche_bytes_into(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut Bytes,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            *target = is.read_carllerche_bytes()?;
-            Ok(())
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read repeated `message` field.
-pub fn read_repeated_message_into<M: Message + Default>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut RepeatedField<M>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            is.incr_recursion()?;
-            let tmp = target.push_default();
-            let res = is.merge_message(tmp);
-            is.decr_recursion();
-            res
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-/// Read singular `message` field.
-pub fn read_singular_message_into<M: Message + Default>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut SingularPtrField<M>,
-) -> ProtobufResult<()> {
-    match wire_type {
-        WireType::WireTypeLengthDelimited => {
-            is.incr_recursion()?;
-            let tmp = target.set_default();
-            let res = is.merge_message(tmp);
-            is.decr_recursion();
-            res
-        }
-        _ => Err(unexpected_wire_type(wire_type)),
-    }
-}
-
-fn skip_group(is: &mut CodedInputStream) -> ProtobufResult<()> {
-    loop {
-        let (_, wire_type) = is.read_tag_unpack()?;
-        if wire_type == wire_format::WireTypeEndGroup {
-            return Ok(());
-        }
-        is.skip_field(wire_type)?;
-    }
-}
-
-/// Handle unknown field in generated code.
-/// Either store a value in unknown, or skip a group.
-pub fn read_unknown_or_skip_group(
-    field_number: u32,
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    unknown_fields: &mut UnknownFields,
-) -> ProtobufResult<()> {
-    match wire_type {
-        wire_format::WireTypeStartGroup => skip_group(is),
-        _ => {
-            let unknown = is.read_unknown(wire_type)?;
-            unknown_fields.add_value(field_number, unknown);
-            Ok(())
-        }
-    }
-}
-
-/// Create an error for unexpected wire type.
-///
-/// Function is used in generated code, so error types can be changed,
-/// but this function remains unchanged.
-pub fn unexpected_wire_type(wire_type: WireType) -> ProtobufError {
-    ProtobufError::WireError(WireError::UnexpectedWireType(wire_type))
-}
-
-/// Compute serialized size of `map` field and cache nested field sizes.
-pub fn compute_map_size<K, V>(field_number: u32, map: &HashMap<K::Value, V::Value>) -> u32
-where
-    K: ProtobufType,
-    V: ProtobufType,
-    K::Value: Eq + Hash,
-{
-    let mut sum = 0;
-    for (k, v) in map {
-        let key_tag_size = 1;
-        let value_tag_size = 1;
-
-        let key_len = K::compute_size_with_length_delimiter(k);
-        let value_len = V::compute_size_with_length_delimiter(v);
-
-        let entry_len = key_tag_size + key_len + value_tag_size + value_len;
-        sum += tag_size(field_number) + compute_raw_varint32_size(entry_len) + entry_len;
-    }
-    sum
-}
-
-/// Write map, message sizes must be already known.
-pub fn write_map_with_cached_sizes<K, V>(
-    field_number: u32,
-    map: &HashMap<K::Value, V::Value>,
-    os: &mut CodedOutputStream,
-) -> ProtobufResult<()>
-where
-    K: ProtobufType,
-    V: ProtobufType,
-    K::Value: Eq + Hash,
-{
-    for (k, v) in map {
-        let key_tag_size = 1;
-        let value_tag_size = 1;
-
-        let key_len = K::get_cached_size_with_length_delimiter(k);
-        let value_len = V::get_cached_size_with_length_delimiter(v);
-
-        let entry_len = key_tag_size + key_len + value_tag_size + value_len;
-
-        os.write_tag(field_number, WireType::WireTypeLengthDelimited)?;
-        os.write_raw_varint32(entry_len)?;
-        K::write_with_cached_size(1, k, os)?;
-        V::write_with_cached_size(2, v, os)?;
-    }
-    Ok(())
-}
-
-/// Read `map` field.
-pub fn read_map_into<K, V>(
-    wire_type: WireType,
-    is: &mut CodedInputStream,
-    target: &mut HashMap<K::Value, V::Value>,
-) -> ProtobufResult<()>
-where
-    K: ProtobufType,
-    V: ProtobufType,
-    K::Value: Eq + Hash + Default,
-    V::Value: Default,
-{
-    if wire_type != WireType::WireTypeLengthDelimited {
-        return Err(unexpected_wire_type(wire_type));
-    }
-
-    let mut key = Default::default();
-    let mut value = Default::default();
-
-    let len = is.read_raw_varint32()?;
-    let old_limit = is.push_limit(len as u64)?;
-    while !is.eof()? {
-        let (field_number, wire_type) = is.read_tag_unpack()?;
-        match field_number {
-            1 => {
-                if wire_type != K::wire_type() {
-                    return Err(unexpected_wire_type(wire_type));
-                }
-                key = K::read(is)?;
-            }
-            2 => {
-                if wire_type != V::wire_type() {
-                    return Err(unexpected_wire_type(wire_type));
-                }
-                value = V::read(is)?;
-            }
-            _ => is.skip_field(wire_type)?,
-        }
-    }
-    is.pop_limit(old_limit);
-
-    target.insert(key, value);
-
-    Ok(())
-}
diff --git a/src/rt/map.rs b/src/rt/map.rs
new file mode 100644
index 0000000..0693a2b
--- /dev/null
+++ b/src/rt/map.rs
@@ -0,0 +1,35 @@
+use crate::error::WireError;
+use crate::wire_format::WireType;
+use crate::CodedInputStream;
+
+pub(crate) fn read_map_template_new(
+    is: &mut CodedInputStream,
+    mut key: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
+    mut value: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
+) -> crate::Result<()> {
+    let len = is.read_raw_varint32()?;
+    let old_limit = is.push_limit(len as u64)?;
+    while !is.eof()? {
+        let (field_number, wire_type) = is.read_tag_unpack()?;
+        match field_number {
+            1 => key(wire_type, is)?,
+            2 => value(wire_type, is)?,
+            _ => is.skip_field(wire_type)?,
+        }
+    }
+    is.pop_limit(old_limit);
+    Ok(())
+}
+
+pub(crate) fn read_map_template(
+    wire_type: WireType,
+    is: &mut CodedInputStream,
+    key: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
+    value: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
+) -> crate::Result<()> {
+    if wire_type != WireType::LengthDelimited {
+        return Err(WireError::UnexpectedWireType(wire_type).into());
+    }
+
+    read_map_template_new(is, key, value)
+}
diff --git a/src/rt/message.rs b/src/rt/message.rs
new file mode 100644
index 0000000..89434c0
--- /dev/null
+++ b/src/rt/message.rs
@@ -0,0 +1,33 @@
+use crate::wire_format::WireType;
+use crate::CodedInputStream;
+use crate::CodedOutputStream;
+use crate::Message;
+use crate::MessageField;
+
+/// Read singular `message` field.
+pub fn read_singular_message_into_field<M>(
+    is: &mut CodedInputStream,
+    target: &mut MessageField<M>,
+) -> crate::Result<()>
+where
+    M: Message,
+{
+    let mut m = M::new();
+    is.merge_message(&mut m)?;
+    *target = MessageField::some(m);
+    Ok(())
+}
+
+/// Write message with field number and length to the stream.
+pub fn write_message_field_with_cached_size<M>(
+    field_number: u32,
+    message: &M,
+    os: &mut CodedOutputStream,
+) -> crate::Result<()>
+where
+    M: Message,
+{
+    os.write_tag(field_number, WireType::LengthDelimited)?;
+    os.write_raw_varint32(message.cached_size())?;
+    message.write_to_with_cached_sizes(os)
+}
diff --git a/src/rt/mod.rs b/src/rt/mod.rs
new file mode 100644
index 0000000..90db0eb
--- /dev/null
+++ b/src/rt/mod.rs
@@ -0,0 +1,62 @@
+//! # Functions and types used by generated protobuf code
+//!
+//! These are not considered to be public API of rust-protobuf,
+//! so they can be changed any time (provided compatibility with
+//! previously generated code is preserved).
+
+pub(crate) mod map;
+mod message;
+pub(crate) mod packed;
+pub(crate) mod repeated;
+pub(crate) mod singular;
+pub(crate) mod unknown_or_group;
+
+pub use message::read_singular_message_into_field;
+pub use message::write_message_field_with_cached_size;
+pub use packed::vec_packed_bool_size;
+pub use packed::vec_packed_double_size;
+pub use packed::vec_packed_enum_or_unknown_size;
+pub use packed::vec_packed_fixed32_size;
+pub use packed::vec_packed_fixed64_size;
+pub use packed::vec_packed_float_size;
+pub use packed::vec_packed_int32_size;
+pub use packed::vec_packed_int64_size;
+pub use packed::vec_packed_sfixed32_size;
+pub use packed::vec_packed_sfixed64_size;
+pub use packed::vec_packed_sint32_size;
+pub use packed::vec_packed_sint64_size;
+pub use packed::vec_packed_uint32_size;
+pub use packed::vec_packed_uint64_size;
+pub use repeated::read_repeated_packed_enum_or_unknown_into;
+pub use singular::bytes_size;
+pub use singular::int32_size;
+pub use singular::int64_size;
+pub use singular::sint32_size;
+pub use singular::sint64_size;
+pub use singular::string_size;
+pub use singular::uint32_size;
+pub use singular::uint64_size;
+pub use unknown_or_group::read_unknown_or_skip_group;
+pub use unknown_or_group::skip_field_for_tag;
+pub use unknown_or_group::unknown_fields_size;
+
+pub use crate::cached_size::CachedSize;
+pub use crate::lazy::Lazy;
+use crate::varint::encode::encoded_varint64_len;
+pub use crate::wire_format::WireType;
+
+/// Given `u64` value compute varint encoded length.
+pub fn compute_raw_varint64_size(value: u64) -> u64 {
+    encoded_varint64_len(value) as u64
+}
+
+/// Given `u32` value compute varint encoded length.
+pub(crate) fn compute_raw_varint32_size(value: u32) -> u64 {
+    compute_raw_varint64_size(value as u64)
+}
+
+/// Compute tag size. Size of tag does not depend on wire type.
+#[inline]
+pub fn tag_size(field_number: u32) -> u64 {
+    encoded_varint64_len((field_number as u64) << 3) as u64
+}
diff --git a/src/rt/packed.rs b/src/rt/packed.rs
new file mode 100644
index 0000000..d7132d4
--- /dev/null
+++ b/src/rt/packed.rs
@@ -0,0 +1,154 @@
+use crate::fixed::ProtobufFixed;
+use crate::rt::compute_raw_varint32_size;
+use crate::rt::tag_size;
+use crate::varint::generic::ProtobufVarint;
+use crate::zigzag::ProtobufVarintZigzag;
+use crate::Enum;
+use crate::EnumOrUnknown;
+
+/// Size of serialized repeated packed field, excluding length and tag.
+pub(crate) fn vec_packed_varint_data_size<T: ProtobufVarint>(vec: &[T]) -> u64 {
+    vec.iter().map(|v| v.len_varint() as u64).sum()
+}
+
+/// Size of serialized repeated packed field, excluding length and tag.
+pub(crate) fn vec_packed_varint_zigzag_data_size<T: ProtobufVarintZigzag>(vec: &[T]) -> u64 {
+    vec.iter().map(|v| v.len_varint_zigzag()).sum()
+}
+
+/// Size of serialized repeated packed enum field, excluding length and tag.
+pub(crate) fn vec_packed_enum_or_unknown_data_size<E: Enum>(vec: &[EnumOrUnknown<E>]) -> u64 {
+    vec.iter()
+        .map(|e| compute_raw_varint32_size(e.value() as u32))
+        .sum()
+}
+
+/// Size of serialized data with length prefix and tag
+#[inline]
+fn vec_packed_varint_size<T: ProtobufVarint>(field_number: u32, vec: &[T]) -> u64 {
+    if vec.is_empty() {
+        0
+    } else {
+        let data_size = vec_packed_varint_data_size(vec);
+        tag_size(field_number) + data_size.len_varint() + data_size
+    }
+}
+
+/// Size of serialized data with length prefix and tag.
+#[inline]
+pub fn vec_packed_int32_size(field_number: u32, vec: &[i32]) -> u64 {
+    vec_packed_varint_size(field_number, vec)
+}
+
+/// Size of serialized data with length prefix and tag.
+#[inline]
+pub fn vec_packed_int64_size(field_number: u32, vec: &[i64]) -> u64 {
+    vec_packed_varint_size(field_number, vec)
+}
+
+/// Size of serialized data with length prefix and tag.
+#[inline]
+pub fn vec_packed_uint32_size(field_number: u32, vec: &[u32]) -> u64 {
+    vec_packed_varint_size(field_number, vec)
+}
+
+/// Size of serialized data with length prefix and tag.
+#[inline]
+pub fn vec_packed_uint64_size(field_number: u32, vec: &[u64]) -> u64 {
+    vec_packed_varint_size(field_number, vec)
+}
+
+/// Size of serialized data with length prefix and tag
+#[inline]
+fn vec_packed_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, vec: &[T]) -> u64 {
+    if vec.is_empty() {
+        0
+    } else {
+        let data_size = vec_packed_varint_zigzag_data_size(vec);
+        tag_size(field_number) + data_size.len_varint() + data_size
+    }
+}
+
+/// Size of serialized data with length prefix and tag.
+#[inline]
+pub fn vec_packed_sint32_size(field_number: u32, vec: &[i32]) -> u64 {
+    vec_packed_varint_zigzag_size(field_number, vec)
+}
+
+/// Size of serialized data with length prefix and tag.
+#[inline]
+pub fn vec_packed_sint64_size(field_number: u32, vec: &[i64]) -> u64 {
+    vec_packed_varint_zigzag_size(field_number, vec)
+}
+
+/// Size of serialized data with length prefix and tag
+#[inline]
+pub fn vec_packed_enum_or_unknown_size<E: Enum>(
+    field_number: u32,
+    vec: &[EnumOrUnknown<E>],
+) -> u64 {
+    if vec.is_empty() {
+        0
+    } else {
+        let data_size = vec_packed_enum_or_unknown_data_size(vec);
+        tag_size(field_number) + data_size.len_varint() + data_size
+    }
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+pub(crate) fn vec_packed_fixed_data_size<V: ProtobufFixed>(vec: &[V]) -> u64 {
+    (vec.len() as u64) * (V::LEN as u64)
+}
+
+/// Compute field size (data plus header) of fixed encoding of repeated field.
+#[inline]
+fn vec_packed_fixed_size<V: ProtobufFixed>(field_number: u32, vec: &[V]) -> u64 {
+    if vec.is_empty() {
+        0
+    } else {
+        let data_size = vec_packed_fixed_data_size::<V>(vec);
+        tag_size(field_number) + data_size.len_varint() + data_size
+    }
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_fixed32_size(field_number: u32, vec: &[u32]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_fixed64_size(field_number: u32, vec: &[u64]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_sfixed32_size(field_number: u32, vec: &[i32]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_sfixed64_size(field_number: u32, vec: &[i64]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_float_size(field_number: u32, vec: &[f32]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_double_size(field_number: u32, vec: &[f64]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
+
+/// Compute data size of fixed encoding of repeated field data.
+#[inline]
+pub fn vec_packed_bool_size(field_number: u32, vec: &[bool]) -> u64 {
+    vec_packed_fixed_size(field_number, vec)
+}
diff --git a/src/rt/repeated.rs b/src/rt/repeated.rs
new file mode 100644
index 0000000..1af9994
--- /dev/null
+++ b/src/rt/repeated.rs
@@ -0,0 +1,17 @@
+use crate::CodedInputStream;
+use crate::Enum;
+use crate::EnumOrUnknown;
+
+/// Read repeated enum field when the wire format is length-delimited.
+pub fn read_repeated_packed_enum_or_unknown_into<E: Enum>(
+    is: &mut CodedInputStream,
+    target: &mut Vec<EnumOrUnknown<E>>,
+) -> crate::Result<()> {
+    let len = is.read_raw_varint64()?;
+    let old_limit = is.push_limit(len)?;
+    while !is.eof()? {
+        target.push(is.read_enum_or_unknown()?);
+    }
+    is.pop_limit(old_limit);
+    Ok(())
+}
diff --git a/src/rt/singular.rs b/src/rt/singular.rs
new file mode 100644
index 0000000..e607046
--- /dev/null
+++ b/src/rt/singular.rs
@@ -0,0 +1,79 @@
+use crate::rt::compute_raw_varint64_size;
+use crate::rt::tag_size;
+use crate::varint::generic::ProtobufVarint;
+use crate::zigzag::ProtobufVarintZigzag;
+
+/// Integer value size when encoded.
+#[inline]
+fn varint_size<T: ProtobufVarint>(field_number: u32, value: T) -> u64 {
+    tag_size(field_number) + value.len_varint()
+}
+
+/// Encoded `int32` size.
+#[inline]
+pub fn int32_size(field_number: u32, value: i32) -> u64 {
+    varint_size(field_number, value)
+}
+
+/// Encoded `int64` size.
+#[inline]
+pub fn int64_size(field_number: u32, value: i64) -> u64 {
+    varint_size(field_number, value)
+}
+
+/// Encoded `uint32` size.
+#[inline]
+pub fn uint32_size(field_number: u32, value: u32) -> u64 {
+    varint_size(field_number, value)
+}
+
+/// Encoded `uint64` size.
+#[inline]
+pub fn uint64_size(field_number: u32, value: u64) -> u64 {
+    varint_size(field_number, value)
+}
+
+/// Integer value size when encoded as specified wire type.
+pub(crate) fn value_varint_zigzag_size_no_tag<T: ProtobufVarintZigzag>(value: T) -> u64 {
+    value.len_varint_zigzag()
+}
+
+/// Length of value when encoding with zigzag encoding with tag
+#[inline]
+fn value_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, value: T) -> u64 {
+    tag_size(field_number) + value_varint_zigzag_size_no_tag(value)
+}
+
+/// Size of serialized `sint32` field.
+#[inline]
+pub fn sint32_size(field_number: u32, value: i32) -> u64 {
+    value_varint_zigzag_size(field_number, value)
+}
+
+/// Size of serialized `sint64` field.
+#[inline]
+pub fn sint64_size(field_number: u32, value: i64) -> u64 {
+    value_varint_zigzag_size(field_number, value)
+}
+
+/// Size of encoded bytes field.
+pub(crate) fn bytes_size_no_tag(bytes: &[u8]) -> u64 {
+    compute_raw_varint64_size(bytes.len() as u64) + bytes.len() as u64
+}
+
+/// Size of encoded bytes field.
+#[inline]
+pub fn bytes_size(field_number: u32, bytes: &[u8]) -> u64 {
+    tag_size(field_number) + bytes_size_no_tag(bytes)
+}
+
+/// Size of encoded string field.
+pub(crate) fn string_size_no_tag(s: &str) -> u64 {
+    bytes_size_no_tag(s.as_bytes())
+}
+
+/// Size of encoded string field.
+#[inline]
+pub fn string_size(field_number: u32, s: &str) -> u64 {
+    tag_size(field_number) + string_size_no_tag(s)
+}
diff --git a/src/rt/unknown_or_group.rs b/src/rt/unknown_or_group.rs
new file mode 100644
index 0000000..33e6882
--- /dev/null
+++ b/src/rt/unknown_or_group.rs
@@ -0,0 +1,69 @@
+use crate::rt::compute_raw_varint64_size;
+use crate::rt::singular::bytes_size_no_tag;
+use crate::rt::tag_size;
+use crate::wire_format::Tag;
+use crate::wire_format::WireType;
+use crate::CodedInputStream;
+use crate::UnknownFields;
+use crate::UnknownValueRef;
+
+fn skip_group(is: &mut CodedInputStream) -> crate::Result<()> {
+    loop {
+        let (_, wire_type) = is.read_tag_unpack()?;
+        if wire_type == WireType::EndGroup {
+            return Ok(());
+        }
+        is.skip_field(wire_type)?;
+    }
+}
+
+/// Size of encoded unknown fields size.
+pub fn unknown_fields_size(unknown_fields: &UnknownFields) -> u64 {
+    let mut r = 0;
+    for (number, value) in unknown_fields {
+        r += tag_size(number);
+        r += match value {
+            UnknownValueRef::Fixed32(_) => 4,
+            UnknownValueRef::Fixed64(_) => 8,
+            UnknownValueRef::Varint(v) => compute_raw_varint64_size(v),
+            UnknownValueRef::LengthDelimited(v) => bytes_size_no_tag(v),
+        };
+    }
+    r
+}
+
+/// Handle unknown field in generated code.
+/// Either store a value in unknown, or skip a group.
+pub(crate) fn read_unknown_or_skip_group_with_tag_unpacked(
+    field_number: u32,
+    wire_type: WireType,
+    is: &mut CodedInputStream,
+    unknown_fields: &mut UnknownFields,
+) -> crate::Result<()> {
+    match wire_type {
+        WireType::StartGroup => skip_group(is),
+        _ => {
+            let unknown = is.read_unknown(wire_type)?;
+            unknown_fields.add_value(field_number, unknown);
+            Ok(())
+        }
+    }
+}
+
+/// Handle unknown field in generated code.
+/// Either store a value in unknown, or skip a group.
+/// Return error if tag is incorrect.
+pub fn read_unknown_or_skip_group(
+    tag: u32,
+    is: &mut CodedInputStream,
+    unknown_fields: &mut UnknownFields,
+) -> crate::Result<()> {
+    let (field_humber, wire_type) = Tag::new(tag)?.unpack();
+    read_unknown_or_skip_group_with_tag_unpacked(field_humber, wire_type, is, unknown_fields)
+}
+
+/// Skip field.
+pub fn skip_field_for_tag(tag: u32, is: &mut CodedInputStream) -> crate::Result<()> {
+    let (_field_humber, wire_type) = Tag::new(tag)?.unpack();
+    is.skip_field(wire_type)
+}
diff --git a/src/rust.rs b/src/rust.rs
deleted file mode 100644
index 9d4995b..0000000
--- a/src/rust.rs
+++ /dev/null
@@ -1,121 +0,0 @@
-#[cfg_attr(rustfmt, rustfmt_skip)]
-static RUST_KEYWORDS: &'static [&'static str] = &[
-    "as",
-    "async",
-    "await",
-    "break",
-    "crate",
-    "dyn",
-    "else",
-    "enum",
-    "extern",
-    "false",
-    "fn",
-    "for",
-    "if",
-    "impl",
-    "in",
-    "let",
-    "loop",
-    "match",
-    "mod",
-    "move",
-    "mut",
-    "pub",
-    "ref",
-    "return",
-    "static",
-    "self",
-    "Self",
-    "struct",
-    "super",
-    "true",
-    "trait",
-    "type",
-    "unsafe",
-    "use",
-    "while",
-    "continue",
-    "box",
-    "const",
-    "where",
-    "virtual",
-    "proc",
-    "alignof",
-    "become",
-    "offsetof",
-    "priv",
-    "pure",
-    "sizeof",
-    "typeof",
-    "unsized",
-    "yield",
-    "do",
-    "abstract",
-    "final",
-    "override",
-    "macro",
-];
-
-pub fn is_rust_keyword(ident: &str) -> bool {
-    RUST_KEYWORDS.contains(&ident)
-}
-
-fn hex_digit(value: u32) -> char {
-    if value < 10 {
-        (b'0' + value as u8) as char
-    } else if value < 0x10 {
-        (b'a' + value as u8 - 10) as char
-    } else {
-        unreachable!()
-    }
-}
-
-pub fn quote_escape_str(s: &str) -> String {
-    let mut buf = String::new();
-    buf.push('"');
-    buf.extend(s.chars().flat_map(|c| c.escape_default()));
-    buf.push('"');
-    buf
-}
-
-pub fn quote_escape_bytes(bytes: &[u8]) -> String {
-    let mut buf = String::new();
-    buf.push('b');
-    buf.push('"');
-    for &b in bytes {
-        match b {
-            b'\n' => buf.push_str(r"\n"),
-            b'\r' => buf.push_str(r"\r"),
-            b'\t' => buf.push_str(r"\t"),
-            b'"' => buf.push_str("\\\""),
-            b'\\' => buf.push_str(r"\\"),
-            b'\x20'..=b'\x7e' => buf.push(b as char),
-            _ => {
-                buf.push_str(r"\x");
-                buf.push(hex_digit((b as u32) >> 4));
-                buf.push(hex_digit((b as u32) & 0x0f));
-            }
-        }
-    }
-    buf.push('"');
-    buf
-}
-
-#[cfg(test)]
-mod test {
-
-    use super::*;
-
-    #[test]
-    fn test_quote_escape_bytes() {
-        assert_eq!("b\"\"", quote_escape_bytes(b""));
-        assert_eq!("b\"xyZW\"", quote_escape_bytes(b"xyZW"));
-        assert_eq!("b\"aa\\\"bb\"", quote_escape_bytes(b"aa\"bb"));
-        assert_eq!("b\"aa\\r\\n\\tbb\"", quote_escape_bytes(b"aa\r\n\tbb"));
-        assert_eq!(
-            "b\"\\x00\\x01\\x12\\xfe\\xff\"",
-            quote_escape_bytes(b"\x00\x01\x12\xfe\xff")
-        );
-    }
-}
diff --git a/src/rustproto.rs b/src/rustproto.rs
index 75df067..2c22af1 100644
--- a/src/rustproto.rs
+++ b/src/rustproto.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,189 +16,155 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `rustproto.proto`
 
 /// Extension fields
 pub mod exts {
 
-    pub const expose_oneof_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17001, phantom: ::std::marker::PhantomData };
+    pub const generate_accessors_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, bool> = crate::ext::ExtFieldOptional::new(17004, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const expose_fields_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17003, phantom: ::std::marker::PhantomData };
+    pub const generate_getter_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, bool> = crate::ext::ExtFieldOptional::new(17005, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const generate_accessors_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17004, phantom: ::std::marker::PhantomData };
+    pub const tokio_bytes_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, bool> = crate::ext::ExtFieldOptional::new(17011, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const carllerche_bytes_for_bytes_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17011, phantom: ::std::marker::PhantomData };
+    pub const tokio_bytes_for_string_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, bool> = crate::ext::ExtFieldOptional::new(17012, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const carllerche_bytes_for_string_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17012, phantom: ::std::marker::PhantomData };
+    pub const lite_runtime_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, bool> = crate::ext::ExtFieldOptional::new(17035, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const serde_derive_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17030, phantom: ::std::marker::PhantomData };
+    pub const generate_accessors: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, bool> = crate::ext::ExtFieldOptional::new(17004, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const serde_derive_cfg_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeString> = crate::ext::ExtFieldOptional { field_number: 17031, phantom: ::std::marker::PhantomData };
+    pub const generate_getter: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, bool> = crate::ext::ExtFieldOptional::new(17005, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const lite_runtime_all: crate::ext::ExtFieldOptional<crate::descriptor::FileOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17035, phantom: ::std::marker::PhantomData };
+    pub const tokio_bytes: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, bool> = crate::ext::ExtFieldOptional::new(17011, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const expose_oneof: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17001, phantom: ::std::marker::PhantomData };
+    pub const tokio_bytes_for_string: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, bool> = crate::ext::ExtFieldOptional::new(17012, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const expose_fields: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17003, phantom: ::std::marker::PhantomData };
+    pub const generate_accessors_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, bool> = crate::ext::ExtFieldOptional::new(17004, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const generate_accessors: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17004, phantom: ::std::marker::PhantomData };
+    pub const generate_getter_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, bool> = crate::ext::ExtFieldOptional::new(17005, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const carllerche_bytes_for_bytes: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17011, phantom: ::std::marker::PhantomData };
+    pub const tokio_bytes_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, bool> = crate::ext::ExtFieldOptional::new(17011, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 
-    pub const carllerche_bytes_for_string: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17012, phantom: ::std::marker::PhantomData };
-
-    pub const serde_derive: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17030, phantom: ::std::marker::PhantomData };
-
-    pub const serde_derive_cfg: crate::ext::ExtFieldOptional<crate::descriptor::MessageOptions, crate::types::ProtobufTypeString> = crate::ext::ExtFieldOptional { field_number: 17031, phantom: ::std::marker::PhantomData };
-
-    pub const expose_fields_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17003, phantom: ::std::marker::PhantomData };
-
-    pub const generate_accessors_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17004, phantom: ::std::marker::PhantomData };
-
-    pub const carllerche_bytes_for_bytes_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17011, phantom: ::std::marker::PhantomData };
-
-    pub const carllerche_bytes_for_string_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, crate::types::ProtobufTypeBool> = crate::ext::ExtFieldOptional { field_number: 17012, phantom: ::std::marker::PhantomData };
-
-    pub const serde_rename_all: crate::ext::ExtFieldOptional<crate::descriptor::EnumOptions, crate::types::ProtobufTypeString> = crate::ext::ExtFieldOptional { field_number: 17032, phantom: ::std::marker::PhantomData };
+    pub const tokio_bytes_for_string_field: crate::ext::ExtFieldOptional<crate::descriptor::FieldOptions, bool> = crate::ext::ExtFieldOptional::new(17012, crate::descriptor::field_descriptor_proto::Type::TYPE_BOOL);
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
     \n\x0frustproto.proto\x12\trustproto\x1a\x20google/protobuf/descriptor.p\
-    roto:H\n\x10expose_oneof_all\x18\xe9\x84\x01\x20\x01(\x08\x12\x1c.google\
-    .protobuf.FileOptionsR\x0eexposeOneofAll:J\n\x11expose_fields_all\x18\
-    \xeb\x84\x01\x20\x01(\x08\x12\x1c.google.protobuf.FileOptionsR\x0fexpose\
-    FieldsAll:T\n\x16generate_accessors_all\x18\xec\x84\x01\x20\x01(\x08\x12\
-    \x1c.google.protobuf.FileOptionsR\x14generateAccessorsAll:b\n\x1ecarller\
-    che_bytes_for_bytes_all\x18\xf3\x84\x01\x20\x01(\x08\x12\x1c.google.prot\
-    obuf.FileOptionsR\x1acarllercheBytesForBytesAll:d\n\x1fcarllerche_bytes_\
-    for_string_all\x18\xf4\x84\x01\x20\x01(\x08\x12\x1c.google.protobuf.File\
-    OptionsR\x1bcarllercheBytesForStringAll:H\n\x10serde_derive_all\x18\x86\
-    \x85\x01\x20\x01(\x08\x12\x1c.google.protobuf.FileOptionsR\x0eserdeDeriv\
-    eAll:O\n\x14serde_derive_cfg_all\x18\x87\x85\x01\x20\x01(\t\x12\x1c.goog\
-    le.protobuf.FileOptionsR\x11serdeDeriveCfgAll:H\n\x10lite_runtime_all\
-    \x18\x8b\x85\x01\x20\x01(\x08\x12\x1c.google.protobuf.FileOptionsR\x0eli\
-    teRuntimeAll:D\n\x0cexpose_oneof\x18\xe9\x84\x01\x20\x01(\x08\x12\x1f.go\
-    ogle.protobuf.MessageOptionsR\x0bexposeOneof:F\n\rexpose_fields\x18\xeb\
-    \x84\x01\x20\x01(\x08\x12\x1f.google.protobuf.MessageOptionsR\x0cexposeF\
-    ields:P\n\x12generate_accessors\x18\xec\x84\x01\x20\x01(\x08\x12\x1f.goo\
-    gle.protobuf.MessageOptionsR\x11generateAccessors:^\n\x1acarllerche_byte\
-    s_for_bytes\x18\xf3\x84\x01\x20\x01(\x08\x12\x1f.google.protobuf.Message\
-    OptionsR\x17carllercheBytesForBytes:`\n\x1bcarllerche_bytes_for_string\
-    \x18\xf4\x84\x01\x20\x01(\x08\x12\x1f.google.protobuf.MessageOptionsR\
-    \x18carllercheBytesForString:D\n\x0cserde_derive\x18\x86\x85\x01\x20\x01\
-    (\x08\x12\x1f.google.protobuf.MessageOptionsR\x0bserdeDerive:K\n\x10serd\
-    e_derive_cfg\x18\x87\x85\x01\x20\x01(\t\x12\x1f.google.protobuf.MessageO\
-    ptionsR\x0eserdeDeriveCfg:O\n\x13expose_fields_field\x18\xeb\x84\x01\x20\
-    \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x11exposeFieldsField:Y\n\
-    \x18generate_accessors_field\x18\xec\x84\x01\x20\x01(\x08\x12\x1d.google\
-    .protobuf.FieldOptionsR\x16generateAccessorsField:g\n\x20carllerche_byte\
-    s_for_bytes_field\x18\xf3\x84\x01\x20\x01(\x08\x12\x1d.google.protobuf.F\
-    ieldOptionsR\x1ccarllercheBytesForBytesField:i\n!carllerche_bytes_for_st\
-    ring_field\x18\xf4\x84\x01\x20\x01(\x08\x12\x1d.google.protobuf.FieldOpt\
-    ionsR\x1dcarllercheBytesForStringField:H\n\x10serde_rename_all\x18\x88\
-    \x85\x01\x20\x01(\t\x12\x1c.google.protobuf.EnumOptionsR\x0eserdeRenameA\
-    llJ\xea\x14\n\x06\x12\x04\0\0<\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\t\n\
-    \x02\x03\0\x12\x03\x02\0*\nh\n\x01\x02\x12\x03\x07\0\x122^\x20see\x20htt\
-    ps://github.com/gogo/protobuf/blob/master/gogoproto/gogo.proto\n\x20for\
-    \x20the\x20original\x20idea\n\n\t\n\x01\x07\x12\x04\t\0\x1b\x01\n7\n\x02\
-    \x07\0\x12\x03\x0b\x04+\x1a,\x20When\x20true,\x20oneof\x20field\x20is\
-    \x20generated\x20public\n\n\n\n\x03\x07\0\x02\x12\x03\t\x07\"\n\n\n\x03\
-    \x07\0\x04\x12\x03\x0b\x04\x0c\n\n\n\x03\x07\0\x05\x12\x03\x0b\r\x11\n\n\
-    \n\x03\x07\0\x01\x12\x03\x0b\x12\"\n\n\n\x03\x07\0\x03\x12\x03\x0b%*\nI\
-    \n\x02\x07\x01\x12\x03\r\x04,\x1a>\x20When\x20true\x20all\x20fields\x20a\
-    re\x20public,\x20and\x20not\x20accessors\x20generated\n\n\n\n\x03\x07\
-    \x01\x02\x12\x03\t\x07\"\n\n\n\x03\x07\x01\x04\x12\x03\r\x04\x0c\n\n\n\
-    \x03\x07\x01\x05\x12\x03\r\r\x11\n\n\n\x03\x07\x01\x01\x12\x03\r\x12#\n\
-    \n\n\x03\x07\x01\x03\x12\x03\r&+\nP\n\x02\x07\x02\x12\x03\x0f\x041\x1aE\
-    \x20When\x20false,\x20`get_`,\x20`set_`,\x20`mut_`\x20etc.\x20accessors\
-    \x20are\x20not\x20generated\n\n\n\n\x03\x07\x02\x02\x12\x03\t\x07\"\n\n\
-    \n\x03\x07\x02\x04\x12\x03\x0f\x04\x0c\n\n\n\x03\x07\x02\x05\x12\x03\x0f\
-    \r\x11\n\n\n\x03\x07\x02\x01\x12\x03\x0f\x12(\n\n\n\x03\x07\x02\x03\x12\
-    \x03\x0f+0\n2\n\x02\x07\x03\x12\x03\x11\x049\x1a'\x20Use\x20`bytes::Byte\
-    s`\x20for\x20`bytes`\x20fields\n\n\n\n\x03\x07\x03\x02\x12\x03\t\x07\"\n\
-    \n\n\x03\x07\x03\x04\x12\x03\x11\x04\x0c\n\n\n\x03\x07\x03\x05\x12\x03\
-    \x11\r\x11\n\n\n\x03\x07\x03\x01\x12\x03\x11\x120\n\n\n\x03\x07\x03\x03\
-    \x12\x03\x1138\n3\n\x02\x07\x04\x12\x03\x13\x04:\x1a(\x20Use\x20`bytes::\
-    Bytes`\x20for\x20`string`\x20fields\n\n\n\n\x03\x07\x04\x02\x12\x03\t\
-    \x07\"\n\n\n\x03\x07\x04\x04\x12\x03\x13\x04\x0c\n\n\n\x03\x07\x04\x05\
-    \x12\x03\x13\r\x11\n\n\n\x03\x07\x04\x01\x12\x03\x13\x121\n\n\n\x03\x07\
-    \x04\x03\x12\x03\x1349\nJ\n\x02\x07\x05\x12\x03\x15\x04+\x1a?\x20Use\x20\
-    `serde_derive`\x20to\x20implement\x20`Serialize`\x20and\x20`Deserialize`\
-    \n\n\n\n\x03\x07\x05\x02\x12\x03\t\x07\"\n\n\n\x03\x07\x05\x04\x12\x03\
-    \x15\x04\x0c\n\n\n\x03\x07\x05\x05\x12\x03\x15\r\x11\n\n\n\x03\x07\x05\
-    \x01\x12\x03\x15\x12\"\n\n\n\x03\x07\x05\x03\x12\x03\x15%*\n3\n\x02\x07\
-    \x06\x12\x03\x17\x041\x1a(\x20Guard\x20serde\x20annotations\x20with\x20c\
-    fg\x20attr.\n\n\n\n\x03\x07\x06\x02\x12\x03\t\x07\"\n\n\n\x03\x07\x06\
-    \x04\x12\x03\x17\x04\x0c\n\n\n\x03\x07\x06\x05\x12\x03\x17\r\x13\n\n\n\
-    \x03\x07\x06\x01\x12\x03\x17\x14(\n\n\n\x03\x07\x06\x03\x12\x03\x17+0\nN\
-    \n\x02\x07\x07\x12\x03\x1a\x04+\x1aC\x20When\x20true,\x20will\x20only\
-    \x20generate\x20codes\x20that\x20works\x20with\x20lite\x20runtime.\n\n\n\
-    \n\x03\x07\x07\x02\x12\x03\t\x07\"\n\n\n\x03\x07\x07\x04\x12\x03\x1a\x04\
-    \x0c\n\n\n\x03\x07\x07\x05\x12\x03\x1a\r\x11\n\n\n\x03\x07\x07\x01\x12\
-    \x03\x1a\x12\"\n\n\n\x03\x07\x07\x03\x12\x03\x1a%*\n\t\n\x01\x07\x12\x04\
-    \x1d\0,\x01\n7\n\x02\x07\x08\x12\x03\x1f\x04'\x1a,\x20When\x20true,\x20o\
-    neof\x20field\x20is\x20generated\x20public\n\n\n\n\x03\x07\x08\x02\x12\
-    \x03\x1d\x07%\n\n\n\x03\x07\x08\x04\x12\x03\x1f\x04\x0c\n\n\n\x03\x07\
-    \x08\x05\x12\x03\x1f\r\x11\n\n\n\x03\x07\x08\x01\x12\x03\x1f\x12\x1e\n\n\
-    \n\x03\x07\x08\x03\x12\x03\x1f!&\nI\n\x02\x07\t\x12\x03!\x04(\x1a>\x20Wh\
-    en\x20true\x20all\x20fields\x20are\x20public,\x20and\x20not\x20accessors\
-    \x20generated\n\n\n\n\x03\x07\t\x02\x12\x03\x1d\x07%\n\n\n\x03\x07\t\x04\
-    \x12\x03!\x04\x0c\n\n\n\x03\x07\t\x05\x12\x03!\r\x11\n\n\n\x03\x07\t\x01\
-    \x12\x03!\x12\x1f\n\n\n\x03\x07\t\x03\x12\x03!\"'\nP\n\x02\x07\n\x12\x03\
-    #\x04-\x1aE\x20When\x20false,\x20`get_`,\x20`set_`,\x20`mut_`\x20etc.\
-    \x20accessors\x20are\x20not\x20generated\n\n\n\n\x03\x07\n\x02\x12\x03\
-    \x1d\x07%\n\n\n\x03\x07\n\x04\x12\x03#\x04\x0c\n\n\n\x03\x07\n\x05\x12\
-    \x03#\r\x11\n\n\n\x03\x07\n\x01\x12\x03#\x12$\n\n\n\x03\x07\n\x03\x12\
-    \x03#',\n2\n\x02\x07\x0b\x12\x03%\x045\x1a'\x20Use\x20`bytes::Bytes`\x20\
-    for\x20`bytes`\x20fields\n\n\n\n\x03\x07\x0b\x02\x12\x03\x1d\x07%\n\n\n\
-    \x03\x07\x0b\x04\x12\x03%\x04\x0c\n\n\n\x03\x07\x0b\x05\x12\x03%\r\x11\n\
-    \n\n\x03\x07\x0b\x01\x12\x03%\x12,\n\n\n\x03\x07\x0b\x03\x12\x03%/4\n3\n\
-    \x02\x07\x0c\x12\x03'\x046\x1a(\x20Use\x20`bytes::Bytes`\x20for\x20`stri\
-    ng`\x20fields\n\n\n\n\x03\x07\x0c\x02\x12\x03\x1d\x07%\n\n\n\x03\x07\x0c\
-    \x04\x12\x03'\x04\x0c\n\n\n\x03\x07\x0c\x05\x12\x03'\r\x11\n\n\n\x03\x07\
-    \x0c\x01\x12\x03'\x12-\n\n\n\x03\x07\x0c\x03\x12\x03'05\nJ\n\x02\x07\r\
-    \x12\x03)\x04'\x1a?\x20Use\x20`serde_derive`\x20to\x20implement\x20`Seri\
-    alize`\x20and\x20`Deserialize`\n\n\n\n\x03\x07\r\x02\x12\x03\x1d\x07%\n\
-    \n\n\x03\x07\r\x04\x12\x03)\x04\x0c\n\n\n\x03\x07\r\x05\x12\x03)\r\x11\n\
-    \n\n\x03\x07\r\x01\x12\x03)\x12\x1e\n\n\n\x03\x07\r\x03\x12\x03)!&\n3\n\
-    \x02\x07\x0e\x12\x03+\x04-\x1a(\x20Guard\x20serde\x20annotations\x20with\
-    \x20cfg\x20attr.\n\n\n\n\x03\x07\x0e\x02\x12\x03\x1d\x07%\n\n\n\x03\x07\
-    \x0e\x04\x12\x03+\x04\x0c\n\n\n\x03\x07\x0e\x05\x12\x03+\r\x13\n\n\n\x03\
-    \x07\x0e\x01\x12\x03+\x14$\n\n\n\x03\x07\x0e\x03\x12\x03+',\n\t\n\x01\
-    \x07\x12\x04.\07\x01\nI\n\x02\x07\x0f\x12\x030\x04.\x1a>\x20When\x20true\
-    \x20all\x20fields\x20are\x20public,\x20and\x20not\x20accessors\x20genera\
-    ted\n\n\n\n\x03\x07\x0f\x02\x12\x03.\x07#\n\n\n\x03\x07\x0f\x04\x12\x030\
-    \x04\x0c\n\n\n\x03\x07\x0f\x05\x12\x030\r\x11\n\n\n\x03\x07\x0f\x01\x12\
-    \x030\x12%\n\n\n\x03\x07\x0f\x03\x12\x030(-\nP\n\x02\x07\x10\x12\x032\
-    \x043\x1aE\x20When\x20false,\x20`get_`,\x20`set_`,\x20`mut_`\x20etc.\x20\
-    accessors\x20are\x20not\x20generated\n\n\n\n\x03\x07\x10\x02\x12\x03.\
-    \x07#\n\n\n\x03\x07\x10\x04\x12\x032\x04\x0c\n\n\n\x03\x07\x10\x05\x12\
-    \x032\r\x11\n\n\n\x03\x07\x10\x01\x12\x032\x12*\n\n\n\x03\x07\x10\x03\
-    \x12\x032-2\n2\n\x02\x07\x11\x12\x034\x04;\x1a'\x20Use\x20`bytes::Bytes`\
-    \x20for\x20`bytes`\x20fields\n\n\n\n\x03\x07\x11\x02\x12\x03.\x07#\n\n\n\
-    \x03\x07\x11\x04\x12\x034\x04\x0c\n\n\n\x03\x07\x11\x05\x12\x034\r\x11\n\
-    \n\n\x03\x07\x11\x01\x12\x034\x122\n\n\n\x03\x07\x11\x03\x12\x0345:\n3\n\
-    \x02\x07\x12\x12\x036\x04<\x1a(\x20Use\x20`bytes::Bytes`\x20for\x20`stri\
-    ng`\x20fields\n\n\n\n\x03\x07\x12\x02\x12\x03.\x07#\n\n\n\x03\x07\x12\
-    \x04\x12\x036\x04\x0c\n\n\n\x03\x07\x12\x05\x12\x036\r\x11\n\n\n\x03\x07\
-    \x12\x01\x12\x036\x123\n\n\n\x03\x07\x12\x03\x12\x0366;\n\t\n\x01\x07\
-    \x12\x049\0<\x01\n/\n\x02\x07\x13\x12\x03;\x04-\x1a$\x20use\x20rename_al\
-    l\x20attribute\x20for\x20serde\n\n\n\n\x03\x07\x13\x02\x12\x039\x07\"\n\
-    \n\n\x03\x07\x13\x04\x12\x03;\x04\x0c\n\n\n\x03\x07\x13\x05\x12\x03;\r\
-    \x13\n\n\n\x03\x07\x13\x01\x12\x03;\x14$\n\n\n\x03\x07\x13\x03\x12\x03;'\
-    ,\
+    roto:T\n\x16generate_accessors_all\x18\xec\x84\x01\x20\x01(\x08\x12\x1c.\
+    google.protobuf.FileOptionsR\x14generateAccessorsAll:N\n\x13generate_get\
+    ter_all\x18\xed\x84\x01\x20\x01(\x08\x12\x1c.google.protobuf.FileOptions\
+    R\x11generateGetterAll:F\n\x0ftokio_bytes_all\x18\xf3\x84\x01\x20\x01(\
+    \x08\x12\x1c.google.protobuf.FileOptionsR\rtokioBytesAll:Z\n\x1atokio_by\
+    tes_for_string_all\x18\xf4\x84\x01\x20\x01(\x08\x12\x1c.google.protobuf.\
+    FileOptionsR\x16tokioBytesForStringAll:H\n\x10lite_runtime_all\x18\x8b\
+    \x85\x01\x20\x01(\x08\x12\x1c.google.protobuf.FileOptionsR\x0eliteRuntim\
+    eAll:P\n\x12generate_accessors\x18\xec\x84\x01\x20\x01(\x08\x12\x1f.goog\
+    le.protobuf.MessageOptionsR\x11generateAccessors:J\n\x0fgenerate_getter\
+    \x18\xed\x84\x01\x20\x01(\x08\x12\x1f.google.protobuf.MessageOptionsR\
+    \x0egenerateGetter:B\n\x0btokio_bytes\x18\xf3\x84\x01\x20\x01(\x08\x12\
+    \x1f.google.protobuf.MessageOptionsR\ntokioBytes:V\n\x16tokio_bytes_for_\
+    string\x18\xf4\x84\x01\x20\x01(\x08\x12\x1f.google.protobuf.MessageOptio\
+    nsR\x13tokioBytesForString:Y\n\x18generate_accessors_field\x18\xec\x84\
+    \x01\x20\x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x16generateAcces\
+    sorsField:S\n\x15generate_getter_field\x18\xed\x84\x01\x20\x01(\x08\x12\
+    \x1d.google.protobuf.FieldOptionsR\x13generateGetterField:K\n\x11tokio_b\
+    ytes_field\x18\xf3\x84\x01\x20\x01(\x08\x12\x1d.google.protobuf.FieldOpt\
+    ionsR\x0ftokioBytesField:_\n\x1ctokio_bytes_for_string_field\x18\xf4\x84\
+    \x01\x20\x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x18tokioBytesFor\
+    StringFieldJ\x9d\x0f\n\x06\x12\x04\0\0.\x01\n\x08\n\x01\x0c\x12\x03\0\0\
+    \x12\n\t\n\x02\x03\0\x12\x03\x02\0*\n\xe5\x01\n\x01\x02\x12\x03\n\0\x122\
+    ^\x20see\x20https://github.com/gogo/protobuf/blob/master/gogoproto/gogo.\
+    proto\n\x20for\x20the\x20original\x20idea\n2{\x20Generated\x20files\x20c\
+    an\x20be\x20customized\x20using\x20this\x20proto\n\x20or\x20using\x20`Cu\
+    stomize`\x20struct\x20when\x20codegen\x20is\x20invoked\x20programmatical\
+    ly.\n\n\t\n\x01\x07\x12\x04\x0c\0\x18\x01\nP\n\x02\x07\0\x12\x03\x0e\x04\
+    1\x1aE\x20When\x20false,\x20`get_`,\x20`set_`,\x20`mut_`\x20etc.\x20acce\
+    ssors\x20are\x20not\x20generated\n\n\n\n\x03\x07\0\x02\x12\x03\x0c\x07\"\
+    \n\n\n\x03\x07\0\x04\x12\x03\x0e\x04\x0c\n\n\n\x03\x07\0\x05\x12\x03\x0e\
+    \r\x11\n\n\n\x03\x07\0\x01\x12\x03\x0e\x12(\n\n\n\x03\x07\0\x03\x12\x03\
+    \x0e+0\nL\n\x02\x07\x01\x12\x03\x10\x04.\x1aA\x20When\x20false,\x20`get_\
+    `\x20is\x20not\x20generated\x20even\x20if\x20`syntax\x20=\x20\"proto2\"`\
+    \n\n\n\n\x03\x07\x01\x02\x12\x03\x0c\x07\"\n\n\n\x03\x07\x01\x04\x12\x03\
+    \x10\x04\x0c\n\n\n\x03\x07\x01\x05\x12\x03\x10\r\x11\n\n\n\x03\x07\x01\
+    \x01\x12\x03\x10\x12%\n\n\n\x03\x07\x01\x03\x12\x03\x10(-\n2\n\x02\x07\
+    \x02\x12\x03\x12\x04*\x1a'\x20Use\x20`bytes::Bytes`\x20for\x20`bytes`\
+    \x20fields\n\n\n\n\x03\x07\x02\x02\x12\x03\x0c\x07\"\n\n\n\x03\x07\x02\
+    \x04\x12\x03\x12\x04\x0c\n\n\n\x03\x07\x02\x05\x12\x03\x12\r\x11\n\n\n\
+    \x03\x07\x02\x01\x12\x03\x12\x12!\n\n\n\x03\x07\x02\x03\x12\x03\x12$)\n3\
+    \n\x02\x07\x03\x12\x03\x14\x045\x1a(\x20Use\x20`bytes::Bytes`\x20for\x20\
+    `string`\x20fields\n\n\n\n\x03\x07\x03\x02\x12\x03\x0c\x07\"\n\n\n\x03\
+    \x07\x03\x04\x12\x03\x14\x04\x0c\n\n\n\x03\x07\x03\x05\x12\x03\x14\r\x11\
+    \n\n\n\x03\x07\x03\x01\x12\x03\x14\x12,\n\n\n\x03\x07\x03\x03\x12\x03\
+    \x14/4\nN\n\x02\x07\x04\x12\x03\x17\x04+\x1aC\x20When\x20true,\x20will\
+    \x20only\x20generate\x20codes\x20that\x20works\x20with\x20lite\x20runtim\
+    e.\n\n\n\n\x03\x07\x04\x02\x12\x03\x0c\x07\"\n\n\n\x03\x07\x04\x04\x12\
+    \x03\x17\x04\x0c\n\n\n\x03\x07\x04\x05\x12\x03\x17\r\x11\n\n\n\x03\x07\
+    \x04\x01\x12\x03\x17\x12\"\n\n\n\x03\x07\x04\x03\x12\x03\x17%*\n\t\n\x01\
+    \x07\x12\x04\x1a\0#\x01\nP\n\x02\x07\x05\x12\x03\x1c\x04-\x1aE\x20When\
+    \x20false,\x20`get_`,\x20`set_`,\x20`mut_`\x20etc.\x20accessors\x20are\
+    \x20not\x20generated\n\n\n\n\x03\x07\x05\x02\x12\x03\x1a\x07%\n\n\n\x03\
+    \x07\x05\x04\x12\x03\x1c\x04\x0c\n\n\n\x03\x07\x05\x05\x12\x03\x1c\r\x11\
+    \n\n\n\x03\x07\x05\x01\x12\x03\x1c\x12$\n\n\n\x03\x07\x05\x03\x12\x03\
+    \x1c',\nL\n\x02\x07\x06\x12\x03\x1e\x04*\x1aA\x20When\x20false,\x20`get_\
+    `\x20is\x20not\x20generated\x20even\x20if\x20`syntax\x20=\x20\"proto2\"`\
+    \n\n\n\n\x03\x07\x06\x02\x12\x03\x1a\x07%\n\n\n\x03\x07\x06\x04\x12\x03\
+    \x1e\x04\x0c\n\n\n\x03\x07\x06\x05\x12\x03\x1e\r\x11\n\n\n\x03\x07\x06\
+    \x01\x12\x03\x1e\x12!\n\n\n\x03\x07\x06\x03\x12\x03\x1e$)\n2\n\x02\x07\
+    \x07\x12\x03\x20\x04&\x1a'\x20Use\x20`bytes::Bytes`\x20for\x20`bytes`\
+    \x20fields\n\n\n\n\x03\x07\x07\x02\x12\x03\x1a\x07%\n\n\n\x03\x07\x07\
+    \x04\x12\x03\x20\x04\x0c\n\n\n\x03\x07\x07\x05\x12\x03\x20\r\x11\n\n\n\
+    \x03\x07\x07\x01\x12\x03\x20\x12\x1d\n\n\n\x03\x07\x07\x03\x12\x03\x20\
+    \x20%\n3\n\x02\x07\x08\x12\x03\"\x041\x1a(\x20Use\x20`bytes::Bytes`\x20f\
+    or\x20`string`\x20fields\n\n\n\n\x03\x07\x08\x02\x12\x03\x1a\x07%\n\n\n\
+    \x03\x07\x08\x04\x12\x03\"\x04\x0c\n\n\n\x03\x07\x08\x05\x12\x03\"\r\x11\
+    \n\n\n\x03\x07\x08\x01\x12\x03\"\x12(\n\n\n\x03\x07\x08\x03\x12\x03\"+0\
+    \n\t\n\x01\x07\x12\x04%\0.\x01\nP\n\x02\x07\t\x12\x03'\x043\x1aE\x20When\
+    \x20false,\x20`get_`,\x20`set_`,\x20`mut_`\x20etc.\x20accessors\x20are\
+    \x20not\x20generated\n\n\n\n\x03\x07\t\x02\x12\x03%\x07#\n\n\n\x03\x07\t\
+    \x04\x12\x03'\x04\x0c\n\n\n\x03\x07\t\x05\x12\x03'\r\x11\n\n\n\x03\x07\t\
+    \x01\x12\x03'\x12*\n\n\n\x03\x07\t\x03\x12\x03'-2\nL\n\x02\x07\n\x12\x03\
+    )\x040\x1aA\x20When\x20false,\x20`get_`\x20is\x20not\x20generated\x20eve\
+    n\x20if\x20`syntax\x20=\x20\"proto2\"`\n\n\n\n\x03\x07\n\x02\x12\x03%\
+    \x07#\n\n\n\x03\x07\n\x04\x12\x03)\x04\x0c\n\n\n\x03\x07\n\x05\x12\x03)\
+    \r\x11\n\n\n\x03\x07\n\x01\x12\x03)\x12'\n\n\n\x03\x07\n\x03\x12\x03)*/\
+    \n2\n\x02\x07\x0b\x12\x03+\x04,\x1a'\x20Use\x20`bytes::Bytes`\x20for\x20\
+    `bytes`\x20fields\n\n\n\n\x03\x07\x0b\x02\x12\x03%\x07#\n\n\n\x03\x07\
+    \x0b\x04\x12\x03+\x04\x0c\n\n\n\x03\x07\x0b\x05\x12\x03+\r\x11\n\n\n\x03\
+    \x07\x0b\x01\x12\x03+\x12#\n\n\n\x03\x07\x0b\x03\x12\x03+&+\n3\n\x02\x07\
+    \x0c\x12\x03-\x047\x1a(\x20Use\x20`bytes::Bytes`\x20for\x20`string`\x20f\
+    ields\n\n\n\n\x03\x07\x0c\x02\x12\x03%\x07#\n\n\n\x03\x07\x0c\x04\x12\
+    \x03-\x04\x0c\n\n\n\x03\x07\x0c\x05\x12\x03-\r\x11\n\n\n\x03\x07\x0c\x01\
+    \x12\x03-\x12.\n\n\n\x03\x07\x0c\x03\x12\x03-16\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(1);
+            deps.push(crate::descriptor::file_descriptor().clone());
+            let mut messages = ::std::vec::Vec::with_capacity(0);
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/singular.rs b/src/singular.rs
deleted file mode 100644
index 1b7e28d..0000000
--- a/src/singular.rs
+++ /dev/null
@@ -1,594 +0,0 @@
-use std::default::Default;
-use std::fmt;
-use std::hash::Hash;
-use std::hash::Hasher;
-use std::mem;
-use std::option;
-
-#[cfg(feature = "with-serde")]
-use serde;
-
-use crate::clear::Clear;
-
-/// Like `Option<T>`, but keeps the actual element on `clear`.
-pub struct SingularField<T> {
-    value: T,
-    set: bool,
-}
-
-/// Like `Option<Box<T>>`, but keeps the actual element on `clear`.
-pub struct SingularPtrField<T> {
-    value: Option<Box<T>>,
-    set: bool,
-}
-
-impl<T> SingularField<T> {
-    /// Construct this object from given value.
-    #[inline]
-    pub fn some(value: T) -> SingularField<T> {
-        SingularField {
-            value: value,
-            set: true,
-        }
-    }
-
-    /// True iff this object contains data.
-    #[inline]
-    pub fn is_some(&self) -> bool {
-        self.set
-    }
-
-    /// True iff this object contains no data.
-    #[inline]
-    pub fn is_none(&self) -> bool {
-        !self.is_some()
-    }
-
-    /// Convert this object into `Option`.
-    #[inline]
-    pub fn into_option(self) -> Option<T> {
-        if self.set {
-            Some(self.value)
-        } else {
-            None
-        }
-    }
-
-    /// View data as `Option`.
-    #[inline]
-    pub fn as_ref<'a>(&'a self) -> Option<&'a T> {
-        if self.set {
-            Some(&self.value)
-        } else {
-            None
-        }
-    }
-
-    /// View data as mutable `Option`.
-    #[inline]
-    pub fn as_mut<'a>(&'a mut self) -> Option<&'a mut T> {
-        if self.set {
-            Some(&mut self.value)
-        } else {
-            None
-        }
-    }
-
-    /// Unwrap data as reference.
-    #[inline]
-    pub fn unwrap_ref<'a>(&'a self) -> &'a T {
-        self.as_ref().unwrap()
-    }
-
-    /// Unwrap data as mutable reference.
-    #[inline]
-    pub fn unwrap_mut_ref<'a>(&'a mut self) -> &'a mut T {
-        self.as_mut().unwrap()
-    }
-
-    /// Unwrap data, panic if not set.
-    #[inline]
-    pub fn unwrap(self) -> T {
-        if self.set {
-            self.value
-        } else {
-            panic!();
-        }
-    }
-
-    /// Unwrap data or return given default value.
-    #[inline]
-    pub fn unwrap_or(self, def: T) -> T {
-        if self.set {
-            self.value
-        } else {
-            def
-        }
-    }
-
-    /// Unwrap data or return given default value.
-    #[inline]
-    pub fn unwrap_or_else<F>(self, f: F) -> T
-    where
-        F: FnOnce() -> T,
-    {
-        if self.set {
-            self.value
-        } else {
-            f()
-        }
-    }
-
-    /// Apply a function to contained element and store result in new `SingularPtrField`.
-    #[inline]
-    pub fn map<U, F>(self, f: F) -> SingularPtrField<U>
-    where
-        F: FnOnce(T) -> U,
-    {
-        SingularPtrField::from_option(self.into_option().map(f))
-    }
-
-    /// View as iterator over references.
-    #[inline]
-    pub fn iter<'a>(&'a self) -> option::IntoIter<&'a T> {
-        self.as_ref().into_iter()
-    }
-
-    /// View as iterator over mutable references.
-    #[inline]
-    pub fn mut_iter<'a>(&'a mut self) -> option::IntoIter<&'a mut T> {
-        self.as_mut().into_iter()
-    }
-
-    /// Clear this object.
-    /// Note, contained object destructor is not called, so allocated memory could be reused.
-    #[inline]
-    pub fn clear(&mut self) {
-        self.set = false;
-    }
-}
-
-impl<T: Default> SingularField<T> {
-    /// Construct a `SingularField` with no data.
-    #[inline]
-    pub fn none() -> SingularField<T> {
-        SingularField {
-            value: Default::default(),
-            set: false,
-        }
-    }
-
-    /// Construct `SingularField` from `Option`.
-    #[inline]
-    pub fn from_option(option: Option<T>) -> SingularField<T> {
-        match option {
-            Some(x) => SingularField::some(x),
-            None => SingularField::none(),
-        }
-    }
-
-    /// Return data as option, clear this object.
-    #[inline]
-    pub fn take(&mut self) -> Option<T> {
-        if self.set {
-            self.set = false;
-            Some(mem::replace(&mut self.value, Default::default()))
-        } else {
-            None
-        }
-    }
-}
-
-impl<T> SingularPtrField<T> {
-    /// Construct `SingularPtrField` from given object.
-    #[inline]
-    pub fn some(value: T) -> SingularPtrField<T> {
-        SingularPtrField {
-            value: Some(Box::new(value)),
-            set: true,
-        }
-    }
-
-    /// Construct an empty `SingularPtrField`.
-    #[inline]
-    pub fn none() -> SingularPtrField<T> {
-        SingularPtrField {
-            value: None,
-            set: false,
-        }
-    }
-
-    /// Construct `SingularPtrField` from optional.
-    #[inline]
-    pub fn from_option(option: Option<T>) -> SingularPtrField<T> {
-        match option {
-            Some(x) => SingularPtrField::some(x),
-            None => SingularPtrField::none(),
-        }
-    }
-
-    /// True iff this object contains data.
-    #[inline]
-    pub fn is_some(&self) -> bool {
-        self.set
-    }
-
-    /// True iff this object contains no data.
-    #[inline]
-    pub fn is_none(&self) -> bool {
-        !self.is_some()
-    }
-
-    /// Convert into `Option<T>`.
-    #[inline]
-    pub fn into_option(self) -> Option<T> {
-        if self.set {
-            Some(*self.value.unwrap())
-        } else {
-            None
-        }
-    }
-
-    /// View data as reference option.
-    #[inline]
-    pub fn as_ref<'a>(&'a self) -> Option<&'a T> {
-        if self.set {
-            Some(&**self.value.as_ref().unwrap())
-        } else {
-            None
-        }
-    }
-
-    /// View data as mutable reference option.
-    #[inline]
-    pub fn as_mut<'a>(&'a mut self) -> Option<&'a mut T> {
-        if self.set {
-            Some(&mut **self.value.as_mut().unwrap())
-        } else {
-            None
-        }
-    }
-
-    /// Get data as reference.
-    /// Panics if empty.
-    #[inline]
-    pub fn get_ref<'a>(&'a self) -> &'a T {
-        self.as_ref().unwrap()
-    }
-
-    /// Get data as mutable reference.
-    /// Panics if empty.
-    #[inline]
-    pub fn get_mut_ref<'a>(&'a mut self) -> &'a mut T {
-        self.as_mut().unwrap()
-    }
-
-    /// Take the data.
-    /// Panics if empty
-    #[inline]
-    pub fn unwrap(self) -> T {
-        if self.set {
-            *self.value.unwrap()
-        } else {
-            panic!();
-        }
-    }
-
-    /// Take the data or return supplied default element if empty.
-    #[inline]
-    pub fn unwrap_or(self, def: T) -> T {
-        if self.set {
-            *self.value.unwrap()
-        } else {
-            def
-        }
-    }
-
-    /// Take the data or return supplied default element if empty.
-    #[inline]
-    pub fn unwrap_or_else<F>(self, f: F) -> T
-    where
-        F: FnOnce() -> T,
-    {
-        if self.set {
-            *self.value.unwrap()
-        } else {
-            f()
-        }
-    }
-
-    /// Apply given function to contained data to construct another `SingularPtrField`.
-    /// Returns empty `SingularPtrField` if this object is empty.
-    #[inline]
-    pub fn map<U, F>(self, f: F) -> SingularPtrField<U>
-    where
-        F: FnOnce(T) -> U,
-    {
-        SingularPtrField::from_option(self.into_option().map(f))
-    }
-
-    /// View data as iterator.
-    #[inline]
-    pub fn iter<'a>(&'a self) -> option::IntoIter<&'a T> {
-        self.as_ref().into_iter()
-    }
-
-    /// View data as mutable iterator.
-    #[inline]
-    pub fn mut_iter<'a>(&'a mut self) -> option::IntoIter<&'a mut T> {
-        self.as_mut().into_iter()
-    }
-
-    /// Take data as option, leaving this object empty.
-    #[inline]
-    pub fn take(&mut self) -> Option<T> {
-        if self.set {
-            self.set = false;
-            Some(*self.value.take().unwrap())
-        } else {
-            None
-        }
-    }
-
-    /// Clear this object, but do not call destructor of underlying data.
-    #[inline]
-    pub fn clear(&mut self) {
-        self.set = false;
-    }
-}
-
-impl<T: Default + Clear> SingularField<T> {
-    /// Get contained data, consume self. Return default value for type if this is empty.
-    #[inline]
-    pub fn unwrap_or_default(mut self) -> T {
-        if !self.set {
-            self.value.clear();
-        }
-        self.value
-    }
-
-    /// Initialize this object with default value.
-    /// This operation can be more efficient then construction of clear element,
-    /// because it may reuse previously contained object.
-    #[inline]
-    pub fn set_default<'a>(&'a mut self) -> &'a mut T {
-        self.set = true;
-        self.value.clear();
-        &mut self.value
-    }
-}
-
-impl<T: Default + Clear> SingularPtrField<T> {
-    /// Get contained data, consume self. Return default value for type if this is empty.
-    #[inline]
-    pub fn unwrap_or_default(mut self) -> T {
-        if self.set {
-            self.unwrap()
-        } else if self.value.is_some() {
-            self.value.clear();
-            *self.value.unwrap()
-        } else {
-            Default::default()
-        }
-    }
-
-    /// Initialize this object with default value.
-    /// This operation can be more efficient then construction of clear element,
-    /// because it may reuse previously contained object.
-    #[inline]
-    pub fn set_default<'a>(&'a mut self) -> &'a mut T {
-        self.set = true;
-        if self.value.is_some() {
-            self.value.as_mut().unwrap().clear();
-        } else {
-            self.value = Some(Default::default());
-        }
-        self.as_mut().unwrap()
-    }
-}
-
-impl<T: Default> Default for SingularField<T> {
-    #[inline]
-    fn default() -> SingularField<T> {
-        SingularField::none()
-    }
-}
-
-impl<T> Default for SingularPtrField<T> {
-    #[inline]
-    fn default() -> SingularPtrField<T> {
-        SingularPtrField::none()
-    }
-}
-
-impl<T: Default> From<Option<T>> for SingularField<T> {
-    fn from(o: Option<T>) -> Self {
-        SingularField::from_option(o)
-    }
-}
-
-impl<T> From<Option<T>> for SingularPtrField<T> {
-    fn from(o: Option<T>) -> Self {
-        SingularPtrField::from_option(o)
-    }
-}
-
-impl<T: Clone + Default> Clone for SingularField<T> {
-    #[inline]
-    fn clone(&self) -> SingularField<T> {
-        if self.set {
-            SingularField::some(self.value.clone())
-        } else {
-            SingularField::none()
-        }
-    }
-}
-
-impl<T: Clone> Clone for SingularPtrField<T> {
-    #[inline]
-    fn clone(&self) -> SingularPtrField<T> {
-        if self.set {
-            SingularPtrField::some(self.as_ref().unwrap().clone())
-        } else {
-            SingularPtrField::none()
-        }
-    }
-}
-
-impl<T: fmt::Debug> fmt::Debug for SingularField<T> {
-    #[inline]
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        if self.is_some() {
-            write!(f, "Some({:?})", *self.as_ref().unwrap())
-        } else {
-            write!(f, "None")
-        }
-    }
-}
-
-impl<T: fmt::Debug> fmt::Debug for SingularPtrField<T> {
-    #[inline]
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        if self.is_some() {
-            write!(f, "Some({:?})", *self.as_ref().unwrap())
-        } else {
-            write!(f, "None")
-        }
-    }
-}
-
-impl<T: PartialEq> PartialEq for SingularField<T> {
-    #[inline]
-    fn eq(&self, other: &SingularField<T>) -> bool {
-        self.as_ref() == other.as_ref()
-    }
-}
-
-impl<T: Eq> Eq for SingularField<T> {}
-
-impl<T: PartialEq> PartialEq for SingularPtrField<T> {
-    #[inline]
-    fn eq(&self, other: &SingularPtrField<T>) -> bool {
-        self.as_ref() == other.as_ref()
-    }
-}
-
-impl<T: Eq> Eq for SingularPtrField<T> {}
-
-impl<T: Hash> Hash for SingularField<T> {
-    fn hash<H: Hasher>(&self, state: &mut H) {
-        self.as_ref().hash(state);
-    }
-}
-
-impl<T: Hash> Hash for SingularPtrField<T> {
-    fn hash<H: Hasher>(&self, state: &mut H) {
-        self.as_ref().hash(state);
-    }
-}
-
-impl<'a, T> IntoIterator for &'a SingularField<T> {
-    type Item = &'a T;
-    type IntoIter = option::IntoIter<&'a T>;
-
-    fn into_iter(self) -> option::IntoIter<&'a T> {
-        self.iter()
-    }
-}
-
-impl<'a, T> IntoIterator for &'a SingularPtrField<T> {
-    type Item = &'a T;
-    type IntoIter = option::IntoIter<&'a T>;
-
-    fn into_iter(self) -> option::IntoIter<&'a T> {
-        self.iter()
-    }
-}
-
-#[cfg(feature = "with-serde")]
-impl<T: serde::Serialize> serde::Serialize for SingularPtrField<T> {
-    fn serialize<S>(
-        &self,
-        serializer: S,
-    ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error>
-    where
-        S: serde::Serializer,
-    {
-        self.as_ref().serialize(serializer)
-    }
-}
-
-#[cfg(feature = "with-serde")]
-impl<T: serde::Serialize> serde::Serialize for SingularField<T> {
-    fn serialize<S>(
-        &self,
-        serializer: S,
-    ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error>
-    where
-        S: serde::Serializer,
-    {
-        self.as_ref().serialize(serializer)
-    }
-}
-
-#[cfg(feature = "with-serde")]
-impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for SingularPtrField<T> {
-    fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        Option::deserialize(deserializer).map(SingularPtrField::from_option)
-    }
-}
-
-#[cfg(feature = "with-serde")]
-impl<'de, T: serde::Deserialize<'de> + Default> serde::Deserialize<'de> for SingularField<T> {
-    fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        Option::deserialize(deserializer).map(SingularField::from_option)
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::SingularField;
-    use crate::clear::Clear;
-
-    #[test]
-    fn test_set_default_clears() {
-        #[derive(Default)]
-        struct Foo {
-            b: isize,
-        }
-
-        impl Clear for Foo {
-            fn clear(&mut self) {
-                self.b = 0;
-            }
-        }
-
-        let mut x = SingularField::some(Foo { b: 10 });
-        x.clear();
-        x.set_default();
-        assert_eq!(0, x.as_ref().unwrap().b);
-
-        x.as_mut().unwrap().b = 11;
-        // without clear
-        x.set_default();
-        assert_eq!(0, x.as_ref().unwrap().b);
-    }
-
-    #[test]
-    fn unwrap_or_default() {
-        assert_eq!(
-            "abc",
-            SingularField::some("abc".to_owned()).unwrap_or_default()
-        );
-        assert_eq!("", SingularField::<String>::none().unwrap_or_default());
-        let mut some = SingularField::some("abc".to_owned());
-        some.clear();
-        assert_eq!("", some.unwrap_or_default());
-    }
-}
diff --git a/src/special.rs b/src/special.rs
new file mode 100644
index 0000000..f559721
--- /dev/null
+++ b/src/special.rs
@@ -0,0 +1,40 @@
+use crate::cached_size::CachedSize;
+use crate::UnknownFields;
+
+/// Special fields included in each generated message.
+#[derive(Default, Eq, PartialEq, Clone, Debug, Hash)]
+pub struct SpecialFields {
+    unknown_fields: UnknownFields,
+    cached_size: CachedSize,
+}
+
+impl SpecialFields {
+    /// Defaults.
+    pub const fn new() -> SpecialFields {
+        SpecialFields {
+            unknown_fields: UnknownFields::new(),
+            cached_size: CachedSize::new(),
+        }
+    }
+
+    /// Clear.
+    pub fn clear(&mut self) {
+        self.unknown_fields.clear();
+        // No need to clear `cached_size`.
+    }
+
+    /// Getter.
+    pub fn cached_size(&self) -> &CachedSize {
+        &self.cached_size
+    }
+
+    /// Getter.
+    pub fn unknown_fields(&self) -> &UnknownFields {
+        &self.unknown_fields
+    }
+
+    /// Setter.
+    pub fn mut_unknown_fields(&mut self) -> &mut UnknownFields {
+        &mut self.unknown_fields
+    }
+}
diff --git a/src/strx.rs b/src/strx.rs
deleted file mode 100644
index af09de2..0000000
--- a/src/strx.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-pub fn remove_to<'s>(s: &'s str, c: char) -> &'s str {
-    match s.rfind(c) {
-        Some(pos) => &s[(pos + 1)..],
-        None => s,
-    }
-}
-
-pub fn remove_suffix<'s>(s: &'s str, suffix: &str) -> &'s str {
-    if !s.ends_with(suffix) {
-        s
-    } else {
-        &s[..(s.len() - suffix.len())]
-    }
-}
-
-#[cfg(test)]
-mod test {
-
-    use super::remove_suffix;
-    use super::remove_to;
-
-    #[test]
-    fn test_remove_to() {
-        assert_eq!("aaa", remove_to("aaa", '.'));
-        assert_eq!("bbb", remove_to("aaa.bbb", '.'));
-        assert_eq!("ccc", remove_to("aaa.bbb.ccc", '.'));
-    }
-
-    #[test]
-    fn test_remove_suffix() {
-        assert_eq!("bbb", remove_suffix("bbbaaa", "aaa"));
-        assert_eq!("aaa", remove_suffix("aaa", "bbb"));
-    }
-}
diff --git a/src/text_format/lexer/float.rs b/src/text_format/lexer/float.rs
deleted file mode 100644
index 0d69c09..0000000
--- a/src/text_format/lexer/float.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-use std::f64;
-
-#[derive(Debug)]
-pub enum ProtobufFloatParseError {
-    EmptyString,
-    CannotParseFloat,
-}
-
-pub type ProtobufFloatParseResult<T> = Result<T, ProtobufFloatParseError>;
-
-pub const PROTOBUF_NAN: &str = "nan";
-pub const PROTOBUF_INF: &str = "inf";
-
-/// Format float as in protobuf `.proto` files
-pub fn format_protobuf_float(f: f64) -> String {
-    if f.is_nan() {
-        PROTOBUF_NAN.to_owned()
-    } else if f.is_infinite() {
-        if f > 0.0 {
-            format!("{}", PROTOBUF_INF)
-        } else {
-            format!("-{}", PROTOBUF_INF)
-        }
-    } else {
-        // TODO: make sure doesn't lose precision
-        format!("{}", f)
-    }
-}
-
-/// Parse float from `.proto` format
-pub fn parse_protobuf_float(s: &str) -> ProtobufFloatParseResult<f64> {
-    if s.is_empty() {
-        return Err(ProtobufFloatParseError::EmptyString);
-    }
-    if s == PROTOBUF_NAN {
-        return Ok(f64::NAN);
-    }
-    if s == PROTOBUF_INF || s == format!("+{}", PROTOBUF_INF) {
-        return Ok(f64::INFINITY);
-    }
-    if s == format!("-{}", PROTOBUF_INF) {
-        return Ok(f64::NEG_INFINITY);
-    }
-    match s.parse() {
-        Ok(f) => Ok(f),
-        Err(_) => Err(ProtobufFloatParseError::CannotParseFloat),
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-
-    #[test]
-    fn test_format_protobuf_float() {
-        assert_eq!("10", format_protobuf_float(10.0));
-    }
-}
diff --git a/src/text_format/lexer/json_number_lit.rs b/src/text_format/lexer/json_number_lit.rs
deleted file mode 100644
index 6394b0e..0000000
--- a/src/text_format/lexer/json_number_lit.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use std::fmt;
-
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct JsonNumberLit(pub(crate) String);
-
-impl fmt::Display for JsonNumberLit {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        fmt::Display::fmt(&self.0, f)
-    }
-}
diff --git a/src/text_format/lexer/lexer_impl.rs b/src/text_format/lexer/lexer_impl.rs
deleted file mode 100644
index ae9035a..0000000
--- a/src/text_format/lexer/lexer_impl.rs
+++ /dev/null
@@ -1,726 +0,0 @@
-use std::char;
-use std::convert::TryFrom;
-use std::f64;
-use std::fmt;
-use std::num::ParseFloatError;
-use std::num::ParseIntError;
-
-use super::float;
-use super::loc::Loc;
-use super::loc::FIRST_COL;
-use super::str_lit::StrLit;
-use super::str_lit::StrLitDecodeError;
-use super::token::Token;
-use super::token::TokenWithLocation;
-use super::ParserLanguage;
-use crate::text_format::lexer::JsonNumberLit;
-
-#[derive(Debug)]
-pub enum LexerError {
-    IncorrectInput, // TODO: something better than this
-    UnexpectedEof,
-    ExpectChar(char),
-    ParseIntError,
-    ParseFloatError,
-    IncorrectFloatLit, // TODO: how it is different from ParseFloatError?
-    IncorrectJsonEscape,
-    IncorrectJsonNumber,
-    IncorrectUnicodeChar,
-    ExpectHexDigit,
-    ExpectOctDigit,
-    ExpectDecDigit,
-    StrLitDecodeError(StrLitDecodeError),
-    ExpectedIdent,
-}
-
-impl fmt::Display for LexerError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        match self {
-            LexerError::IncorrectInput => write!(f, "Incorrect input"),
-            LexerError::UnexpectedEof => write!(f, "Unexpected EOF"),
-            LexerError::ExpectChar(c) => write!(f, "Expecting char: {}", c),
-            LexerError::ParseIntError => write!(f, "Parse int error"),
-            LexerError::ParseFloatError => write!(f, "Parse float error"),
-            LexerError::IncorrectFloatLit => write!(f, "Incorrect float literal"),
-            LexerError::IncorrectJsonEscape => write!(f, "Incorrect JSON escape"),
-            LexerError::IncorrectJsonNumber => write!(f, "Incorrect JSON number"),
-            LexerError::IncorrectUnicodeChar => write!(f, "Incorrect Unicode char"),
-            LexerError::ExpectHexDigit => write!(f, "Expecting hex digit"),
-            LexerError::ExpectOctDigit => write!(f, "Expecting oct digit"),
-            LexerError::ExpectDecDigit => write!(f, "Expecting dec digit"),
-            LexerError::StrLitDecodeError(e) => write!(f, "{}", e),
-            LexerError::ExpectedIdent => write!(f, "Expecting identifier"),
-        }
-    }
-}
-
-impl std::error::Error for LexerError {}
-
-pub type LexerResult<T> = Result<T, LexerError>;
-
-impl From<StrLitDecodeError> for LexerError {
-    fn from(e: StrLitDecodeError) -> Self {
-        LexerError::StrLitDecodeError(e)
-    }
-}
-
-impl From<ParseIntError> for LexerError {
-    fn from(_: ParseIntError) -> Self {
-        LexerError::ParseIntError
-    }
-}
-
-impl From<ParseFloatError> for LexerError {
-    fn from(_: ParseFloatError) -> Self {
-        LexerError::ParseFloatError
-    }
-}
-
-impl From<float::ProtobufFloatParseError> for LexerError {
-    fn from(_: float::ProtobufFloatParseError) -> Self {
-        LexerError::IncorrectFloatLit
-    }
-}
-
-#[derive(Copy, Clone)]
-pub struct Lexer<'a> {
-    language: ParserLanguage,
-    input: &'a str,
-    pos: usize,
-    pub loc: Loc,
-}
-
-fn is_letter(c: char) -> bool {
-    c.is_alphabetic() || c == '_'
-}
-
-impl<'a> Lexer<'a> {
-    pub fn new(input: &'a str, language: ParserLanguage) -> Lexer<'a> {
-        Lexer {
-            language,
-            input,
-            pos: 0,
-            loc: Loc::start(),
-        }
-    }
-
-    /// No more chars
-    pub fn eof(&self) -> bool {
-        self.pos == self.input.len()
-    }
-
-    /// Remaining chars
-    fn rem_chars(&self) -> &'a str {
-        &self.input[self.pos..]
-    }
-
-    pub fn lookahead_char_is<P: FnOnce(char) -> bool>(&self, p: P) -> bool {
-        self.lookahead_char().map_or(false, p)
-    }
-
-    fn lookahead_char_is_in(&self, alphabet: &str) -> bool {
-        self.lookahead_char_is(|c| alphabet.contains(c))
-    }
-
-    fn next_char_opt(&mut self) -> Option<char> {
-        let rem = self.rem_chars();
-        if rem.is_empty() {
-            None
-        } else {
-            let mut char_indices = rem.char_indices();
-            let (_, c) = char_indices.next().unwrap();
-            let c_len = char_indices.next().map(|(len, _)| len).unwrap_or(rem.len());
-            self.pos += c_len;
-            if c == '\n' {
-                self.loc.line += 1;
-                self.loc.col = FIRST_COL;
-            } else {
-                self.loc.col += 1;
-            }
-            Some(c)
-        }
-    }
-
-    fn next_char(&mut self) -> LexerResult<char> {
-        self.next_char_opt().ok_or(LexerError::UnexpectedEof)
-    }
-
-    /// Skip whitespaces
-    fn skip_whitespaces(&mut self) {
-        self.take_while(|c| c.is_whitespace());
-    }
-
-    fn skip_c_comment(&mut self) -> LexerResult<()> {
-        if self.skip_if_lookahead_is_str("/*") {
-            let end = "*/";
-            match self.rem_chars().find(end) {
-                None => Err(LexerError::UnexpectedEof),
-                Some(len) => {
-                    let new_pos = self.pos + len + end.len();
-                    self.skip_to_pos(new_pos);
-                    Ok(())
-                }
-            }
-        } else {
-            Ok(())
-        }
-    }
-
-    fn skip_cpp_comment(&mut self) {
-        if self.skip_if_lookahead_is_str("//") {
-            loop {
-                match self.next_char_opt() {
-                    Some('\n') | None => break,
-                    _ => {}
-                }
-            }
-        }
-    }
-
-    fn skip_sh_comment(&mut self) {
-        if self.skip_if_lookahead_is_str("#") {
-            loop {
-                match self.next_char_opt() {
-                    Some('\n') | None => break,
-                    _ => {}
-                }
-            }
-        }
-    }
-
-    fn skip_comment(&mut self) -> LexerResult<()> {
-        match self.language {
-            ParserLanguage::Proto => {
-                self.skip_c_comment()?;
-                self.skip_cpp_comment();
-            }
-            ParserLanguage::TextFormat => {
-                self.skip_sh_comment();
-            }
-            ParserLanguage::Json => {}
-        }
-        Ok(())
-    }
-
-    pub fn skip_ws(&mut self) -> LexerResult<()> {
-        loop {
-            let pos = self.pos;
-            self.skip_whitespaces();
-            self.skip_comment()?;
-            if pos == self.pos {
-                // Did not advance
-                return Ok(());
-            }
-        }
-    }
-
-    pub fn take_while<F>(&mut self, f: F) -> &'a str
-    where
-        F: Fn(char) -> bool,
-    {
-        let start = self.pos;
-        while self.lookahead_char().map(&f) == Some(true) {
-            self.next_char_opt().unwrap();
-        }
-        let end = self.pos;
-        &self.input[start..end]
-    }
-
-    fn lookahead_char(&self) -> Option<char> {
-        self.clone().next_char_opt()
-    }
-
-    fn lookahead_is_str(&self, s: &str) -> bool {
-        self.rem_chars().starts_with(s)
-    }
-
-    fn skip_if_lookahead_is_str(&mut self, s: &str) -> bool {
-        if self.lookahead_is_str(s) {
-            let new_pos = self.pos + s.len();
-            self.skip_to_pos(new_pos);
-            true
-        } else {
-            false
-        }
-    }
-
-    fn next_char_if<P>(&mut self, p: P) -> Option<char>
-    where
-        P: FnOnce(char) -> bool,
-    {
-        let mut clone = self.clone();
-        match clone.next_char_opt() {
-            Some(c) if p(c) => {
-                *self = clone;
-                Some(c)
-            }
-            _ => None,
-        }
-    }
-
-    pub fn next_char_if_eq(&mut self, expect: char) -> bool {
-        self.next_char_if(|c| c == expect) != None
-    }
-
-    fn next_char_if_in(&mut self, alphabet: &str) -> Option<char> {
-        for c in alphabet.chars() {
-            if self.next_char_if_eq(c) {
-                return Some(c);
-            }
-        }
-        None
-    }
-
-    fn next_char_expect_eq(&mut self, expect: char) -> LexerResult<()> {
-        if self.next_char_if_eq(expect) {
-            Ok(())
-        } else {
-            Err(LexerError::ExpectChar(expect))
-        }
-    }
-
-    fn next_char_expect<P>(&mut self, expect: P, err: LexerError) -> LexerResult<char>
-    where
-        P: FnOnce(char) -> bool,
-    {
-        self.next_char_if(expect).ok_or(err)
-    }
-
-    // str functions
-
-    /// properly update line and column
-    fn skip_to_pos(&mut self, new_pos: usize) -> &'a str {
-        assert!(new_pos >= self.pos);
-        assert!(new_pos <= self.input.len());
-        let pos = self.pos;
-        while self.pos != new_pos {
-            self.next_char_opt().unwrap();
-        }
-        &self.input[pos..new_pos]
-    }
-
-    // Protobuf grammar
-
-    // char functions
-
-    // letter = "A" … "Z" | "a" … "z"
-    // https://github.com/google/protobuf/issues/4565
-    fn next_letter_opt(&mut self) -> Option<char> {
-        self.next_char_if(is_letter)
-    }
-
-    // capitalLetter =  "A" … "Z"
-    fn _next_capital_letter_opt(&mut self) -> Option<char> {
-        self.next_char_if(|c| c >= 'A' && c <= 'Z')
-    }
-
-    fn next_ident_part(&mut self) -> Option<char> {
-        self.next_char_if(|c| c.is_ascii_alphanumeric() || c == '_')
-    }
-
-    // Identifiers
-
-    // ident = letter { letter | decimalDigit | "_" }
-    fn next_ident_opt(&mut self) -> LexerResult<Option<String>> {
-        if let Some(c) = self.next_letter_opt() {
-            let mut ident = String::new();
-            ident.push(c);
-            while let Some(c) = self.next_ident_part() {
-                ident.push(c);
-            }
-            Ok(Some(ident))
-        } else {
-            Ok(None)
-        }
-    }
-
-    // Integer literals
-
-    // hexLit     = "0" ( "x" | "X" ) hexDigit { hexDigit }
-    fn next_hex_lit_opt(&mut self) -> LexerResult<Option<u64>> {
-        Ok(
-            if self.skip_if_lookahead_is_str("0x") || self.skip_if_lookahead_is_str("0X") {
-                let s = self.take_while(|c| c.is_ascii_hexdigit());
-                Some(u64::from_str_radix(s, 16)? as u64)
-            } else {
-                None
-            },
-        )
-    }
-
-    // decimalLit = ( "1" … "9" ) { decimalDigit }
-    // octalLit   = "0" { octalDigit }
-    fn next_decimal_octal_lit_opt(&mut self) -> LexerResult<Option<u64>> {
-        // do not advance on number parse error
-        let mut clone = self.clone();
-
-        let pos = clone.pos;
-
-        Ok(if clone.next_char_if(|c| c.is_ascii_digit()) != None {
-            clone.take_while(|c| c.is_ascii_digit());
-            let value = clone.input[pos..clone.pos].parse()?;
-            *self = clone;
-            Some(value)
-        } else {
-            None
-        })
-    }
-
-    // hexDigit     = "0" … "9" | "A" … "F" | "a" … "f"
-    fn next_hex_digit(&mut self) -> LexerResult<u32> {
-        let mut clone = self.clone();
-        let r = match clone.next_char()? {
-            c if c >= '0' && c <= '9' => c as u32 - b'0' as u32,
-            c if c >= 'A' && c <= 'F' => c as u32 - b'A' as u32 + 10,
-            c if c >= 'a' && c <= 'f' => c as u32 - b'a' as u32 + 10,
-            _ => return Err(LexerError::ExpectHexDigit),
-        };
-        *self = clone;
-        Ok(r)
-    }
-
-    // octalDigit   = "0" … "7"
-    fn next_octal_digit(&mut self) -> LexerResult<u32> {
-        self.next_char_expect(|c| c >= '0' && c <= '9', LexerError::ExpectOctDigit)
-            .map(|c| c as u32 - '0' as u32)
-    }
-
-    // decimalDigit = "0" … "9"
-    fn next_decimal_digit(&mut self) -> LexerResult<u32> {
-        self.next_char_expect(|c| c >= '0' && c <= '9', LexerError::ExpectDecDigit)
-            .map(|c| c as u32 - '0' as u32)
-    }
-
-    // decimals  = decimalDigit { decimalDigit }
-    fn next_decimal_digits(&mut self) -> LexerResult<()> {
-        self.next_decimal_digit()?;
-        self.take_while(|c| c >= '0' && c <= '9');
-        Ok(())
-    }
-
-    // intLit     = decimalLit | octalLit | hexLit
-    pub fn next_int_lit_opt(&mut self) -> LexerResult<Option<u64>> {
-        assert_ne!(ParserLanguage::Json, self.language);
-
-        self.skip_ws()?;
-        if let Some(i) = self.next_hex_lit_opt()? {
-            return Ok(Some(i));
-        }
-        if let Some(i) = self.next_decimal_octal_lit_opt()? {
-            return Ok(Some(i));
-        }
-        Ok(None)
-    }
-
-    // Floating-point literals
-
-    // exponent  = ( "e" | "E" ) [ "+" | "-" ] decimals
-    fn next_exponent_opt(&mut self) -> LexerResult<Option<()>> {
-        if self.next_char_if_in("eE") != None {
-            self.next_char_if_in("+-");
-            self.next_decimal_digits()?;
-            Ok(Some(()))
-        } else {
-            Ok(None)
-        }
-    }
-
-    // floatLit = ( decimals "." [ decimals ] [ exponent ] | decimals exponent | "."decimals [ exponent ] ) | "inf" | "nan"
-    fn next_float_lit(&mut self) -> LexerResult<()> {
-        assert_ne!(ParserLanguage::Json, self.language);
-
-        // "inf" and "nan" are handled as part of ident
-        if self.next_char_if_eq('.') {
-            self.next_decimal_digits()?;
-            self.next_exponent_opt()?;
-        } else {
-            self.next_decimal_digits()?;
-            if self.next_char_if_eq('.') {
-                self.next_decimal_digits()?;
-                self.next_exponent_opt()?;
-            } else {
-                if self.next_exponent_opt()? == None {
-                    return Err(LexerError::IncorrectFloatLit);
-                }
-            }
-        }
-        Ok(())
-    }
-
-    // String literals
-
-    // charValue = hexEscape | octEscape | charEscape | /[^\0\n\\]/
-    // hexEscape = '\' ( "x" | "X" ) hexDigit hexDigit
-    // https://github.com/google/protobuf/issues/4560
-    // octEscape = '\' octalDigit octalDigit octalDigit
-    // charEscape = '\' ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | '\' | "'" | '"' )
-    // quote = "'" | '"'
-    pub fn next_byte_value(&mut self) -> LexerResult<u8> {
-        match self.next_char()? {
-            '\\' => {
-                match self.next_char()? {
-                    '\'' => Ok(b'\''),
-                    '"' => Ok(b'"'),
-                    '\\' => Ok(b'\\'),
-                    'a' => Ok(b'\x07'),
-                    'b' => Ok(b'\x08'),
-                    'f' => Ok(b'\x0c'),
-                    'n' => Ok(b'\n'),
-                    'r' => Ok(b'\r'),
-                    't' => Ok(b'\t'),
-                    'v' => Ok(b'\x0b'),
-                    'x' => {
-                        let d1 = self.next_hex_digit()? as u8;
-                        let d2 = self.next_hex_digit()? as u8;
-                        Ok(((d1 << 4) | d2) as u8)
-                    }
-                    d if d >= '0' && d <= '7' => {
-                        let mut r = d as u8 - b'0';
-                        for _ in 0..2 {
-                            match self.next_octal_digit() {
-                                Err(_) => break,
-                                Ok(d) => r = (r << 3) + d as u8,
-                            }
-                        }
-                        Ok(r)
-                    }
-                    // https://github.com/google/protobuf/issues/4562
-                    // TODO: overflow
-                    c => Ok(c as u8),
-                }
-            }
-            '\n' | '\0' => Err(LexerError::IncorrectInput),
-            // TODO: check overflow
-            c => Ok(c as u8),
-        }
-    }
-
-    fn char_try_from(i: u32) -> LexerResult<char> {
-        char::try_from(i).map_err(|_| LexerError::IncorrectUnicodeChar)
-    }
-
-    pub fn next_json_char_value(&mut self) -> LexerResult<char> {
-        match self.next_char()? {
-            '\\' => match self.next_char()? {
-                '"' => Ok('"'),
-                '\'' => Ok('\''),
-                '\\' => Ok('\\'),
-                '/' => Ok('/'),
-                'b' => Ok('\x08'),
-                'f' => Ok('\x0c'),
-                'n' => Ok('\n'),
-                'r' => Ok('\r'),
-                't' => Ok('\t'),
-                'u' => {
-                    let mut v = 0;
-                    for _ in 0..4 {
-                        let digit = self.next_hex_digit()?;
-                        v = v * 16 + digit;
-                    }
-                    Self::char_try_from(v)
-                }
-                _ => Err(LexerError::IncorrectJsonEscape),
-            },
-            c => Ok(c),
-        }
-    }
-
-    // https://github.com/google/protobuf/issues/4564
-    // strLit = ( "'" { charValue } "'" ) | ( '"' { charValue } '"' )
-    fn next_str_lit_raw(&mut self) -> LexerResult<String> {
-        let mut raw = String::new();
-
-        let mut first = true;
-        loop {
-            if !first {
-                self.skip_ws()?;
-            }
-
-            let start = self.pos;
-
-            let q = match self.next_char_if_in("'\"") {
-                Some(q) => q,
-                None if !first => break,
-                None => return Err(LexerError::IncorrectInput),
-            };
-            first = false;
-            while self.lookahead_char() != Some(q) {
-                self.next_byte_value()?;
-            }
-            self.next_char_expect_eq(q)?;
-
-            raw.push_str(&self.input[start + 1..self.pos - 1]);
-        }
-        Ok(raw)
-    }
-
-    fn next_str_lit_raw_opt(&mut self) -> LexerResult<Option<String>> {
-        if self.lookahead_char_is_in("'\"") {
-            Ok(Some(self.next_str_lit_raw()?))
-        } else {
-            Ok(None)
-        }
-    }
-
-    /// Parse next token as JSON number
-    fn next_json_number_opt(&mut self) -> LexerResult<Option<JsonNumberLit>> {
-        assert_eq!(ParserLanguage::Json, self.language);
-
-        fn is_digit(c: char) -> bool {
-            c >= '0' && c <= '9'
-        }
-
-        fn is_digit_1_9(c: char) -> bool {
-            c >= '1' && c <= '9'
-        }
-
-        if !self.lookahead_char_is_in("-0123456789") {
-            return Ok(None);
-        }
-
-        let mut s = String::new();
-        if self.next_char_if_eq('-') {
-            s.push('-');
-        }
-
-        if self.next_char_if_eq('0') {
-            s.push('0');
-        } else {
-            s.push(self.next_char_expect(is_digit_1_9, LexerError::IncorrectJsonNumber)?);
-            while let Some(c) = self.next_char_if(is_digit) {
-                s.push(c);
-            }
-        }
-
-        if self.next_char_if_eq('.') {
-            s.push('.');
-            s.push(self.next_char_expect(is_digit, LexerError::IncorrectJsonNumber)?);
-            while let Some(c) = self.next_char_if(is_digit) {
-                s.push(c);
-            }
-        }
-
-        if let Some(c) = self.next_char_if_in("eE") {
-            s.push(c);
-            if let Some(c) = self.next_char_if_in("+-") {
-                s.push(c);
-            }
-            s.push(self.next_char_expect(is_digit, LexerError::IncorrectJsonNumber)?);
-            while let Some(c) = self.next_char_if(is_digit) {
-                s.push(c);
-            }
-        }
-
-        Ok(Some(JsonNumberLit(s)))
-    }
-
-    fn next_token_inner(&mut self) -> LexerResult<Token> {
-        if self.language == ParserLanguage::Json {
-            if let Some(v) = self.next_json_number_opt()? {
-                return Ok(Token::JsonNumber(v));
-            }
-        }
-
-        if let Some(ident) = self.next_ident_opt()? {
-            let token = if self.language != ParserLanguage::Json && ident == float::PROTOBUF_NAN {
-                Token::FloatLit(f64::NAN)
-            } else if self.language != ParserLanguage::Json && ident == float::PROTOBUF_INF {
-                Token::FloatLit(f64::INFINITY)
-            } else {
-                Token::Ident(ident.to_owned())
-            };
-            return Ok(token);
-        }
-
-        if self.language != ParserLanguage::Json {
-            let mut clone = self.clone();
-            let pos = clone.pos;
-            if let Ok(_) = clone.next_float_lit() {
-                let f = float::parse_protobuf_float(&self.input[pos..clone.pos])?;
-                *self = clone;
-                return Ok(Token::FloatLit(f));
-            }
-
-            if let Some(lit) = self.next_int_lit_opt()? {
-                return Ok(Token::IntLit(lit));
-            }
-        }
-
-        if let Some(escaped) = self.next_str_lit_raw_opt()? {
-            return Ok(Token::StrLit(StrLit { escaped }));
-        }
-
-        // This branch must be after str lit
-        if let Some(c) = self.next_char_if(|c| c.is_ascii_punctuation()) {
-            return Ok(Token::Symbol(c));
-        }
-
-        if let Some(ident) = self.next_ident_opt()? {
-            return Ok(Token::Ident(ident));
-        }
-
-        Err(LexerError::IncorrectInput)
-    }
-
-    pub fn next_token(&mut self) -> LexerResult<Option<TokenWithLocation>> {
-        self.skip_ws()?;
-        let loc = self.loc;
-
-        Ok(if self.eof() {
-            None
-        } else {
-            let token = self.next_token_inner()?;
-            // Skip whitespace here to update location
-            // to the beginning of the next token
-            self.skip_ws()?;
-            Some(TokenWithLocation { token, loc })
-        })
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-
-    fn lex<P, R>(input: &str, parse_what: P) -> R
-    where
-        P: FnOnce(&mut Lexer) -> LexerResult<R>,
-    {
-        let mut lexer = Lexer::new(input, ParserLanguage::Proto);
-        let r = parse_what(&mut lexer).expect(&format!("lexer failed at {}", lexer.loc));
-        assert!(lexer.eof(), "check eof failed at {}", lexer.loc);
-        r
-    }
-
-    fn lex_opt<P, R>(input: &str, parse_what: P) -> R
-    where
-        P: FnOnce(&mut Lexer) -> LexerResult<Option<R>>,
-    {
-        let mut lexer = Lexer::new(input, ParserLanguage::Proto);
-        let o = parse_what(&mut lexer).expect(&format!("lexer failed at {}", lexer.loc));
-        let r = o.expect(&format!("lexer returned none at {}", lexer.loc));
-        assert!(lexer.eof(), "check eof failed at {}", lexer.loc);
-        r
-    }
-
-    #[test]
-    fn test_lexer_int_lit() {
-        let msg = r#"10"#;
-        let mess = lex_opt(msg, |p| p.next_int_lit_opt());
-        assert_eq!(10, mess);
-    }
-
-    #[test]
-    fn test_lexer_float_lit() {
-        let msg = r#"12.3"#;
-        let mess = lex(msg, |p| p.next_token_inner());
-        assert_eq!(Token::FloatLit(12.3), mess);
-    }
-
-    #[test]
-    fn test_lexer_float_lit_leading_zeros_in_exp() {
-        let msg = r#"1e00009"#;
-        let mess = lex(msg, |p| p.next_token_inner());
-        assert_eq!(Token::FloatLit(1_000_000_000.0), mess);
-    }
-}
diff --git a/src/text_format/lexer/loc.rs b/src/text_format/lexer/loc.rs
deleted file mode 100644
index ea3fc1a..0000000
--- a/src/text_format/lexer/loc.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-use std::fmt;
-
-pub const FIRST_LINE: u32 = 1;
-pub const FIRST_COL: u32 = 1;
-
-/// Location in file
-#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
-pub struct Loc {
-    /// 1-based
-    pub line: u32,
-    /// 1-based
-    pub col: u32,
-}
-
-impl fmt::Display for Loc {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}:{}", self.line, self.col)
-    }
-}
-
-impl Loc {
-    pub fn start() -> Loc {
-        Loc {
-            line: FIRST_LINE,
-            col: FIRST_COL,
-        }
-    }
-}
diff --git a/src/text_format/lexer/mod.rs b/src/text_format/lexer/mod.rs
deleted file mode 100644
index a7ed884..0000000
--- a/src/text_format/lexer/mod.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-//! Implementation of lexer for both protobuf parser and for text format parser.
-
-pub mod float;
-mod json_number_lit;
-mod lexer_impl;
-mod loc;
-mod num_lit;
-mod parser_language;
-mod str_lit;
-mod token;
-
-pub use self::json_number_lit::JsonNumberLit;
-pub use self::lexer_impl::Lexer;
-pub use self::lexer_impl::LexerError;
-pub use self::loc::Loc;
-pub use self::num_lit::NumLit;
-pub use self::parser_language::ParserLanguage;
-pub use self::str_lit::StrLit;
-pub use self::str_lit::StrLitDecodeError;
-pub use self::token::Token;
-pub use self::token::TokenWithLocation;
diff --git a/src/text_format/lexer/num_lit.rs b/src/text_format/lexer/num_lit.rs
deleted file mode 100644
index cc64cc4..0000000
--- a/src/text_format/lexer/num_lit.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-#[derive(Copy, Clone)]
-pub enum NumLit {
-    U64(u64),
-    F64(f64),
-}
diff --git a/src/text_format/lexer/parser_language.rs b/src/text_format/lexer/parser_language.rs
deleted file mode 100644
index e356571..0000000
--- a/src/text_format/lexer/parser_language.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-/// We use the same lexer/tokenizer for all parsers for simplicity
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-pub enum ParserLanguage {
-    // `.proto` files
-    Proto,
-    // Protobuf text format
-    TextFormat,
-    // JSON
-    Json,
-}
diff --git a/src/text_format/lexer/str_lit.rs b/src/text_format/lexer/str_lit.rs
deleted file mode 100644
index 15ffa5b..0000000
--- a/src/text_format/lexer/str_lit.rs
+++ /dev/null
@@ -1,86 +0,0 @@
-use std::fmt;
-use std::string::FromUtf8Error;
-
-use super::lexer_impl::Lexer;
-use super::lexer_impl::LexerError;
-use crate::text_format::lexer::ParserLanguage;
-
-#[derive(Debug)]
-pub enum StrLitDecodeError {
-    FromUtf8Error(FromUtf8Error),
-    // TODO: be more specific
-    OtherError,
-}
-
-impl fmt::Display for StrLitDecodeError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        match self {
-            StrLitDecodeError::FromUtf8Error(e) => write!(f, "{}", e),
-            StrLitDecodeError::OtherError => write!(f, "String literal decode error"),
-        }
-    }
-}
-
-impl std::error::Error for StrLitDecodeError {}
-
-impl From<LexerError> for StrLitDecodeError {
-    fn from(_: LexerError) -> Self {
-        StrLitDecodeError::OtherError
-    }
-}
-
-impl From<FromUtf8Error> for StrLitDecodeError {
-    fn from(e: FromUtf8Error) -> Self {
-        StrLitDecodeError::FromUtf8Error(e)
-    }
-}
-
-pub type StrLitDecodeResult<T> = Result<T, StrLitDecodeError>;
-
-/// String literal, both `string` and `bytes`.
-#[derive(Clone, Eq, PartialEq, Debug)]
-pub struct StrLit {
-    pub escaped: String,
-}
-
-impl StrLit {
-    /// May fail if not valid UTF8
-    pub fn decode_utf8(&self) -> StrLitDecodeResult<String> {
-        let mut lexer = Lexer::new(&self.escaped, ParserLanguage::Json);
-        let mut r = Vec::new();
-        while !lexer.eof() {
-            r.push(lexer.next_byte_value()?);
-        }
-        Ok(String::from_utf8(r)?)
-    }
-
-    pub fn decode_bytes(&self) -> StrLitDecodeResult<Vec<u8>> {
-        let mut lexer = Lexer::new(&self.escaped, ParserLanguage::Json);
-        let mut r = Vec::new();
-        while !lexer.eof() {
-            r.push(lexer.next_byte_value()?);
-        }
-        Ok(r)
-    }
-
-    pub fn quoted(&self) -> String {
-        format!("\"{}\"", self.escaped)
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use crate::text_format::lexer::StrLit;
-
-    #[test]
-    fn decode_utf8() {
-        assert_eq!(
-            "\u{1234}".to_owned(),
-            StrLit {
-                escaped: "\\341\\210\\264".to_owned()
-            }
-            .decode_utf8()
-            .unwrap()
-        )
-    }
-}
diff --git a/src/text_format/lexer/token.rs b/src/text_format/lexer/token.rs
deleted file mode 100644
index 55d931a..0000000
--- a/src/text_format/lexer/token.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-use super::lexer_impl::LexerError;
-use super::lexer_impl::LexerResult;
-use super::loc::Loc;
-use super::num_lit::NumLit;
-use super::str_lit::StrLit;
-use crate::text_format::lexer::JsonNumberLit;
-
-#[derive(Clone, Debug, PartialEq)]
-pub enum Token {
-    Ident(String),
-    Symbol(char),
-    // Protobuf tokenizer has separate tokens for int and float.
-    // Tokens do not include sign.
-    IntLit(u64),
-    FloatLit(f64),
-    JsonNumber(JsonNumberLit),
-    // including quotes
-    StrLit(StrLit),
-}
-
-impl Token {
-    /// Back to original
-    pub fn format(&self) -> String {
-        match self {
-            &Token::Ident(ref s) => s.clone(),
-            &Token::Symbol(c) => c.to_string(),
-            &Token::IntLit(ref i) => i.to_string(),
-            &Token::StrLit(ref s) => s.quoted(),
-            &Token::FloatLit(ref f) => f.to_string(),
-            &Token::JsonNumber(ref f) => f.to_string(),
-        }
-    }
-
-    pub fn to_num_lit(&self) -> LexerResult<NumLit> {
-        match self {
-            &Token::IntLit(i) => Ok(NumLit::U64(i)),
-            &Token::FloatLit(f) => Ok(NumLit::F64(f)),
-            _ => Err(LexerError::IncorrectInput),
-        }
-    }
-}
-
-#[derive(Clone)]
-pub struct TokenWithLocation {
-    pub token: Token,
-    pub loc: Loc,
-}
diff --git a/src/text_format/mod.rs b/src/text_format/mod.rs
index 2fa9a16..4ae5372 100644
--- a/src/text_format/mod.rs
+++ b/src/text_format/mod.rs
@@ -1,4 +1,4 @@
-//! Protobuf "text format" implementation.
+//! # Protobuf "text format" implementation.
 //!
 //! Text format message look like this:
 //!
@@ -18,290 +18,20 @@
 //! This format is not specified, but it is implemented by all official
 //! protobuf implementations, including `protoc` command which can decode
 //! and encode messages using text format.
+//!
+//! # JSON
+//!
+//! rust-protobuf also supports JSON printing and parsing.
+//! It is implemented in
+//! [`protobuf-json-mapping` crate](https://docs.rs/protobuf-json-mapping/%3E=3.0.0-alpha).
 
-use std;
-use std::fmt;
-use std::fmt::Write;
-
-use crate::message::Message;
-use crate::reflect::ReflectFieldRef;
-use crate::reflect::ReflectValueRef;
-
+mod parse;
 mod print;
 
-// Used by text format parser and by pure-rust codegen parsed
-// this it is public but hidden module.
-// https://github.com/rust-lang/rust/issues/44663
-#[doc(hidden)]
-pub mod lexer;
-
-use self::print::print_str_to;
-#[doc(hidden)]
-pub use self::print::quote_bytes_to;
-#[doc(hidden)]
-pub use self::print::quote_escape_bytes;
-use crate::text_format::print::quote_escape_bytes_to;
-
-#[doc(hidden)]
-pub fn unescape_string(string: &str) -> Vec<u8> {
-    fn parse_if_digit(chars: &mut std::str::Chars) -> u8 {
-        let mut copy = chars.clone();
-        let f = match copy.next() {
-            None => return 0,
-            Some(f) => f,
-        };
-        let d = match f {
-            '0'..='9' => (f as u8 - b'0'),
-            _ => return 0,
-        };
-        *chars = copy;
-        d
-    }
-
-    fn parse_hex_digit(chars: &mut std::str::Chars) -> u8 {
-        match chars.next().unwrap() {
-            c @ '0'..='9' => (c as u8) - b'0',
-            c @ 'a'..='f' => (c as u8) - b'a' + 10,
-            c @ 'A'..='F' => (c as u8) - b'A' + 10,
-            _ => panic!("incorrect hex escape"),
-        }
-    }
-
-    fn parse_escape_rem(chars: &mut std::str::Chars) -> u8 {
-        let n = chars.next().unwrap();
-        match n {
-            'a' => return b'\x07',
-            'b' => return b'\x08',
-            'f' => return b'\x0c',
-            'n' => return b'\n',
-            'r' => return b'\r',
-            't' => return b'\t',
-            'v' => return b'\x0b',
-            '"' => return b'"',
-            '\'' => return b'\'',
-            '0'..='9' => {
-                let d1 = n as u8 - b'0';
-                let d2 = parse_if_digit(chars);
-                let d3 = parse_if_digit(chars);
-                return (d1 * 64 + d2 * 8 + d3) as u8;
-            }
-            'x' => {
-                let d1 = parse_hex_digit(chars);
-                let d2 = parse_hex_digit(chars);
-                return d1 * 16 + d2;
-            }
-            c => return c as u8, // TODO: validate ASCII
-        };
-    }
-
-    let mut chars = string.chars();
-    let mut r = Vec::new();
-
-    loop {
-        let f = match chars.next() {
-            None => return r,
-            Some(f) => f,
-        };
-
-        if f == '\\' {
-            r.push(parse_escape_rem(&mut chars));
-        } else {
-            r.push(f as u8); // TODO: escape UTF-8
-        }
-    }
-}
-
-fn do_indent(buf: &mut String, pretty: bool, indent: usize) {
-    if pretty && indent > 0 {
-        for _ in 0..indent {
-            buf.push_str("  ");
-        }
-    }
-}
-
-fn print_start_field(
-    buf: &mut String,
-    pretty: bool,
-    indent: usize,
-    first: &mut bool,
-    field_name: &str,
-) {
-    if !*first && !pretty {
-        buf.push_str(" ");
-    }
-    do_indent(buf, pretty, indent);
-    *first = false;
-    buf.push_str(field_name);
-}
-
-fn print_end_field(buf: &mut String, pretty: bool) {
-    if pretty {
-        buf.push_str("\n");
-    }
-}
-
-fn print_field(
-    buf: &mut String,
-    pretty: bool,
-    indent: usize,
-    first: &mut bool,
-    field_name: &str,
-    value: ReflectValueRef,
-) {
-    print_start_field(buf, pretty, indent, first, field_name);
-
-    match value {
-        ReflectValueRef::Message(m) => {
-            buf.push_str(" {");
-            if pretty {
-                buf.push_str("\n");
-            }
-            print_to_internal(m, buf, pretty, indent + 1);
-            do_indent(buf, pretty, indent);
-            buf.push_str("}");
-        }
-        ReflectValueRef::Enum(e) => {
-            buf.push_str(": ");
-            buf.push_str(e.name());
-        }
-        ReflectValueRef::String(s) => {
-            buf.push_str(": ");
-            print_str_to(s, buf);
-        }
-        ReflectValueRef::Bytes(b) => {
-            buf.push_str(": ");
-            quote_escape_bytes_to(b, buf);
-        }
-        ReflectValueRef::I32(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-        ReflectValueRef::I64(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-        ReflectValueRef::U32(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-        ReflectValueRef::U64(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-        ReflectValueRef::Bool(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-        ReflectValueRef::F32(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-        ReflectValueRef::F64(v) => {
-            write!(buf, ": {}", v).unwrap();
-        }
-    }
-
-    print_end_field(buf, pretty);
-}
-
-fn print_to_internal(m: &dyn Message, buf: &mut String, pretty: bool, indent: usize) {
-    let d = m.descriptor();
-    let mut first = true;
-    for f in d.fields() {
-        match f.get_reflect(m) {
-            ReflectFieldRef::Map(map) => {
-                for (k, v) in map {
-                    print_start_field(buf, pretty, indent, &mut first, f.name());
-                    buf.push_str(" {");
-                    if pretty {
-                        buf.push_str("\n");
-                    }
-
-                    let mut entry_first = true;
-
-                    print_field(buf, pretty, indent + 1, &mut entry_first, "key", k.as_ref());
-                    print_field(
-                        buf,
-                        pretty,
-                        indent + 1,
-                        &mut entry_first,
-                        "value",
-                        v.as_ref(),
-                    );
-                    do_indent(buf, pretty, indent);
-                    buf.push_str("}");
-                    print_end_field(buf, pretty);
-                }
-            }
-            ReflectFieldRef::Repeated(repeated) => {
-                // TODO: do not print zeros for v3
-                for v in repeated {
-                    print_field(buf, pretty, indent, &mut first, f.name(), v.as_ref());
-                }
-            }
-            ReflectFieldRef::Optional(optional) => {
-                if let Some(v) = optional {
-                    print_field(buf, pretty, indent, &mut first, f.name(), v);
-                }
-            }
-        }
-    }
-
-    // TODO: unknown fields
-}
-
-/// Text-format
-pub fn print_to(m: &dyn Message, buf: &mut String) {
-    print_to_internal(m, buf, false, 0)
-}
-
-fn print_to_string_internal(m: &dyn Message, pretty: bool) -> String {
-    let mut r = String::new();
-    print_to_internal(m, &mut r, pretty, 0);
-    r.to_string()
-}
-
-/// Text-format
-pub fn print_to_string(m: &dyn Message) -> String {
-    print_to_string_internal(m, false)
-}
-
-/// Text-format to `fmt::Formatter`.
-pub fn fmt(m: &dyn Message, f: &mut fmt::Formatter) -> fmt::Result {
-    let pretty = f.alternate();
-    f.write_str(&print_to_string_internal(m, pretty))
-}
-
-#[cfg(test)]
-mod test {
-
-    fn escape(data: &[u8]) -> String {
-        let mut s = String::with_capacity(data.len() * 4);
-        super::quote_bytes_to(data, &mut s);
-        s
-    }
-
-    fn test_escape_unescape(text: &str, escaped: &str) {
-        assert_eq!(text.as_bytes(), &super::unescape_string(escaped)[..]);
-        assert_eq!(escaped, &escape(text.as_bytes())[..]);
-    }
-
-    #[test]
-    fn test_print_to_bytes() {
-        assert_eq!("ab", escape(b"ab"));
-        assert_eq!("a\\\\023", escape(b"a\\023"));
-        assert_eq!("a\\r\\n\\t \\'\\\"\\\\", escape(b"a\r\n\t '\"\\"));
-        assert_eq!("\\344\\275\\240\\345\\245\\275", escape("你好".as_bytes()));
-    }
-
-    #[test]
-    fn test_unescape_string() {
-        test_escape_unescape("", "");
-        test_escape_unescape("aa", "aa");
-        test_escape_unescape("\n", "\\n");
-        test_escape_unescape("\r", "\\r");
-        test_escape_unescape("\t", "\\t");
-        test_escape_unescape("你好", "\\344\\275\\240\\345\\245\\275");
-        // hex
-        assert_eq!(b"aaa\x01bbb", &super::unescape_string("aaa\\x01bbb")[..]);
-        assert_eq!(b"aaa\xcdbbb", &super::unescape_string("aaa\\xCDbbb")[..]);
-        assert_eq!(b"aaa\xcdbbb", &super::unescape_string("aaa\\xCDbbb")[..]);
-        // quotes
-        assert_eq!(b"aaa\"bbb", &super::unescape_string("aaa\\\"bbb")[..]);
-        assert_eq!(b"aaa\'bbb", &super::unescape_string("aaa\\\'bbb")[..]);
-    }
-}
+pub use self::parse::merge_from_str;
+pub use self::parse::parse_from_str;
+pub use self::parse::ParseError;
+pub use self::print::fmt;
+pub use self::print::print_to;
+pub use self::print::print_to_string;
+pub use self::print::print_to_string_pretty;
diff --git a/src/text_format/parse.rs b/src/text_format/parse.rs
new file mode 100644
index 0000000..905f641
--- /dev/null
+++ b/src/text_format/parse.rs
@@ -0,0 +1,321 @@
+use std::str;
+
+use protobuf_support::lexer::int;
+use protobuf_support::lexer::loc::Loc;
+use protobuf_support::lexer::parser_language::ParserLanguage;
+use protobuf_support::lexer::str_lit::StrLitDecodeError;
+use protobuf_support::lexer::tokenizer::Tokenizer;
+use protobuf_support::lexer::tokenizer::TokenizerError;
+
+use crate::message_dyn::MessageDyn;
+use crate::message_full::MessageFull;
+use crate::reflect::EnumDescriptor;
+use crate::reflect::EnumValueDescriptor;
+use crate::reflect::MessageDescriptor;
+use crate::reflect::ReflectValueBox;
+use crate::reflect::RuntimeFieldType;
+use crate::reflect::RuntimeType;
+
+#[derive(Debug, thiserror::Error)]
+pub enum ParseErrorWithoutLoc {
+    #[error(transparent)]
+    TokenizerError(#[from] TokenizerError),
+    #[error(transparent)]
+    StrLitDecodeError(#[from] StrLitDecodeError),
+    #[error("Unknown field: `{}`", .0)]
+    UnknownField(String),
+    #[error("Unknown enum value: `{}`", .0)]
+    UnknownEnumValue(String),
+    #[error("Map field specified more than once: `{}`", .0)]
+    MapFieldIsSpecifiedMoreThanOnce(String),
+    #[error("Integer overflow")]
+    IntegerOverflow,
+    #[error("Expecting bool")]
+    ExpectingBool,
+    #[error("Message not initialized")]
+    MessageNotInitialized,
+}
+
+impl From<int::Overflow> for ParseErrorWithoutLoc {
+    fn from(_: int::Overflow) -> Self {
+        ParseErrorWithoutLoc::IntegerOverflow
+    }
+}
+
+/// Text format parse error.
+#[derive(Debug, thiserror::Error)]
+#[error("{}: {}", loc, error)]
+pub struct ParseError {
+    error: ParseErrorWithoutLoc,
+    loc: Loc,
+}
+
+pub type ParseResult<A> = Result<A, ParseErrorWithoutLoc>;
+pub type ParseWithLocResult<A> = Result<A, ParseError>;
+
+#[derive(Clone)]
+struct Parser<'a> {
+    tokenizer: Tokenizer<'a>,
+}
+
+impl<'a> Parser<'a> {
+    // Text format
+
+    fn next_field_name(&mut self) -> ParseResult<String> {
+        Ok(self.tokenizer.next_ident()?)
+    }
+
+    fn read_colon(&mut self, desc: &'static str) -> ParseResult<()> {
+        Ok(self.tokenizer.next_symbol_expect_eq(':', desc)?)
+    }
+
+    fn read_enum<'e>(&mut self, e: &'e EnumDescriptor) -> ParseResult<EnumValueDescriptor> {
+        self.read_colon("enum")?;
+
+        // TODO: read integer?
+        let ident = self.tokenizer.next_ident()?;
+        let value = match e.value_by_name(&ident) {
+            Some(value) => value,
+            None => return Err(ParseErrorWithoutLoc::UnknownEnumValue(ident)),
+        };
+        Ok(value)
+    }
+
+    fn read_u64(&mut self) -> ParseResult<u64> {
+        self.read_colon("u64")?;
+
+        Ok(self.tokenizer.next_int_lit()?)
+    }
+
+    fn read_u32(&mut self) -> ParseResult<u32> {
+        self.read_colon("int value")?;
+
+        let int_lit = self.tokenizer.next_int_lit()?;
+        let value_u32 = int_lit as u32;
+        if value_u32 as u64 != int_lit {
+            return Err(ParseErrorWithoutLoc::IntegerOverflow);
+        }
+        Ok(value_u32)
+    }
+
+    fn read_i64(&mut self) -> ParseResult<i64> {
+        self.read_colon("int value")?;
+
+        if self.tokenizer.next_symbol_if_eq('-')? {
+            let int_lit = self.tokenizer.next_int_lit()?;
+            Ok(int::neg(int_lit)?)
+        } else {
+            let int_lit = self.tokenizer.next_int_lit()?;
+            if int_lit > i64::MAX as u64 {
+                return Err(ParseErrorWithoutLoc::IntegerOverflow);
+            }
+            Ok(int_lit as i64)
+        }
+    }
+
+    fn read_i32(&mut self) -> ParseResult<i32> {
+        let value = self.read_i64()?;
+        if value < i32::min_value() as i64 || value > i32::max_value() as i64 {
+            return Err(ParseErrorWithoutLoc::IntegerOverflow);
+        }
+        Ok(value as i32)
+    }
+
+    fn read_f64(&mut self) -> ParseResult<f64> {
+        self.read_colon("float value")?;
+
+        let minus = self.tokenizer.next_symbol_if_eq('-')?;
+
+        let value = if let Ok(value) = self.tokenizer.next_int_lit() {
+            value as f64
+        } else {
+            self.tokenizer.next_float_lit()?
+        };
+
+        Ok(if minus { -value } else { value })
+    }
+
+    fn read_f32(&mut self) -> ParseResult<f32> {
+        Ok(self.read_f64()? as f32)
+    }
+
+    fn read_bool(&mut self) -> ParseResult<bool> {
+        self.read_colon("bool value")?;
+
+        if self.tokenizer.next_ident_if_eq("true")? {
+            Ok(true)
+        } else if self.tokenizer.next_ident_if_eq("false")? {
+            Ok(false)
+        } else {
+            Err(ParseErrorWithoutLoc::ExpectingBool)
+        }
+    }
+
+    fn read_string(&mut self) -> ParseResult<String> {
+        self.read_colon("string value")?;
+
+        Ok(self
+            .tokenizer
+            .next_str_lit()
+            .and_then(|s| s.decode_utf8().map_err(From::from))?)
+    }
+
+    fn read_bytes(&mut self) -> ParseResult<Vec<u8>> {
+        self.read_colon("bytes value")?;
+
+        Ok(self
+            .tokenizer
+            .next_str_lit()
+            .and_then(|s| s.decode_bytes().map_err(From::from))?)
+    }
+
+    fn read_message(&mut self, descriptor: &MessageDescriptor) -> ParseResult<Box<dyn MessageDyn>> {
+        let mut message = descriptor.new_instance();
+
+        let symbol = self.tokenizer.next_symbol_expect_eq_oneof(&['{', '<'])?;
+        let terminator = if symbol == '{' { '}' } else { '>' };
+        while !self.tokenizer.lookahead_is_symbol(terminator)? {
+            self.merge_field(&mut *message, descriptor)?;
+        }
+        self.tokenizer
+            .next_symbol_expect_eq(terminator, "message")?;
+        Ok(message)
+    }
+
+    fn read_map_entry(
+        &mut self,
+        k: &RuntimeType,
+        v: &RuntimeType,
+    ) -> ParseResult<(ReflectValueBox, ReflectValueBox)> {
+        let key_field_name: &str = "key";
+        let value_field_name: &str = "value";
+
+        let mut key = None;
+        let mut value = None;
+        self.tokenizer.next_symbol_expect_eq('{', "map entry")?;
+        while !self.tokenizer.lookahead_is_symbol('}')? {
+            let ident = self.next_field_name()?;
+            let (field, field_type) = if ident == key_field_name {
+                (&mut key, k)
+            } else if ident == value_field_name {
+                (&mut value, v)
+            } else {
+                return Err(ParseErrorWithoutLoc::UnknownField(ident));
+            };
+
+            if let Some(..) = *field {
+                return Err(ParseErrorWithoutLoc::MapFieldIsSpecifiedMoreThanOnce(ident));
+            }
+
+            let field_value = self.read_value_of_type(field_type)?;
+
+            *field = Some(field_value);
+        }
+        self.tokenizer.next_symbol_expect_eq('}', "map entry")?;
+        let key = match key {
+            Some(key) => key,
+            None => k.default_value_ref().to_box(),
+        };
+        let value = match value {
+            Some(value) => value,
+            None => v.default_value_ref().to_box(),
+        };
+        Ok((key, value))
+    }
+
+    fn read_value_of_type(&mut self, t: &RuntimeType) -> ParseResult<ReflectValueBox> {
+        Ok(match t {
+            RuntimeType::Enum(d) => {
+                let value = self.read_enum(&d)?.value();
+                ReflectValueBox::Enum(d.clone(), value)
+            }
+            RuntimeType::U32 => ReflectValueBox::U32(self.read_u32()?),
+            RuntimeType::U64 => ReflectValueBox::U64(self.read_u64()?),
+            RuntimeType::I32 => ReflectValueBox::I32(self.read_i32()?),
+            RuntimeType::I64 => ReflectValueBox::I64(self.read_i64()?),
+            RuntimeType::F32 => ReflectValueBox::F32(self.read_f32()?),
+            RuntimeType::F64 => ReflectValueBox::F64(self.read_f64()?),
+            RuntimeType::Bool => ReflectValueBox::Bool(self.read_bool()?),
+            RuntimeType::String => ReflectValueBox::String(self.read_string()?),
+            RuntimeType::VecU8 => ReflectValueBox::Bytes(self.read_bytes()?),
+            RuntimeType::Message(m) => ReflectValueBox::Message(self.read_message(&m)?),
+        })
+    }
+
+    fn merge_field(
+        &mut self,
+        message: &mut dyn MessageDyn,
+        descriptor: &MessageDescriptor,
+    ) -> ParseResult<()> {
+        let field_name = self.next_field_name()?;
+
+        let field = match descriptor.field_by_name(&field_name) {
+            Some(field) => field,
+            None => {
+                // TODO: shouldn't unknown fields be quietly skipped?
+                return Err(ParseErrorWithoutLoc::UnknownField(field_name));
+            }
+        };
+
+        match field.runtime_field_type() {
+            RuntimeFieldType::Singular(t) => {
+                let value = self.read_value_of_type(&t)?;
+                field.set_singular_field(message, value);
+            }
+            RuntimeFieldType::Repeated(t) => {
+                let value = self.read_value_of_type(&t)?;
+                field.mut_repeated(message).push(value);
+            }
+            RuntimeFieldType::Map(k, v) => {
+                let (k, v) = self.read_map_entry(&k, &v)?;
+                field.mut_map(message).insert(k, v);
+            }
+        };
+
+        Ok(())
+    }
+
+    fn merge_inner(&mut self, message: &mut dyn MessageDyn) -> ParseResult<()> {
+        loop {
+            if self.tokenizer.syntax_eof()? {
+                break;
+            }
+            let descriptor = message.descriptor_dyn();
+            self.merge_field(message, &descriptor)?;
+        }
+        Ok(())
+    }
+
+    fn merge(&mut self, message: &mut dyn MessageDyn) -> ParseWithLocResult<()> {
+        match self.merge_inner(message) {
+            Ok(()) => Ok(()),
+            Err(error) => Err(ParseError {
+                error,
+                loc: self.tokenizer.loc(),
+            }),
+        }
+    }
+}
+
+/// Parse text format message.
+///
+/// This function does not check if message required fields are set.
+pub fn merge_from_str(message: &mut dyn MessageDyn, input: &str) -> ParseWithLocResult<()> {
+    let mut parser = Parser {
+        tokenizer: Tokenizer::new(input, ParserLanguage::TextFormat),
+    };
+    parser.merge(message)
+}
+
+/// Parse text format message.
+pub fn parse_from_str<M: MessageFull>(input: &str) -> ParseWithLocResult<M> {
+    let mut m = M::new();
+    merge_from_str(&mut m, input)?;
+    if let Err(_) = m.check_initialized() {
+        return Err(ParseError {
+            error: ParseErrorWithoutLoc::MessageNotInitialized,
+            loc: Loc::start(),
+        });
+    }
+    Ok(m)
+}
diff --git a/src/text_format/print.rs b/src/text_format/print.rs
index 397e8cd..7fb4de5 100644
--- a/src/text_format/print.rs
+++ b/src/text_format/print.rs
@@ -1,38 +1,187 @@
-#[doc(hidden)]
-pub fn quote_bytes_to(bytes: &[u8], buf: &mut String) {
-    for &c in bytes {
-        match c {
-            b'\n' => buf.push_str(r"\n"),
-            b'\r' => buf.push_str(r"\r"),
-            b'\t' => buf.push_str(r"\t"),
-            b'\'' => buf.push_str("\\\'"),
-            b'"' => buf.push_str("\\\""),
-            b'\\' => buf.push_str(r"\\"),
-            b'\x20'..=b'\x7e' => buf.push(c as char),
-            _ => {
-                buf.push('\\');
-                buf.push((b'0' + (c >> 6)) as char);
-                buf.push((b'0' + ((c >> 3) & 7)) as char);
-                buf.push((b'0' + (c & 7)) as char);
-            }
+use std::fmt;
+use std::fmt::Write;
+
+use protobuf_support::text_format::quote_bytes_to;
+
+use crate::message_dyn::MessageDyn;
+use crate::reflect::MessageRef;
+use crate::reflect::ReflectFieldRef;
+use crate::reflect::ReflectValueRef;
+use crate::UnknownValueRef;
+
+fn print_str_to(s: &str, buf: &mut String) {
+    // TODO: keep printable Unicode
+    quote_bytes_to(s.as_bytes(), buf);
+}
+
+fn do_indent(buf: &mut String, pretty: bool, indent: usize) {
+    if pretty && indent > 0 {
+        for _ in 0..indent {
+            buf.push_str("  ");
         }
     }
 }
 
-pub(crate) fn quote_escape_bytes_to(bytes: &[u8], buf: &mut String) {
-    buf.push('"');
-    quote_bytes_to(bytes, buf);
-    buf.push('"');
+trait FieldName: fmt::Display {}
+impl<'a> FieldName for &'a str {}
+impl FieldName for u32 {}
+
+fn print_start_field<F: FieldName>(
+    buf: &mut String,
+    pretty: bool,
+    indent: usize,
+    first: &mut bool,
+    field_name: F,
+) {
+    if !*first && !pretty {
+        buf.push_str(" ");
+    }
+    do_indent(buf, pretty, indent);
+    *first = false;
+    write!(buf, "{}", field_name).unwrap();
 }
 
-#[doc(hidden)]
-pub fn quote_escape_bytes(bytes: &[u8]) -> String {
+fn print_end_field(buf: &mut String, pretty: bool) {
+    if pretty {
+        buf.push_str("\n");
+    }
+}
+
+fn print_field<F: FieldName>(
+    buf: &mut String,
+    pretty: bool,
+    indent: usize,
+    first: &mut bool,
+    field_name: F,
+    value: ReflectValueRef,
+) {
+    print_start_field(buf, pretty, indent, first, field_name);
+
+    match value {
+        ReflectValueRef::Message(m) => {
+            buf.push_str(" {");
+            if pretty {
+                buf.push_str("\n");
+            }
+            print_to_internal(&m, buf, pretty, indent + 1);
+            do_indent(buf, pretty, indent);
+            buf.push_str("}");
+        }
+        ReflectValueRef::Enum(d, v) => {
+            buf.push_str(": ");
+            match d.value_by_number(v) {
+                Some(e) => buf.push_str(e.name()),
+                None => write!(buf, ": {}", v).unwrap(),
+            }
+        }
+        ReflectValueRef::String(s) => {
+            buf.push_str(": ");
+            print_str_to(s, buf);
+        }
+        ReflectValueRef::Bytes(b) => {
+            buf.push_str(": ");
+            quote_bytes_to(b, buf);
+        }
+        ReflectValueRef::I32(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+        ReflectValueRef::I64(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+        ReflectValueRef::U32(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+        ReflectValueRef::U64(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+        ReflectValueRef::Bool(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+        ReflectValueRef::F32(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+        ReflectValueRef::F64(v) => {
+            write!(buf, ": {}", v).unwrap();
+        }
+    }
+
+    print_end_field(buf, pretty);
+}
+
+fn print_to_internal(m: &MessageRef, buf: &mut String, pretty: bool, indent: usize) {
+    let d = m.descriptor_dyn();
+    let mut first = true;
+    for f in d.fields() {
+        match f.get_reflect(&**m) {
+            ReflectFieldRef::Map(map) => {
+                for (k, v) in &map {
+                    print_start_field(buf, pretty, indent, &mut first, f.name());
+                    buf.push_str(" {");
+                    if pretty {
+                        buf.push_str("\n");
+                    }
+
+                    let mut entry_first = true;
+
+                    print_field(buf, pretty, indent + 1, &mut entry_first, "key", k);
+                    print_field(buf, pretty, indent + 1, &mut entry_first, "value", v);
+                    do_indent(buf, pretty, indent);
+                    buf.push_str("}");
+                    print_end_field(buf, pretty);
+                }
+            }
+            ReflectFieldRef::Repeated(repeated) => {
+                for v in repeated {
+                    print_field(buf, pretty, indent, &mut first, f.name(), v);
+                }
+            }
+            ReflectFieldRef::Optional(optional) => {
+                if let Some(v) = optional.value() {
+                    print_field(buf, pretty, indent, &mut first, f.name(), v);
+                }
+            }
+        }
+    }
+
+    let mut fields: Vec<(u32, UnknownValueRef)> = m.unknown_fields_dyn().iter().collect();
+    // Sort for stable output
+    fields.sort_by_key(|(field_number, _)| *field_number);
+    for (field_number, value) in fields {
+        // TODO: try decode nested message for length-delimited
+        print_field(
+            buf,
+            pretty,
+            indent,
+            &mut first,
+            field_number,
+            value.to_reflect_value_ref(),
+        );
+    }
+}
+
+/// Text-format
+pub fn print_to(m: &dyn MessageDyn, buf: &mut String) {
+    print_to_internal(&MessageRef::from(m), buf, false, 0)
+}
+
+fn print_to_string_internal(m: &dyn MessageDyn, pretty: bool) -> String {
     let mut r = String::new();
-    quote_escape_bytes_to(bytes, &mut r);
-    r
+    print_to_internal(&MessageRef::from(m), &mut r, pretty, 0);
+    r.to_string()
 }
 
-pub(crate) fn print_str_to(s: &str, buf: &mut String) {
-    // TODO: keep printable Unicode
-    quote_escape_bytes_to(s.as_bytes(), buf);
+/// Text-format
+pub fn print_to_string(m: &dyn MessageDyn) -> String {
+    print_to_string_internal(m, false)
+}
+
+/// Text-format
+pub fn print_to_string_pretty(m: &dyn MessageDyn) -> String {
+    print_to_string_internal(m, true)
+}
+
+/// Text-format to `fmt::Formatter`.
+pub fn fmt(m: &dyn MessageDyn, f: &mut fmt::Formatter) -> fmt::Result {
+    let pretty = f.alternate();
+    f.write_str(&print_to_string_internal(m, pretty))
 }
diff --git a/src/timestamp.rs b/src/timestamp.rs
new file mode 100644
index 0000000..4383568
--- /dev/null
+++ b/src/timestamp.rs
@@ -0,0 +1,117 @@
+use crate::cached_size::CachedSize;
+use crate::well_known_types::Timestamp;
+use crate::UnknownFields;
+use std::time::{Duration, SystemTime};
+
+impl Timestamp {
+    /// Unix epoch value of timestamp.
+    pub const UNIX_EPOCH: Timestamp = Timestamp {
+        seconds: 0,
+        nanos: 0,
+        unknown_fields: UnknownFields::INIT,
+        cached_size: CachedSize::INIT,
+    };
+
+    /// Return current time as `Timestamp`.
+    pub fn now() -> Timestamp {
+        Timestamp::from(SystemTime::now())
+    }
+}
+
+/// Convert from [`Timestamp`].
+///
+/// # Panics
+///
+/// This function panics if given `SystemTime` is outside of `Timestamp` range.
+impl From<SystemTime> for Timestamp {
+    fn from(time: SystemTime) -> Self {
+        match time.duration_since(SystemTime::UNIX_EPOCH) {
+            Ok(since_epoch) => Timestamp {
+                seconds: since_epoch.as_secs() as i64,
+                nanos: since_epoch.subsec_nanos() as i32,
+                ..Default::default()
+            },
+            Err(e) => {
+                let before_epoch = e.duration();
+                Timestamp {
+                    seconds: -(before_epoch.as_secs() as i64)
+                        - (before_epoch.subsec_nanos() != 0) as i64,
+                    nanos: (1_000_000_000 - before_epoch.subsec_nanos() as i32) % 1_000_000_000,
+                    ..Default::default()
+                }
+            }
+        }
+    }
+}
+
+/// Convert into [`SystemTime`].
+///
+/// The conversion could be lossy if `SystemTime` precision is smaller than nanoseconds.
+///
+/// # Panics
+///
+/// This function panics:
+/// * if given `Timestamp` is outside of `SystemTime` range
+/// * if `Timestamp` is malformed
+impl Into<SystemTime> for Timestamp {
+    fn into(self) -> SystemTime {
+        if self.seconds >= 0 {
+            let duration =
+                Duration::from_secs(self.seconds as u64) + Duration::from_nanos(self.nanos as u64);
+            SystemTime::UNIX_EPOCH + duration
+        } else {
+            let duration =
+                Duration::from_secs(-self.seconds as u64) - Duration::from_nanos(self.nanos as u64);
+            SystemTime::UNIX_EPOCH - duration
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use crate::well_known_types::Timestamp;
+    use std::time::Duration;
+    use std::time::SystemTime;
+
+    #[test]
+    fn from_system_time() {
+        fn to_from(timestamp: Timestamp, system_time: SystemTime) {
+            assert_eq!(timestamp, Timestamp::from(system_time));
+            assert_eq!(system_time, Into::<SystemTime>::into(timestamp));
+        }
+
+        to_from(Timestamp::UNIX_EPOCH, SystemTime::UNIX_EPOCH);
+        to_from(
+            Timestamp {
+                seconds: 0,
+                nanos: 200_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH + Duration::from_millis(200),
+        );
+        to_from(
+            Timestamp {
+                seconds: 3,
+                nanos: 200_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH + Duration::from_millis(3_200),
+        );
+        to_from(
+            Timestamp {
+                seconds: -1,
+                nanos: 800_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH - Duration::from_millis(200),
+        );
+        to_from(
+            Timestamp {
+                seconds: -4,
+                nanos: 800_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH - Duration::from_millis(3_200),
+        );
+    }
+}
diff --git a/src/types.rs b/src/types.rs
deleted file mode 100644
index 20244a1..0000000
--- a/src/types.rs
+++ /dev/null
@@ -1,684 +0,0 @@
-//! Implementations of `ProtobufType` for all types.
-
-use std::marker;
-use std::mem;
-
-#[cfg(feature = "bytes")]
-use bytes::Bytes;
-
-#[cfg(feature = "bytes")]
-use crate::chars::Chars;
-use crate::coded_input_stream::CodedInputStream;
-use crate::coded_output_stream::CodedOutputStream;
-use crate::enums::ProtobufEnum;
-use crate::error::ProtobufResult;
-use crate::message::Message;
-use crate::reflect::ProtobufValue;
-use crate::rt;
-use crate::unknown::UnknownValues;
-use crate::wire_format::WireType;
-use crate::zigzag::decode_zig_zag_32;
-use crate::zigzag::decode_zig_zag_64;
-
-/// Protobuf elementary type as generic trait
-pub trait ProtobufType {
-    /// Rust type of value
-    type Value: ProtobufValue + Clone + 'static;
-
-    /// Wire type when writing to stream
-    fn wire_type() -> WireType;
-
-    /// Read value from `CodedInputStream`
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<Self::Value>;
-
-    /// Compute wire size
-    fn compute_size(value: &Self::Value) -> u32;
-
-    /// Get value from `UnknownValues`
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<Self::Value>;
-
-    /// Compute size adding length prefix if wire type is length delimited
-    /// (i. e. string, bytes, message)
-    fn compute_size_with_length_delimiter(value: &Self::Value) -> u32 {
-        let size = Self::compute_size(value);
-        if Self::wire_type() == WireType::WireTypeLengthDelimited {
-            rt::compute_raw_varint32_size(size) + size
-        } else {
-            size
-        }
-    }
-
-    /// Get previously computed size
-    #[inline]
-    fn get_cached_size(value: &Self::Value) -> u32 {
-        Self::compute_size(value)
-    }
-
-    /// Get previously cached size with length prefix
-    #[inline]
-    fn get_cached_size_with_length_delimiter(value: &Self::Value) -> u32 {
-        let size = Self::get_cached_size(value);
-        if Self::wire_type() == WireType::WireTypeLengthDelimited {
-            rt::compute_raw_varint32_size(size) + size
-        } else {
-            size
-        }
-    }
-
-    /// Write a value with previously cached size
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &Self::Value,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()>;
-}
-
-/// `float`
-pub struct ProtobufTypeFloat;
-/// `double`
-pub struct ProtobufTypeDouble;
-/// `uint32`
-pub struct ProtobufTypeInt32;
-/// `int64`
-pub struct ProtobufTypeInt64;
-/// `uint32`
-pub struct ProtobufTypeUint32;
-/// `uint64`
-pub struct ProtobufTypeUint64;
-/// `sint32`
-pub struct ProtobufTypeSint32;
-/// `sint64`
-pub struct ProtobufTypeSint64;
-/// `fixed32`
-pub struct ProtobufTypeFixed32;
-/// `fixed64`
-pub struct ProtobufTypeFixed64;
-/// `sfixed32`
-pub struct ProtobufTypeSfixed32;
-/// `sfixed64`
-pub struct ProtobufTypeSfixed64;
-/// `bool`
-pub struct ProtobufTypeBool;
-/// `string`
-pub struct ProtobufTypeString;
-/// `bytes`
-pub struct ProtobufTypeBytes;
-/// Something which should be deleted
-pub struct ProtobufTypeChars;
-
-/// `bytes` as [`Bytes`](bytes::Bytes)
-#[cfg(feature = "bytes")]
-pub struct ProtobufTypeCarllercheBytes;
-/// `string` as [`Chars`](crate::Chars)
-#[cfg(feature = "bytes")]
-pub struct ProtobufTypeCarllercheChars;
-
-/// `enum`
-pub struct ProtobufTypeEnum<E: ProtobufEnum>(marker::PhantomData<E>);
-/// `message`
-pub struct ProtobufTypeMessage<M: Message>(marker::PhantomData<M>);
-
-impl ProtobufType for ProtobufTypeFloat {
-    type Value = f32;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeFixed32
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<f32> {
-        is.read_float()
-    }
-
-    fn compute_size(_value: &f32) -> u32 {
-        4
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<f32> {
-        unknown_values
-            .fixed32
-            .iter()
-            .rev()
-            .next()
-            .map(|&bits| unsafe { mem::transmute::<u32, f32>(bits) })
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &f32,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_float(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeDouble {
-    type Value = f64;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeFixed64
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<f64> {
-        is.read_double()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<f64> {
-        unknown_values
-            .fixed64
-            .iter()
-            .rev()
-            .next()
-            .map(|&bits| unsafe { mem::transmute::<u64, f64>(bits) })
-    }
-
-    fn compute_size(_value: &f64) -> u32 {
-        8
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &f64,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_double(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeInt32 {
-    type Value = i32;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<i32> {
-        is.read_int32()
-    }
-
-    fn compute_size(value: &i32) -> u32 {
-        // See also: https://github.com/protocolbuffers/protobuf/blob/bd00671b924310c0353a730bf8fa77c44e0a9c72/src/google/protobuf/io/coded_stream.h#L1300-L1306
-        if *value < 0 {
-            return 10;
-        }
-        rt::compute_raw_varint32_size(*value as u32)
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &i32,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_int32(field_number, *value)
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<i32> {
-        unknown_values.varint.iter().rev().next().map(|&v| v as i32)
-    }
-}
-
-impl ProtobufType for ProtobufTypeInt64 {
-    type Value = i64;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<i64> {
-        is.read_int64()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<i64> {
-        unknown_values.varint.iter().rev().next().map(|&v| v as i64)
-    }
-
-    fn compute_size(value: &i64) -> u32 {
-        rt::compute_raw_varint64_size(*value as u64)
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &i64,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_int64(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeUint32 {
-    type Value = u32;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<u32> {
-        is.read_uint32()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<u32> {
-        unknown_values.varint.iter().rev().next().map(|&v| v as u32)
-    }
-
-    fn compute_size(value: &u32) -> u32 {
-        rt::compute_raw_varint32_size(*value)
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &u32,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_uint32(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeUint64 {
-    type Value = u64;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<u64> {
-        is.read_uint64()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<u64> {
-        unknown_values.varint.iter().cloned().rev().next()
-    }
-
-    fn compute_size(value: &u64) -> u32 {
-        rt::compute_raw_varint64_size(*value)
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &u64,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_uint64(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeSint32 {
-    type Value = i32;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<i32> {
-        is.read_sint32()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<i32> {
-        ProtobufTypeUint32::get_from_unknown(unknown_values).map(decode_zig_zag_32)
-    }
-
-    fn compute_size(value: &i32) -> u32 {
-        rt::value_varint_zigzag_size_no_tag(*value)
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &i32,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_sint32(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeSint64 {
-    type Value = i64;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<i64> {
-        is.read_sint64()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<i64> {
-        ProtobufTypeUint64::get_from_unknown(unknown_values).map(decode_zig_zag_64)
-    }
-
-    fn compute_size(value: &i64) -> u32 {
-        rt::value_varint_zigzag_size_no_tag(*value)
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &i64,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_sint64(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeFixed32 {
-    type Value = u32;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeFixed32
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<u32> {
-        is.read_fixed32()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<u32> {
-        unknown_values.fixed32.iter().cloned().rev().next()
-    }
-
-    fn compute_size(_value: &u32) -> u32 {
-        4
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &u32,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_fixed32(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeFixed64 {
-    type Value = u64;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeFixed64
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<u64> {
-        is.read_fixed64()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<u64> {
-        unknown_values.fixed64.iter().cloned().rev().next()
-    }
-
-    fn compute_size(_value: &u64) -> u32 {
-        8
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &u64,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_fixed64(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeSfixed32 {
-    type Value = i32;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeFixed32
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<i32> {
-        is.read_sfixed32()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<i32> {
-        ProtobufTypeFixed32::get_from_unknown(unknown_values).map(|u| u as i32)
-    }
-
-    fn compute_size(_value: &i32) -> u32 {
-        4
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &i32,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_sfixed32(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeSfixed64 {
-    type Value = i64;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeFixed64
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<i64> {
-        is.read_sfixed64()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<i64> {
-        ProtobufTypeFixed64::get_from_unknown(unknown_values).map(|u| u as i64)
-    }
-
-    fn compute_size(_value: &i64) -> u32 {
-        8
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &i64,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_sfixed64(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeBool {
-    type Value = bool;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<bool> {
-        is.read_bool()
-    }
-
-    fn get_from_unknown(unknown: &UnknownValues) -> Option<bool> {
-        unknown.varint.iter().rev().next().map(|&v| v != 0)
-    }
-
-    fn compute_size(_value: &bool) -> u32 {
-        1
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &bool,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_bool(field_number, *value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeString {
-    type Value = String;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeLengthDelimited
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<String> {
-        is.read_string()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<String> {
-        // TODO: should not panic
-        ProtobufTypeBytes::get_from_unknown(unknown_values)
-            .map(|b| String::from_utf8(b).expect("not a valid string"))
-    }
-
-    fn compute_size(value: &String) -> u32 {
-        value.len() as u32
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &String,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_string(field_number, &value)
-    }
-}
-
-impl ProtobufType for ProtobufTypeBytes {
-    type Value = Vec<u8>;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeLengthDelimited
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<Vec<u8>> {
-        is.read_bytes()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<Vec<u8>> {
-        unknown_values.length_delimited.iter().cloned().rev().next()
-    }
-
-    fn compute_size(value: &Vec<u8>) -> u32 {
-        value.len() as u32
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &Vec<u8>,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_bytes(field_number, &value)
-    }
-}
-
-#[cfg(feature = "bytes")]
-impl ProtobufType for ProtobufTypeCarllercheBytes {
-    type Value = Bytes;
-
-    fn wire_type() -> WireType {
-        ProtobufTypeBytes::wire_type()
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<Self::Value> {
-        is.read_carllerche_bytes()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<Bytes> {
-        ProtobufTypeBytes::get_from_unknown(unknown_values).map(Bytes::from)
-    }
-
-    fn compute_size(value: &Bytes) -> u32 {
-        value.len() as u32
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &Bytes,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_bytes(field_number, &value)
-    }
-}
-
-#[cfg(feature = "bytes")]
-impl ProtobufType for ProtobufTypeCarllercheChars {
-    type Value = Chars;
-
-    fn wire_type() -> WireType {
-        ProtobufTypeBytes::wire_type()
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<Self::Value> {
-        is.read_carllerche_chars()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<Chars> {
-        ProtobufTypeString::get_from_unknown(unknown_values).map(Chars::from)
-    }
-
-    fn compute_size(value: &Chars) -> u32 {
-        value.len() as u32
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &Chars,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_string(field_number, &value)
-    }
-}
-
-impl<E: ProtobufEnum + ProtobufValue> ProtobufType for ProtobufTypeEnum<E> {
-    type Value = E;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeVarint
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<E> {
-        is.read_enum()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<E> {
-        // TODO: do not panic
-        ProtobufTypeInt32::get_from_unknown(unknown_values)
-            .map(|i| E::from_i32(i).expect("not a valid enum value"))
-    }
-
-    fn compute_size(value: &E) -> u32 {
-        rt::compute_raw_varint32_size(value.value() as u32) // TODO: wrap
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &E,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_enum_obj(field_number, *value)
-    }
-}
-
-impl<M: Message + Clone + ProtobufValue> ProtobufType for ProtobufTypeMessage<M> {
-    type Value = M;
-
-    fn wire_type() -> WireType {
-        WireType::WireTypeLengthDelimited
-    }
-
-    fn read(is: &mut CodedInputStream) -> ProtobufResult<M> {
-        is.read_message()
-    }
-
-    fn get_from_unknown(unknown_values: &UnknownValues) -> Option<M> {
-        // TODO: do not panic
-        unknown_values
-            .length_delimited
-            .iter()
-            .rev()
-            .next()
-            .map(|bytes| M::parse_from_bytes(bytes).expect("cannot parse message"))
-    }
-
-    fn compute_size(value: &M) -> u32 {
-        value.compute_size()
-    }
-
-    fn get_cached_size(value: &M) -> u32 {
-        value.get_cached_size()
-    }
-
-    fn write_with_cached_size(
-        field_number: u32,
-        value: &Self::Value,
-        os: &mut CodedOutputStream,
-    ) -> ProtobufResult<()> {
-        os.write_tag(field_number, WireType::WireTypeLengthDelimited)?;
-        os.write_raw_varint32(value.get_cached_size())?;
-        value.write_to_with_cached_sizes(os)?;
-        Ok(())
-    }
-}
diff --git a/src/unknown.rs b/src/unknown.rs
index dd67033..c54b20c 100644
--- a/src/unknown.rs
+++ b/src/unknown.rs
@@ -7,10 +7,12 @@
 use std::hash::Hasher;
 use std::slice;
 
-use crate::clear::Clear;
-use crate::wire_format;
+use crate::reflect::ReflectValueRef;
+use crate::rt;
+use crate::wire_format::WireType;
 use crate::zigzag::encode_zig_zag_32;
 use crate::zigzag::encode_zig_zag_64;
+use crate::CodedOutputStream;
 
 /// Unknown value.
 ///
@@ -29,7 +31,7 @@
 
 impl UnknownValue {
     /// Wire type for this unknown
-    pub fn wire_type(&self) -> wire_format::WireType {
+    pub fn wire_type(&self) -> WireType {
         self.get_ref().wire_type()
     }
 
@@ -43,6 +45,16 @@
         }
     }
 
+    /// Construct unknown value from `int64` value.
+    pub fn int32(i: i32) -> UnknownValue {
+        UnknownValue::int64(i as i64)
+    }
+
+    /// Construct unknown value from `int64` value.
+    pub fn int64(i: i64) -> UnknownValue {
+        UnknownValue::Varint(i as u64)
+    }
+
     /// Construct unknown value from `sint32` value.
     pub fn sint32(i: i32) -> UnknownValue {
         UnknownValue::Varint(encode_zig_zag_32(i) as u64)
@@ -52,11 +64,32 @@
     pub fn sint64(i: i64) -> UnknownValue {
         UnknownValue::Varint(encode_zig_zag_64(i))
     }
+
+    /// Construct unknown value from `float` value.
+    pub fn float(f: f32) -> UnknownValue {
+        UnknownValue::Fixed32(f.to_bits())
+    }
+
+    /// Construct unknown value from `double` value.
+    pub fn double(f: f64) -> UnknownValue {
+        UnknownValue::Fixed64(f.to_bits())
+    }
+
+    /// Construct unknown value from `sfixed32` value.
+    pub fn sfixed32(i: i32) -> UnknownValue {
+        UnknownValue::Fixed32(i as u32)
+    }
+
+    /// Construct unknown value from `sfixed64` value.
+    pub fn sfixed64(i: i64) -> UnknownValue {
+        UnknownValue::Fixed64(i as u64)
+    }
 }
 
 /// Reference to unknown value.
 ///
 /// See [`UnknownFields`](crate::UnknownFields) for explanations.
+#[derive(Debug, PartialEq)]
 pub enum UnknownValueRef<'o> {
     /// 32-bit unknown
     Fixed32(u32),
@@ -70,12 +103,21 @@
 
 impl<'o> UnknownValueRef<'o> {
     /// Wire-type to serialize this unknown
-    pub fn wire_type(&self) -> wire_format::WireType {
+    pub fn wire_type(&self) -> WireType {
         match *self {
-            UnknownValueRef::Fixed32(_) => wire_format::WireTypeFixed32,
-            UnknownValueRef::Fixed64(_) => wire_format::WireTypeFixed64,
-            UnknownValueRef::Varint(_) => wire_format::WireTypeVarint,
-            UnknownValueRef::LengthDelimited(_) => wire_format::WireTypeLengthDelimited,
+            UnknownValueRef::Fixed32(_) => WireType::Fixed32,
+            UnknownValueRef::Fixed64(_) => WireType::Fixed64,
+            UnknownValueRef::Varint(_) => WireType::Varint,
+            UnknownValueRef::LengthDelimited(_) => WireType::LengthDelimited,
+        }
+    }
+
+    pub(crate) fn to_reflect_value_ref(&'o self) -> ReflectValueRef<'o> {
+        match self {
+            UnknownValueRef::Fixed32(v) => ReflectValueRef::U32(*v),
+            UnknownValueRef::Fixed64(v) => ReflectValueRef::U64(*v),
+            UnknownValueRef::Varint(v) => ReflectValueRef::U64(*v),
+            UnknownValueRef::LengthDelimited(v) => ReflectValueRef::Bytes(v),
         }
     }
 }
@@ -84,15 +126,15 @@
 ///
 /// See [`UnknownFields`](crate::UnknownFields) for explanations.
 #[derive(Clone, PartialEq, Eq, Debug, Default, Hash)]
-pub struct UnknownValues {
+pub(crate) struct UnknownValues {
     /// 32-bit unknowns
-    pub fixed32: Vec<u32>,
+    pub(crate) fixed32: Vec<u32>,
     /// 64-bit unknowns
-    pub fixed64: Vec<u64>,
+    pub(crate) fixed64: Vec<u64>,
     /// Varint unknowns
-    pub varint: Vec<u64>,
+    pub(crate) varint: Vec<u64>,
     /// Length-delimited unknowns
-    pub length_delimited: Vec<Vec<u8>>,
+    pub(crate) length_delimited: Vec<Vec<u8>>,
 }
 
 impl UnknownValues {
@@ -117,6 +159,20 @@
             length_delimited: self.length_delimited.iter(),
         }
     }
+
+    pub(crate) fn any(&self) -> Option<UnknownValueRef> {
+        if let Some(last) = self.fixed32.last() {
+            Some(UnknownValueRef::Fixed32(*last))
+        } else if let Some(last) = self.fixed64.last() {
+            Some(UnknownValueRef::Fixed64(*last))
+        } else if let Some(last) = self.varint.last() {
+            Some(UnknownValueRef::Varint(*last))
+        } else if let Some(last) = self.length_delimited.last() {
+            Some(UnknownValueRef::LengthDelimited(last))
+        } else {
+            None
+        }
+    }
 }
 
 impl<'a> IntoIterator for &'a UnknownValues {
@@ -129,7 +185,7 @@
 }
 
 /// Iterator over unknown values
-pub struct UnknownValuesIter<'o> {
+pub(crate) struct UnknownValuesIter<'o> {
     fixed32: slice::Iter<'o, u32>,
     fixed64: slice::Iter<'o, u64>,
     varint: slice::Iter<'o, u64>,
@@ -140,21 +196,17 @@
     type Item = UnknownValueRef<'o>;
 
     fn next(&mut self) -> Option<UnknownValueRef<'o>> {
-        let fixed32 = self.fixed32.next();
-        if fixed32.is_some() {
-            return Some(UnknownValueRef::Fixed32(*fixed32.unwrap()));
+        if let Some(fixed32) = self.fixed32.next() {
+            return Some(UnknownValueRef::Fixed32(*fixed32));
         }
-        let fixed64 = self.fixed64.next();
-        if fixed64.is_some() {
-            return Some(UnknownValueRef::Fixed64(*fixed64.unwrap()));
+        if let Some(fixed64) = self.fixed64.next() {
+            return Some(UnknownValueRef::Fixed64(*fixed64));
         }
-        let varint = self.varint.next();
-        if varint.is_some() {
-            return Some(UnknownValueRef::Varint(*varint.unwrap()));
+        if let Some(varint) = self.varint.next() {
+            return Some(UnknownValueRef::Varint(*varint));
         }
-        let length_delimited = self.length_delimited.next();
-        if length_delimited.is_some() {
-            return Some(UnknownValueRef::LengthDelimited(&length_delimited.unwrap()));
+        if let Some(length_delimited) = self.length_delimited.next() {
+            return Some(UnknownValueRef::LengthDelimited(&length_delimited));
         }
         None
     }
@@ -182,8 +234,7 @@
     // Note, Google Protobuf C++ simply uses linear map (which can exploitable the same way),
     // and Google Protobuf Java uses tree map to store unknown fields
     // (which is more expensive than hashmap).
-    // TODO: hide
-    pub fields: Option<Box<HashMap<u32, UnknownValues, BuildHasherDefault<DefaultHasher>>>>,
+    fields: Option<Box<HashMap<u32, UnknownValues, BuildHasherDefault<DefaultHasher>>>>,
 }
 
 /// Very simple hash implementation of `Hash` for `UnknownFields`.
@@ -207,9 +258,16 @@
 }
 
 impl UnknownFields {
-    /// Empty unknown fields
-    pub fn new() -> UnknownFields {
-        Default::default()
+    /// Empty unknown fields.
+    pub const fn new() -> UnknownFields {
+        UnknownFields { fields: None }
+    }
+
+    /// Clear all unknown fields.
+    pub fn clear(&mut self) {
+        if let Some(ref mut fields) = self.fields {
+            fields.clear();
+        }
     }
 
     fn init_map(&mut self) {
@@ -264,29 +322,35 @@
     /// Iterate over all unknowns
     pub fn iter<'s>(&'s self) -> UnknownFieldsIter<'s> {
         UnknownFieldsIter {
-            entries: self.fields.as_ref().map(|m| m.iter()),
+            entries: self.fields.as_ref().map(|m| UnknownFieldsNotEmptyIter {
+                fields: m.iter(),
+                current: None,
+            }),
         }
     }
 
-    /// Find unknown field by number
-    pub fn get(&self, field_number: u32) -> Option<&UnknownValues> {
-        match self.fields {
-            Some(ref map) => map.get(&field_number),
+    /// Get any value for unknown fields.
+    pub fn get(&self, field_number: u32) -> Option<UnknownValueRef> {
+        match &self.fields {
+            Some(map) => map.get(&field_number).and_then(|v| v.any()),
             None => None,
         }
     }
-}
 
-impl Clear for UnknownFields {
-    fn clear(&mut self) {
-        if let Some(ref mut fields) = self.fields {
-            fields.clear();
-        }
+    #[doc(hidden)]
+    pub fn write_to_bytes(&self) -> Vec<u8> {
+        let mut r = Vec::with_capacity(rt::unknown_fields_size(self) as usize);
+        let mut stream = CodedOutputStream::vec(&mut r);
+        // Do we need it stable everywhere?
+        stream.write_unknown_fields_sorted(self).unwrap();
+        stream.flush().unwrap();
+        drop(stream);
+        r
     }
 }
 
 impl<'a> IntoIterator for &'a UnknownFields {
-    type Item = (u32, &'a UnknownValues);
+    type Item = (u32, UnknownValueRef<'a>);
     type IntoIter = UnknownFieldsIter<'a>;
 
     fn into_iter(self) -> UnknownFieldsIter<'a> {
@@ -294,19 +358,37 @@
     }
 }
 
+struct UnknownFieldsNotEmptyIter<'s> {
+    fields: hash_map::Iter<'s, u32, UnknownValues>,
+    current: Option<(u32, UnknownValuesIter<'s>)>,
+}
+
 /// Iterator over [`UnknownFields`](crate::UnknownFields)
 pub struct UnknownFieldsIter<'s> {
-    entries: Option<hash_map::Iter<'s, u32, UnknownValues>>,
+    entries: Option<UnknownFieldsNotEmptyIter<'s>>,
+}
+
+impl<'s> Iterator for UnknownFieldsNotEmptyIter<'s> {
+    type Item = (u32, UnknownValueRef<'s>);
+
+    fn next(&mut self) -> Option<(u32, UnknownValueRef<'s>)> {
+        loop {
+            if let Some((field_number, values)) = &mut self.current {
+                if let Some(value) = values.next() {
+                    return Some((*field_number, value));
+                }
+            }
+            let (field_number, values) = self.fields.next()?;
+            self.current = Some((*field_number, values.iter()));
+        }
+    }
 }
 
 impl<'s> Iterator for UnknownFieldsIter<'s> {
-    type Item = (u32, &'s UnknownValues);
+    type Item = (u32, UnknownValueRef<'s>);
 
-    fn next(&mut self) -> Option<(u32, &'s UnknownValues)> {
-        match self.entries {
-            Some(ref mut entries) => entries.next().map(|(&number, values)| (number, values)),
-            None => None,
-        }
+    fn next(&mut self) -> Option<(u32, UnknownValueRef<'s>)> {
+        self.entries.as_mut().and_then(|entries| entries.next())
     }
 }
 
diff --git a/src/varint.rs b/src/varint.rs
deleted file mode 100644
index 8e542bc..0000000
--- a/src/varint.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-use std::mem::MaybeUninit;
-
-use crate::misc::maybe_uninit_write;
-
-/// Encode u64 as varint.
-/// Panics if buffer length is less than 10.
-#[inline]
-pub fn encode_varint64(mut value: u64, buf: &mut [MaybeUninit<u8>]) -> usize {
-    assert!(buf.len() >= 10);
-
-    unsafe {
-        let mut i = 0;
-        while (value & !0x7F) > 0 {
-            maybe_uninit_write(buf.get_unchecked_mut(i), ((value & 0x7F) | 0x80) as u8);
-            value >>= 7;
-            i += 1;
-        }
-        maybe_uninit_write(buf.get_unchecked_mut(i), value as u8);
-        i + 1
-    }
-}
-
-/// Encode u32 value as varint.
-/// Panics if buffer length is less than 5.
-#[inline]
-pub fn encode_varint32(mut value: u32, buf: &mut [MaybeUninit<u8>]) -> usize {
-    assert!(buf.len() >= 5);
-
-    unsafe {
-        let mut i = 0;
-        while (value & !0x7F) > 0 {
-            maybe_uninit_write(buf.get_unchecked_mut(i), ((value & 0x7F) | 0x80) as u8);
-            value >>= 7;
-            i += 1;
-        }
-        maybe_uninit_write(buf.get_unchecked_mut(i), value as u8);
-        i + 1
-    }
-}
diff --git a/src/varint/decode.rs b/src/varint/decode.rs
new file mode 100644
index 0000000..7145343
--- /dev/null
+++ b/src/varint/decode.rs
@@ -0,0 +1,113 @@
+//! Varint decode utilities.
+
+use crate::error::WireError;
+use crate::varint::MAX_VARINT32_ENCODED_LEN;
+use crate::varint::MAX_VARINT_ENCODED_LEN;
+
+trait DecodeVarint {
+    const MAX_ENCODED_LEN: usize;
+    const LAST_BYTE_MAX_VALUE: u8;
+
+    fn from_u64(value: u64) -> Self;
+}
+
+impl DecodeVarint for u64 {
+    const MAX_ENCODED_LEN: usize = MAX_VARINT_ENCODED_LEN;
+    const LAST_BYTE_MAX_VALUE: u8 = 0x01;
+
+    fn from_u64(value: u64) -> Self {
+        value
+    }
+}
+
+impl DecodeVarint for u32 {
+    const MAX_ENCODED_LEN: usize = MAX_VARINT32_ENCODED_LEN;
+    const LAST_BYTE_MAX_VALUE: u8 = 0x0f;
+
+    fn from_u64(value: u64) -> Self {
+        value as u32
+    }
+}
+
+/// Decode a varint, and return decoded value and decoded byte count.
+#[inline]
+fn decode_varint_full<D: DecodeVarint>(rem: &[u8]) -> crate::Result<Option<(D, usize)>> {
+    let mut r: u64 = 0;
+    for (i, &b) in rem.iter().enumerate() {
+        if i == D::MAX_ENCODED_LEN - 1 {
+            if b > D::LAST_BYTE_MAX_VALUE {
+                return Err(WireError::IncorrectVarint.into());
+            }
+            let r = r | ((b as u64) << (i as u64 * 7));
+            return Ok(Some((D::from_u64(r), i + 1)));
+        }
+
+        r = r | (((b & 0x7f) as u64) << (i as u64 * 7));
+        if b < 0x80 {
+            return Ok(Some((D::from_u64(r), i + 1)));
+        }
+    }
+    Ok(None)
+}
+
+#[inline]
+fn decode_varint_impl<D: DecodeVarint>(buf: &[u8]) -> crate::Result<Option<(D, usize)>> {
+    if buf.len() >= 1 && buf[0] < 0x80 {
+        // The the most common case.
+        let ret = buf[0] as u64;
+        let consume = 1;
+        Ok(Some((D::from_u64(ret), consume)))
+    } else if buf.len() >= 2 && buf[1] < 0x80 {
+        // Handle the case of two bytes too.
+        let ret = (buf[0] & 0x7f) as u64 | (buf[1] as u64) << 7;
+        let consume = 2;
+        Ok(Some((D::from_u64(ret), consume)))
+    } else {
+        // Read from array when buf at at least 10 bytes,
+        // max len for varint.
+        decode_varint_full(buf)
+    }
+}
+
+/// Try decode a varint. Return `None` if the buffer does not contain complete varint.
+#[inline]
+pub(crate) fn decode_varint64(buf: &[u8]) -> crate::Result<Option<(u64, usize)>> {
+    decode_varint_impl(buf)
+}
+
+/// Try decode a varint. Return `None` if the buffer does not contain complete varint.
+#[inline]
+pub(crate) fn decode_varint32(buf: &[u8]) -> crate::Result<Option<(u32, usize)>> {
+    decode_varint_impl(buf)
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::hex::decode_hex;
+    use crate::varint::decode::decode_varint32;
+    use crate::varint::decode::decode_varint64;
+
+    #[test]
+    fn test_decode_varint64() {
+        assert_eq!((0, 1), decode_varint64(&decode_hex("00")).unwrap().unwrap());
+        assert_eq!(
+            (u64::MAX, 10),
+            decode_varint64(&decode_hex("ff ff ff ff ff ff ff ff ff 01"))
+                .unwrap()
+                .unwrap()
+        );
+        assert!(decode_varint64(&decode_hex("ff ff ff ff ff ff ff ff ff 02")).is_err());
+    }
+
+    #[test]
+    fn test_decode_varint32() {
+        assert_eq!((0, 1), decode_varint32(&decode_hex("00")).unwrap().unwrap());
+        assert_eq!(
+            (u32::MAX, 5),
+            decode_varint32(&decode_hex("ff ff ff ff 0f"))
+                .unwrap()
+                .unwrap()
+        );
+        assert!(decode_varint32(&decode_hex("ff ff ff ff 10")).is_err());
+    }
+}
diff --git a/src/varint/encode.rs b/src/varint/encode.rs
new file mode 100644
index 0000000..eb9fc2d
--- /dev/null
+++ b/src/varint/encode.rs
@@ -0,0 +1,148 @@
+use std::mem::MaybeUninit;
+
+use crate::varint::MAX_VARINT_ENCODED_LEN;
+
+/// Encode u64 as varint.
+/// Panics if buffer length is less than 10.
+#[inline]
+pub(crate) fn encode_varint64(mut value: u64, buf: &mut [MaybeUninit<u8>]) -> usize {
+    assert!(buf.len() >= MAX_VARINT_ENCODED_LEN);
+
+    fn iter(value: &mut u64, byte: &mut MaybeUninit<u8>) -> bool {
+        if (*value & !0x7F) > 0 {
+            byte.write(((*value & 0x7F) | 0x80) as u8);
+            *value >>= 7;
+            true
+        } else {
+            byte.write(*value as u8);
+            false
+        }
+    }
+
+    // Explicitly unroll loop to avoid either
+    // unsafe code or bound checking when writing to `buf`
+
+    if !iter(&mut value, &mut buf[0]) {
+        return 1;
+    };
+    if !iter(&mut value, &mut buf[1]) {
+        return 2;
+    };
+    if !iter(&mut value, &mut buf[2]) {
+        return 3;
+    };
+    if !iter(&mut value, &mut buf[3]) {
+        return 4;
+    };
+    if !iter(&mut value, &mut buf[4]) {
+        return 5;
+    };
+    if !iter(&mut value, &mut buf[5]) {
+        return 6;
+    };
+    if !iter(&mut value, &mut buf[6]) {
+        return 7;
+    };
+    if !iter(&mut value, &mut buf[7]) {
+        return 8;
+    };
+    if !iter(&mut value, &mut buf[8]) {
+        return 9;
+    };
+    buf[9].write(value as u8);
+    10
+}
+
+/// Encode u32 value as varint.
+/// Panics if buffer length is less than 5.
+#[inline]
+pub(crate) fn encode_varint32(mut value: u32, buf: &mut [MaybeUninit<u8>]) -> usize {
+    assert!(buf.len() >= 5);
+
+    fn iter(value: &mut u32, byte: &mut MaybeUninit<u8>) -> bool {
+        if (*value & !0x7F) > 0 {
+            byte.write(((*value & 0x7F) | 0x80) as u8);
+            *value >>= 7;
+            true
+        } else {
+            byte.write(*value as u8);
+            false
+        }
+    }
+
+    // Explicitly unroll loop to avoid either
+    // unsafe code or bound checking when writing to `buf`
+
+    if !iter(&mut value, &mut buf[0]) {
+        return 1;
+    };
+    if !iter(&mut value, &mut buf[1]) {
+        return 2;
+    };
+    if !iter(&mut value, &mut buf[2]) {
+        return 3;
+    };
+    if !iter(&mut value, &mut buf[3]) {
+        return 4;
+    };
+    buf[4].write(value as u8);
+    5
+}
+
+/// Encoded size of u64 value.
+#[inline]
+pub(crate) fn encoded_varint64_len(value: u64) -> usize {
+    if value == 0 {
+        1
+    } else {
+        let significant_bits = 64 - value.leading_zeros();
+        (significant_bits + 6) as usize / 7
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::mem::MaybeUninit;
+
+    use crate::varint::encode::encode_varint64;
+    use crate::varint::encode::encoded_varint64_len;
+
+    #[test]
+    fn test_encoded_varint64_len() {
+        fn test(n: u64) {
+            let mut buf = [MaybeUninit::uninit(); 10];
+            let expected = encode_varint64(n, &mut buf);
+            assert_eq!(expected, encoded_varint64_len(n), "n={}", n);
+        }
+
+        for n in 0..1000 {
+            test(n);
+        }
+
+        for p in 0.. {
+            match 2u64.checked_pow(p) {
+                Some(n) => test(n),
+                None => break,
+            }
+        }
+
+        for p in 0.. {
+            match 3u64.checked_pow(p) {
+                Some(n) => test(n),
+                None => break,
+            }
+        }
+
+        test(u64::MAX);
+        test(u64::MAX - 1);
+        test((i64::MAX as u64) + 1);
+        test(i64::MAX as u64);
+        test((i64::MAX as u64) - 1);
+        test((u32::MAX as u64) + 1);
+        test(u32::MAX as u64);
+        test((u32::MAX as u64) - 1);
+        test((i32::MAX as u64) + 1);
+        test(i32::MAX as u64);
+        test((i32::MAX as u64) - 1);
+    }
+}
diff --git a/src/varint/generic.rs b/src/varint/generic.rs
new file mode 100644
index 0000000..4fc8ba2
--- /dev/null
+++ b/src/varint/generic.rs
@@ -0,0 +1,39 @@
+use crate::rt::compute_raw_varint64_size;
+
+/// Helper trait implemented by integer types which could be encoded as varint.
+pub(crate) trait ProtobufVarint {
+    /// Size of self when encoded as varint.
+    fn len_varint(&self) -> u64;
+}
+
+impl ProtobufVarint for u64 {
+    fn len_varint(&self) -> u64 {
+        compute_raw_varint64_size(*self)
+    }
+}
+
+impl ProtobufVarint for u32 {
+    fn len_varint(&self) -> u64 {
+        (*self as u64).len_varint()
+    }
+}
+
+impl ProtobufVarint for i64 {
+    fn len_varint(&self) -> u64 {
+        // same as length of u64
+        (*self as u64).len_varint()
+    }
+}
+
+impl ProtobufVarint for i32 {
+    fn len_varint(&self) -> u64 {
+        // sign-extend and then compute
+        (*self as i64).len_varint()
+    }
+}
+
+impl ProtobufVarint for bool {
+    fn len_varint(&self) -> u64 {
+        1
+    }
+}
diff --git a/src/varint/mod.rs b/src/varint/mod.rs
new file mode 100644
index 0000000..d693975
--- /dev/null
+++ b/src/varint/mod.rs
@@ -0,0 +1,7 @@
+pub(crate) mod decode;
+pub(crate) mod encode;
+pub(crate) mod generic;
+
+/// Encoded varint message is not longer than 10 bytes.
+pub(crate) const MAX_VARINT_ENCODED_LEN: usize = 10;
+pub(crate) const MAX_VARINT32_ENCODED_LEN: usize = 5;
diff --git a/src/well_known_types/any.rs b/src/well_known_types/any.rs
index e46065f..6b8d343 100644
--- a/src/well_known_types/any.rs
+++ b/src/well_known_types/any.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,21 +16,51 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/any.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Any)
 pub struct Any {
     // message fields
+    ///  A URL/resource name that uniquely identifies the type of the serialized
+    ///  protocol buffer message. This string must contain at least
+    ///  one "/" character. The last segment of the URL's path must represent
+    ///  the fully qualified name of the type (as in
+    ///  `path/google.protobuf.Duration`). The name should be in a canonical form
+    ///  (e.g., leading "." is not accepted).
+    ///
+    ///  In practice, teams usually precompile into the binary all types that they
+    ///  expect it to use in the context of Any. However, for URLs which use the
+    ///  scheme `http`, `https`, or no scheme, one can optionally set up a type
+    ///  server that maps type URLs to message definitions as follows:
+    ///
+    ///  * If no scheme is provided, `https` is assumed.
+    ///  * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+    ///    value in binary format, or produce an error.
+    ///  * Applications are allowed to cache lookup results based on the
+    ///    URL, or have them precompiled into a binary to avoid any
+    ///    lookup. Therefore, binary compatibility needs to be preserved
+    ///    on changes to types. (Use versioned type names to manage
+    ///    breaking changes.)
+    ///
+    ///  Note: this functionality is not currently available in the official
+    ///  protobuf release, and it is not used for type URLs beginning with
+    ///  type.googleapis.com.
+    ///
+    ///  Schemes other than `http`, `https` (or the empty scheme) might be
+    ///  used with implementation specific semantics.
+    ///
+    // @@protoc_insertion_point(field:google.protobuf.Any.type_url)
     pub type_url: ::std::string::String,
+    ///  Must be a valid serialized protocol buffer of the above specified type.
+    // @@protoc_insertion_point(field:google.protobuf.Any.value)
     pub value: ::std::vec::Vec<u8>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Any.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Any {
@@ -43,76 +74,45 @@
         ::std::default::Default::default()
     }
 
-    // string type_url = 1;
-
-
-    pub fn get_type_url(&self) -> &str {
-        &self.type_url
-    }
-    pub fn clear_type_url(&mut self) {
-        self.type_url.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_type_url(&mut self, v: ::std::string::String) {
-        self.type_url = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_type_url(&mut self) -> &mut ::std::string::String {
-        &mut self.type_url
-    }
-
-    // Take field
-    pub fn take_type_url(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.type_url, ::std::string::String::new())
-    }
-
-    // bytes value = 2;
-
-
-    pub fn get_value(&self) -> &[u8] {
-        &self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: ::std::vec::Vec<u8>) {
-        self.value = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_value(&mut self) -> &mut ::std::vec::Vec<u8> {
-        &mut self.value
-    }
-
-    // Take field
-    pub fn take_value(&mut self) -> ::std::vec::Vec<u8> {
-        ::std::mem::replace(&mut self.value, ::std::vec::Vec::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "type_url",
+            |m: &Any| { &m.type_url },
+            |m: &mut Any| { &mut m.type_url },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &Any| { &m.value },
+            |m: &mut Any| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Any>(
+            "Any",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Any {
+    const NAME: &'static str = "Any";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_url)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.type_url = is.read_string()?;
                 },
-                2 => {
-                    crate::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.value)?;
+                18 => {
+                    self.value = is.read_bytes()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -121,7 +121,7 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.type_url.is_empty() {
             my_size += crate::rt::string_size(1, &self.type_url);
@@ -129,98 +129,65 @@
         if !self.value.is_empty() {
             my_size += crate::rt::bytes_size(2, &self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.type_url.is_empty() {
             os.write_string(1, &self.type_url)?;
         }
         if !self.value.is_empty() {
             os.write_bytes(2, &self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Any {
         Any::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "type_url",
-                |m: &Any| { &m.type_url },
-                |m: &mut Any| { &mut m.type_url },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeBytes>(
-                "value",
-                |m: &Any| { &m.value },
-                |m: &mut Any| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Any>(
-                "Any",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Any {
-        static instance: crate::rt::LazyV2<Any> = crate::rt::LazyV2::INIT;
-        instance.get(Any::new)
-    }
-}
-
-impl crate::Clear for Any {
     fn clear(&mut self) {
         self.type_url.clear();
         self.value.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Any {
+        static instance: Any = Any {
+            type_url: ::std::string::String::new(),
+            value: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Any {
+impl crate::MessageFull for Any {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Any").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Any {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Any {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -361,14 +328,31 @@
     \x05\x04\0\x02\x01\x03\x12\x04\x9c\x01\x10\x11b\x06proto3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(Any::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/api.rs b/src/well_known_types/api.rs
index ef97015..afd19d3 100644
--- a/src/well_known_types/api.rs
+++ b/src/well_known_types/api.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,26 +16,70 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/api.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Api is a light-weight descriptor for an API Interface.
+///
+///  Interfaces are also described as "protocol buffer services" in some contexts,
+///  such as by the "service" keyword in a .proto file, but they are different
+///  from API Services, which represent a concrete implementation of an interface
+///  as opposed to simply a description of methods and bindings. They are also
+///  sometimes simply referred to as "APIs" in other contexts, such as the name of
+///  this message itself. See https://cloud.google.com/apis/design/glossary for
+///  detailed terminology.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Api)
 pub struct Api {
     // message fields
+    ///  The fully qualified name of this interface, including package name
+    ///  followed by the interface's simple name.
+    // @@protoc_insertion_point(field:google.protobuf.Api.name)
     pub name: ::std::string::String,
-    pub methods: crate::RepeatedField<Method>,
-    pub options: crate::RepeatedField<crate::well_known_types::Option>,
+    ///  The methods of this interface, in unspecified order.
+    // @@protoc_insertion_point(field:google.protobuf.Api.methods)
+    pub methods: ::std::vec::Vec<Method>,
+    ///  Any metadata attached to the interface.
+    // @@protoc_insertion_point(field:google.protobuf.Api.options)
+    pub options: ::std::vec::Vec<crate::well_known_types::type_::Option>,
+    ///  A version string for this interface. If specified, must have the form
+    ///  `major-version.minor-version`, as in `1.10`. If the minor version is
+    ///  omitted, it defaults to zero. If the entire version field is empty, the
+    ///  major version is derived from the package name, as outlined below. If the
+    ///  field is not empty, the version in the package name will be verified to be
+    ///  consistent with what is provided here.
+    ///
+    ///  The versioning schema uses [semantic
+    ///  versioning](http://semver.org) where the major version number
+    ///  indicates a breaking change and the minor version an additive,
+    ///  non-breaking change. Both version numbers are signals to users
+    ///  what to expect from different versions, and should be carefully
+    ///  chosen based on the product plan.
+    ///
+    ///  The major version is also reflected in the package name of the
+    ///  interface, which must end in `v<major-version>`, as in
+    ///  `google.feature.v1`. For major versions 0 and 1, the suffix can
+    ///  be omitted. Zero major versions must only be used for
+    ///  experimental, non-GA interfaces.
+    ///
+    ///
+    // @@protoc_insertion_point(field:google.protobuf.Api.version)
     pub version: ::std::string::String,
-    pub source_context: crate::SingularPtrField<crate::well_known_types::SourceContext>,
-    pub mixins: crate::RepeatedField<Mixin>,
-    pub syntax: crate::well_known_types::Syntax,
+    ///  Source context for the protocol buffer service represented by this
+    ///  message.
+    // @@protoc_insertion_point(field:google.protobuf.Api.source_context)
+    pub source_context: crate::MessageField<crate::well_known_types::source_context::SourceContext>,
+    ///  Included interfaces. See [Mixin][].
+    // @@protoc_insertion_point(field:google.protobuf.Api.mixins)
+    pub mixins: ::std::vec::Vec<Mixin>,
+    ///  The source syntax of the service.
+    // @@protoc_insertion_point(field:google.protobuf.Api.syntax)
+    pub syntax: crate::EnumOrUnknown<crate::well_known_types::type_::Syntax>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Api.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Api {
@@ -48,234 +93,85 @@
         ::std::default::Default::default()
     }
 
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // repeated .google.protobuf.Method methods = 2;
-
-
-    pub fn get_methods(&self) -> &[Method] {
-        &self.methods
-    }
-    pub fn clear_methods(&mut self) {
-        self.methods.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_methods(&mut self, v: crate::RepeatedField<Method>) {
-        self.methods = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_methods(&mut self) -> &mut crate::RepeatedField<Method> {
-        &mut self.methods
-    }
-
-    // Take field
-    pub fn take_methods(&mut self) -> crate::RepeatedField<Method> {
-        ::std::mem::replace(&mut self.methods, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.Option options = 3;
-
-
-    pub fn get_options(&self) -> &[crate::well_known_types::Option] {
-        &self.options
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: crate::RepeatedField<crate::well_known_types::Option>) {
-        self.options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_options(&mut self) -> &mut crate::RepeatedField<crate::well_known_types::Option> {
-        &mut self.options
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> crate::RepeatedField<crate::well_known_types::Option> {
-        ::std::mem::replace(&mut self.options, crate::RepeatedField::new())
-    }
-
-    // string version = 4;
-
-
-    pub fn get_version(&self) -> &str {
-        &self.version
-    }
-    pub fn clear_version(&mut self) {
-        self.version.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_version(&mut self, v: ::std::string::String) {
-        self.version = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_version(&mut self) -> &mut ::std::string::String {
-        &mut self.version
-    }
-
-    // Take field
-    pub fn take_version(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.version, ::std::string::String::new())
-    }
-
-    // .google.protobuf.SourceContext source_context = 5;
-
-
-    pub fn get_source_context(&self) -> &crate::well_known_types::SourceContext {
-        self.source_context.as_ref().unwrap_or_else(|| <crate::well_known_types::SourceContext as crate::Message>::default_instance())
-    }
-    pub fn clear_source_context(&mut self) {
-        self.source_context.clear();
-    }
-
-    pub fn has_source_context(&self) -> bool {
-        self.source_context.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_source_context(&mut self, v: crate::well_known_types::SourceContext) {
-        self.source_context = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_source_context(&mut self) -> &mut crate::well_known_types::SourceContext {
-        if self.source_context.is_none() {
-            self.source_context.set_default();
-        }
-        self.source_context.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_source_context(&mut self) -> crate::well_known_types::SourceContext {
-        self.source_context.take().unwrap_or_else(|| crate::well_known_types::SourceContext::new())
-    }
-
-    // repeated .google.protobuf.Mixin mixins = 6;
-
-
-    pub fn get_mixins(&self) -> &[Mixin] {
-        &self.mixins
-    }
-    pub fn clear_mixins(&mut self) {
-        self.mixins.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_mixins(&mut self, v: crate::RepeatedField<Mixin>) {
-        self.mixins = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_mixins(&mut self) -> &mut crate::RepeatedField<Mixin> {
-        &mut self.mixins
-    }
-
-    // Take field
-    pub fn take_mixins(&mut self) -> crate::RepeatedField<Mixin> {
-        ::std::mem::replace(&mut self.mixins, crate::RepeatedField::new())
-    }
-
-    // .google.protobuf.Syntax syntax = 7;
-
-
-    pub fn get_syntax(&self) -> crate::well_known_types::Syntax {
-        self.syntax
-    }
-    pub fn clear_syntax(&mut self) {
-        self.syntax = crate::well_known_types::Syntax::SYNTAX_PROTO2;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_syntax(&mut self, v: crate::well_known_types::Syntax) {
-        self.syntax = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(7);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Api| { &m.name },
+            |m: &mut Api| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "methods",
+            |m: &Api| { &m.methods },
+            |m: &mut Api| { &mut m.methods },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "options",
+            |m: &Api| { &m.options },
+            |m: &mut Api| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "version",
+            |m: &Api| { &m.version },
+            |m: &mut Api| { &mut m.version },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, crate::well_known_types::source_context::SourceContext>(
+            "source_context",
+            |m: &Api| { &m.source_context },
+            |m: &mut Api| { &mut m.source_context },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "mixins",
+            |m: &Api| { &m.mixins },
+            |m: &mut Api| { &mut m.mixins },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "syntax",
+            |m: &Api| { &m.syntax },
+            |m: &mut Api| { &mut m.syntax },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Api>(
+            "Api",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Api {
+    const NAME: &'static str = "Api";
+
     fn is_initialized(&self) -> bool {
-        for v in &self.methods {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.source_context {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.mixins {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
                 },
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.methods)?;
+                18 => {
+                    self.methods.push(is.read_message()?);
                 },
-                3 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.options)?;
+                26 => {
+                    self.options.push(is.read_message()?);
                 },
-                4 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.version)?;
+                34 => {
+                    self.version = is.read_string()?;
                 },
-                5 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.source_context)?;
+                42 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.source_context)?;
                 },
-                6 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.mixins)?;
+                50 => {
+                    self.mixins.push(is.read_message()?);
                 },
-                7 => {
-                    crate::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.syntax, 7, &mut self.unknown_fields)?
+                56 => {
+                    self.syntax = is.read_enum_or_unknown()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -284,156 +180,76 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.name.is_empty() {
             my_size += crate::rt::string_size(1, &self.name);
         }
         for value in &self.methods {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         for value in &self.options {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
         if !self.version.is_empty() {
             my_size += crate::rt::string_size(4, &self.version);
         }
-        if let Some(ref v) = self.source_context.as_ref() {
+        if let Some(v) = self.source_context.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         }
         for value in &self.mixins {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if self.syntax != crate::well_known_types::Syntax::SYNTAX_PROTO2 {
-            my_size += crate::rt::enum_size(7, self.syntax);
+        if self.syntax != crate::EnumOrUnknown::new(crate::well_known_types::type_::Syntax::SYNTAX_PROTO2) {
+            my_size += crate::rt::int32_size(7, self.syntax.value());
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.name.is_empty() {
             os.write_string(1, &self.name)?;
         }
         for v in &self.methods {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
         };
         for v in &self.options {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
         };
         if !self.version.is_empty() {
             os.write_string(4, &self.version)?;
         }
-        if let Some(ref v) = self.source_context.as_ref() {
-            os.write_tag(5, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.source_context.as_ref() {
+            crate::rt::write_message_field_with_cached_size(5, v, os)?;
         }
         for v in &self.mixins {
-            os.write_tag(6, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(6, v, os)?;
         };
-        if self.syntax != crate::well_known_types::Syntax::SYNTAX_PROTO2 {
-            os.write_enum(7, crate::ProtobufEnum::value(&self.syntax))?;
+        if self.syntax != crate::EnumOrUnknown::new(crate::well_known_types::type_::Syntax::SYNTAX_PROTO2) {
+            os.write_enum(7, crate::EnumOrUnknown::value(&self.syntax))?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Api {
         Api::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Api| { &m.name },
-                |m: &mut Api| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Method>>(
-                "methods",
-                |m: &Api| { &m.methods },
-                |m: &mut Api| { &mut m.methods },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::well_known_types::Option>>(
-                "options",
-                |m: &Api| { &m.options },
-                |m: &mut Api| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "version",
-                |m: &Api| { &m.version },
-                |m: &mut Api| { &mut m.version },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::well_known_types::SourceContext>>(
-                "source_context",
-                |m: &Api| { &m.source_context },
-                |m: &mut Api| { &mut m.source_context },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Mixin>>(
-                "mixins",
-                |m: &Api| { &m.mixins },
-                |m: &mut Api| { &mut m.mixins },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeEnum<crate::well_known_types::Syntax>>(
-                "syntax",
-                |m: &Api| { &m.syntax },
-                |m: &mut Api| { &mut m.syntax },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Api>(
-                "Api",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Api {
-        static instance: crate::rt::LazyV2<Api> = crate::rt::LazyV2::INIT;
-        instance.get(Api::new)
-    }
-}
-
-impl crate::Clear for Api {
     fn clear(&mut self) {
         self.name.clear();
         self.methods.clear();
@@ -441,39 +257,71 @@
         self.version.clear();
         self.source_context.clear();
         self.mixins.clear();
-        self.syntax = crate::well_known_types::Syntax::SYNTAX_PROTO2;
-        self.unknown_fields.clear();
+        self.syntax = crate::EnumOrUnknown::new(crate::well_known_types::type_::Syntax::SYNTAX_PROTO2);
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Api {
+        static instance: Api = Api {
+            name: ::std::string::String::new(),
+            methods: ::std::vec::Vec::new(),
+            options: ::std::vec::Vec::new(),
+            version: ::std::string::String::new(),
+            source_context: crate::MessageField::none(),
+            mixins: ::std::vec::Vec::new(),
+            syntax: crate::EnumOrUnknown::from_i32(0),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Api {
+impl crate::MessageFull for Api {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Api").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Api {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Api {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Method represents a method of an API interface.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Method)
 pub struct Method {
     // message fields
+    ///  The simple name of this method.
+    // @@protoc_insertion_point(field:google.protobuf.Method.name)
     pub name: ::std::string::String,
+    ///  A URL of the input message type.
+    // @@protoc_insertion_point(field:google.protobuf.Method.request_type_url)
     pub request_type_url: ::std::string::String,
+    ///  If true, the request is streamed.
+    // @@protoc_insertion_point(field:google.protobuf.Method.request_streaming)
     pub request_streaming: bool,
+    ///  The URL of the output message type.
+    // @@protoc_insertion_point(field:google.protobuf.Method.response_type_url)
     pub response_type_url: ::std::string::String,
+    ///  If true, the response is streamed.
+    // @@protoc_insertion_point(field:google.protobuf.Method.response_streaming)
     pub response_streaming: bool,
-    pub options: crate::RepeatedField<crate::well_known_types::Option>,
-    pub syntax: crate::well_known_types::Syntax,
+    ///  Any metadata attached to the method.
+    // @@protoc_insertion_point(field:google.protobuf.Method.options)
+    pub options: ::std::vec::Vec<crate::well_known_types::type_::Option>,
+    ///  The source syntax of this method.
+    // @@protoc_insertion_point(field:google.protobuf.Method.syntax)
+    pub syntax: crate::EnumOrUnknown<crate::well_known_types::type_::Syntax>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Method.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Method {
@@ -487,200 +335,85 @@
         ::std::default::Default::default()
     }
 
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // string request_type_url = 2;
-
-
-    pub fn get_request_type_url(&self) -> &str {
-        &self.request_type_url
-    }
-    pub fn clear_request_type_url(&mut self) {
-        self.request_type_url.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_request_type_url(&mut self, v: ::std::string::String) {
-        self.request_type_url = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_request_type_url(&mut self) -> &mut ::std::string::String {
-        &mut self.request_type_url
-    }
-
-    // Take field
-    pub fn take_request_type_url(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.request_type_url, ::std::string::String::new())
-    }
-
-    // bool request_streaming = 3;
-
-
-    pub fn get_request_streaming(&self) -> bool {
-        self.request_streaming
-    }
-    pub fn clear_request_streaming(&mut self) {
-        self.request_streaming = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_request_streaming(&mut self, v: bool) {
-        self.request_streaming = v;
-    }
-
-    // string response_type_url = 4;
-
-
-    pub fn get_response_type_url(&self) -> &str {
-        &self.response_type_url
-    }
-    pub fn clear_response_type_url(&mut self) {
-        self.response_type_url.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_response_type_url(&mut self, v: ::std::string::String) {
-        self.response_type_url = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_response_type_url(&mut self) -> &mut ::std::string::String {
-        &mut self.response_type_url
-    }
-
-    // Take field
-    pub fn take_response_type_url(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.response_type_url, ::std::string::String::new())
-    }
-
-    // bool response_streaming = 5;
-
-
-    pub fn get_response_streaming(&self) -> bool {
-        self.response_streaming
-    }
-    pub fn clear_response_streaming(&mut self) {
-        self.response_streaming = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_response_streaming(&mut self, v: bool) {
-        self.response_streaming = v;
-    }
-
-    // repeated .google.protobuf.Option options = 6;
-
-
-    pub fn get_options(&self) -> &[crate::well_known_types::Option] {
-        &self.options
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: crate::RepeatedField<crate::well_known_types::Option>) {
-        self.options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_options(&mut self) -> &mut crate::RepeatedField<crate::well_known_types::Option> {
-        &mut self.options
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> crate::RepeatedField<crate::well_known_types::Option> {
-        ::std::mem::replace(&mut self.options, crate::RepeatedField::new())
-    }
-
-    // .google.protobuf.Syntax syntax = 7;
-
-
-    pub fn get_syntax(&self) -> crate::well_known_types::Syntax {
-        self.syntax
-    }
-    pub fn clear_syntax(&mut self) {
-        self.syntax = crate::well_known_types::Syntax::SYNTAX_PROTO2;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_syntax(&mut self, v: crate::well_known_types::Syntax) {
-        self.syntax = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(7);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Method| { &m.name },
+            |m: &mut Method| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "request_type_url",
+            |m: &Method| { &m.request_type_url },
+            |m: &mut Method| { &mut m.request_type_url },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "request_streaming",
+            |m: &Method| { &m.request_streaming },
+            |m: &mut Method| { &mut m.request_streaming },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "response_type_url",
+            |m: &Method| { &m.response_type_url },
+            |m: &mut Method| { &mut m.response_type_url },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "response_streaming",
+            |m: &Method| { &m.response_streaming },
+            |m: &mut Method| { &mut m.response_streaming },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "options",
+            |m: &Method| { &m.options },
+            |m: &mut Method| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "syntax",
+            |m: &Method| { &m.syntax },
+            |m: &mut Method| { &mut m.syntax },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Method>(
+            "Method",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Method {
+    const NAME: &'static str = "Method";
+
     fn is_initialized(&self) -> bool {
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
                 },
-                2 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.request_type_url)?;
+                18 => {
+                    self.request_type_url = is.read_string()?;
                 },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.request_streaming = tmp;
+                24 => {
+                    self.request_streaming = is.read_bool()?;
                 },
-                4 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.response_type_url)?;
+                34 => {
+                    self.response_type_url = is.read_string()?;
                 },
-                5 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.response_streaming = tmp;
+                40 => {
+                    self.response_streaming = is.read_bool()?;
                 },
-                6 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.options)?;
+                50 => {
+                    self.options.push(is.read_message()?);
                 },
-                7 => {
-                    crate::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.syntax, 7, &mut self.unknown_fields)?
+                56 => {
+                    self.syntax = is.read_enum_or_unknown()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -689,7 +422,7 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.name.is_empty() {
             my_size += crate::rt::string_size(1, &self.name);
@@ -698,27 +431,27 @@
             my_size += crate::rt::string_size(2, &self.request_type_url);
         }
         if self.request_streaming != false {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         if !self.response_type_url.is_empty() {
             my_size += crate::rt::string_size(4, &self.response_type_url);
         }
         if self.response_streaming != false {
-            my_size += 2;
+            my_size += 1 + 1;
         }
         for value in &self.options {
             let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
         };
-        if self.syntax != crate::well_known_types::Syntax::SYNTAX_PROTO2 {
-            my_size += crate::rt::enum_size(7, self.syntax);
+        if self.syntax != crate::EnumOrUnknown::new(crate::well_known_types::type_::Syntax::SYNTAX_PROTO2) {
+            my_size += crate::rt::int32_size(7, self.syntax.value());
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.name.is_empty() {
             os.write_string(1, &self.name)?;
         }
@@ -735,101 +468,27 @@
             os.write_bool(5, self.response_streaming)?;
         }
         for v in &self.options {
-            os.write_tag(6, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            crate::rt::write_message_field_with_cached_size(6, v, os)?;
         };
-        if self.syntax != crate::well_known_types::Syntax::SYNTAX_PROTO2 {
-            os.write_enum(7, crate::ProtobufEnum::value(&self.syntax))?;
+        if self.syntax != crate::EnumOrUnknown::new(crate::well_known_types::type_::Syntax::SYNTAX_PROTO2) {
+            os.write_enum(7, crate::EnumOrUnknown::value(&self.syntax))?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Method {
         Method::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Method| { &m.name },
-                |m: &mut Method| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "request_type_url",
-                |m: &Method| { &m.request_type_url },
-                |m: &mut Method| { &mut m.request_type_url },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeBool>(
-                "request_streaming",
-                |m: &Method| { &m.request_streaming },
-                |m: &mut Method| { &mut m.request_streaming },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "response_type_url",
-                |m: &Method| { &m.response_type_url },
-                |m: &mut Method| { &mut m.response_type_url },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeBool>(
-                "response_streaming",
-                |m: &Method| { &m.response_streaming },
-                |m: &mut Method| { &mut m.response_streaming },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::well_known_types::Option>>(
-                "options",
-                |m: &Method| { &m.options },
-                |m: &mut Method| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeEnum<crate::well_known_types::Syntax>>(
-                "syntax",
-                |m: &Method| { &m.syntax },
-                |m: &mut Method| { &mut m.syntax },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Method>(
-                "Method",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Method {
-        static instance: crate::rt::LazyV2<Method> = crate::rt::LazyV2::INIT;
-        instance.get(Method::new)
-    }
-}
-
-impl crate::Clear for Method {
     fn clear(&mut self) {
         self.name.clear();
         self.request_type_url.clear();
@@ -837,34 +496,56 @@
         self.response_type_url.clear();
         self.response_streaming = false;
         self.options.clear();
-        self.syntax = crate::well_known_types::Syntax::SYNTAX_PROTO2;
-        self.unknown_fields.clear();
+        self.syntax = crate::EnumOrUnknown::new(crate::well_known_types::type_::Syntax::SYNTAX_PROTO2);
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Method {
+        static instance: Method = Method {
+            name: ::std::string::String::new(),
+            request_type_url: ::std::string::String::new(),
+            request_streaming: false,
+            response_type_url: ::std::string::String::new(),
+            response_streaming: false,
+            options: ::std::vec::Vec::new(),
+            syntax: crate::EnumOrUnknown::from_i32(0),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Method {
+impl crate::MessageFull for Method {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Method").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Method {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Method {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Mixin)
 pub struct Mixin {
     // message fields
+    ///  The fully qualified name of the interface which is included.
+    // @@protoc_insertion_point(field:google.protobuf.Mixin.name)
     pub name: ::std::string::String,
+    ///  If non-empty specifies a path under which inherited HTTP paths
+    ///  are rooted.
+    // @@protoc_insertion_point(field:google.protobuf.Mixin.root)
     pub root: ::std::string::String,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Mixin.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Mixin {
@@ -878,76 +559,45 @@
         ::std::default::Default::default()
     }
 
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // string root = 2;
-
-
-    pub fn get_root(&self) -> &str {
-        &self.root
-    }
-    pub fn clear_root(&mut self) {
-        self.root.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_root(&mut self, v: ::std::string::String) {
-        self.root = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_root(&mut self) -> &mut ::std::string::String {
-        &mut self.root
-    }
-
-    // Take field
-    pub fn take_root(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.root, ::std::string::String::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Mixin| { &m.name },
+            |m: &mut Mixin| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "root",
+            |m: &Mixin| { &m.root },
+            |m: &mut Mixin| { &mut m.root },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Mixin>(
+            "Mixin",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Mixin {
+    const NAME: &'static str = "Mixin";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
                 },
-                2 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.root)?;
+                18 => {
+                    self.root = is.read_string()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -956,7 +606,7 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.name.is_empty() {
             my_size += crate::rt::string_size(1, &self.name);
@@ -964,98 +614,65 @@
         if !self.root.is_empty() {
             my_size += crate::rt::string_size(2, &self.root);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.name.is_empty() {
             os.write_string(1, &self.name)?;
         }
         if !self.root.is_empty() {
             os.write_string(2, &self.root)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Mixin {
         Mixin::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Mixin| { &m.name },
-                |m: &mut Mixin| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "root",
-                |m: &Mixin| { &m.root },
-                |m: &mut Mixin| { &mut m.root },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Mixin>(
-                "Mixin",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Mixin {
-        static instance: crate::rt::LazyV2<Mixin> = crate::rt::LazyV2::INIT;
-        instance.get(Mixin::new)
-    }
-}
-
-impl crate::Clear for Mixin {
     fn clear(&mut self) {
         self.name.clear();
         self.root.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Mixin {
+        static instance: Mixin = Mixin {
+            name: ::std::string::String::new(),
+            root: ::std::string::String::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Mixin {
+impl crate::MessageFull for Mixin {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Mixin").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Mixin {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Mixin {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -1279,14 +896,35 @@
     \xce\x01\x10\x11b\x06proto3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(2);
+            deps.push(crate::well_known_types::source_context::file_descriptor().clone());
+            deps.push(crate::well_known_types::type_::file_descriptor().clone());
+            let mut messages = ::std::vec::Vec::with_capacity(3);
+            messages.push(Api::generated_message_descriptor_data());
+            messages.push(Method::generated_message_descriptor_data());
+            messages.push(Mixin::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/duration.rs b/src/well_known_types/duration.rs
index 822061a..1162a59 100644
--- a/src/well_known_types/duration.rs
+++ b/src/well_known_types/duration.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,21 +16,31 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/duration.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Duration)
 pub struct Duration {
     // message fields
+    ///  Signed seconds of the span of time. Must be from -315,576,000,000
+    ///  to +315,576,000,000 inclusive. Note: these bounds are computed from:
+    ///  60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+    // @@protoc_insertion_point(field:google.protobuf.Duration.seconds)
     pub seconds: i64,
+    ///  Signed fractions of a second at nanosecond resolution of the span
+    ///  of time. Durations less than one second are represented with a 0
+    ///  `seconds` field and a positive or negative `nanos` field. For durations
+    ///  of one second or more, a non-zero value for the `nanos` field must be
+    ///  of the same sign as the `seconds` field. Must be from -999,999,999
+    ///  to +999,999,999 inclusive.
+    // @@protoc_insertion_point(field:google.protobuf.Duration.nanos)
     pub nanos: i32,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Duration.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Duration {
@@ -43,62 +54,45 @@
         ::std::default::Default::default()
     }
 
-    // int64 seconds = 1;
-
-
-    pub fn get_seconds(&self) -> i64 {
-        self.seconds
-    }
-    pub fn clear_seconds(&mut self) {
-        self.seconds = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_seconds(&mut self, v: i64) {
-        self.seconds = v;
-    }
-
-    // int32 nanos = 2;
-
-
-    pub fn get_nanos(&self) -> i32 {
-        self.nanos
-    }
-    pub fn clear_nanos(&mut self) {
-        self.nanos = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_nanos(&mut self, v: i32) {
-        self.nanos = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "seconds",
+            |m: &Duration| { &m.seconds },
+            |m: &mut Duration| { &mut m.seconds },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "nanos",
+            |m: &Duration| { &m.nanos },
+            |m: &mut Duration| { &mut m.nanos },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Duration>(
+            "Duration",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Duration {
+    const NAME: &'static str = "Duration";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.seconds = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.seconds = is.read_int64()?;
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.nanos = tmp;
+                16 => {
+                    self.nanos = is.read_int32()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -107,106 +101,73 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.seconds != 0 {
-            my_size += crate::rt::value_size(1, self.seconds, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int64_size(1, self.seconds);
         }
         if self.nanos != 0 {
-            my_size += crate::rt::value_size(2, self.nanos, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(2, self.nanos);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.seconds != 0 {
             os.write_int64(1, self.seconds)?;
         }
         if self.nanos != 0 {
             os.write_int32(2, self.nanos)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Duration {
         Duration::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt64>(
-                "seconds",
-                |m: &Duration| { &m.seconds },
-                |m: &mut Duration| { &mut m.seconds },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "nanos",
-                |m: &Duration| { &m.nanos },
-                |m: &mut Duration| { &mut m.nanos },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Duration>(
-                "Duration",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Duration {
-        static instance: crate::rt::LazyV2<Duration> = crate::rt::LazyV2::INIT;
-        instance.get(Duration::new)
-    }
-}
-
-impl crate::Clear for Duration {
     fn clear(&mut self) {
         self.seconds = 0;
         self.nanos = 0;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Duration {
+        static instance: Duration = Duration {
+            seconds: 0,
+            nanos: 0,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Duration {
+impl crate::MessageFull for Duration {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Duration").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Duration {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Duration {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -325,14 +286,31 @@
     3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(Duration::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/empty.rs b/src/well_known_types/empty.rs
index d55e517..acb4d00 100644
--- a/src/well_known_types/empty.rs
+++ b/src/well_known_types/empty.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,18 +16,17 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/empty.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Empty)
 pub struct Empty {
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Empty.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Empty {
@@ -39,19 +39,30 @@
     pub fn new() -> Empty {
         ::std::default::Default::default()
     }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(0);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Empty>(
+            "Empty",
+            fields,
+            oneofs,
+        )
+    }
 }
 
 impl crate::Message for Empty {
+    const NAME: &'static str = "Empty";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -60,82 +71,57 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        os.write_unknown_fields(self.get_unknown_fields())?;
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Empty {
         Empty::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let fields = ::std::vec::Vec::new();
-            crate::reflect::MessageDescriptor::new_pb_name::<Empty>(
-                "Empty",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static Empty {
-        static instance: crate::rt::LazyV2<Empty> = crate::rt::LazyV2::INIT;
-        instance.get(Empty::new)
+        static instance: Empty = Empty {
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for Empty {
-    fn clear(&mut self) {
-        self.unknown_fields.clear();
+impl crate::MessageFull for Empty {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Empty").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for Empty {
+impl ::std::fmt::Display for Empty {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Empty {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -195,14 +181,31 @@
     \x12\x033\x08\rb\x06proto3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(Empty::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/field_mask.rs b/src/well_known_types/field_mask.rs
index e98eb53..9a31c0a 100644
--- a/src/well_known_types/field_mask.rs
+++ b/src/well_known_types/field_mask.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,20 +16,21 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/field_mask.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FieldMask)
 pub struct FieldMask {
     // message fields
-    pub paths: crate::RepeatedField<::std::string::String>,
+    ///  The set of field mask paths.
+    // @@protoc_insertion_point(field:google.protobuf.FieldMask.paths)
+    pub paths: ::std::vec::Vec<::std::string::String>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FieldMask.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FieldMask {
@@ -42,46 +44,37 @@
         ::std::default::Default::default()
     }
 
-    // repeated string paths = 1;
-
-
-    pub fn get_paths(&self) -> &[::std::string::String] {
-        &self.paths
-    }
-    pub fn clear_paths(&mut self) {
-        self.paths.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_paths(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.paths = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_paths(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.paths
-    }
-
-    // Take field
-    pub fn take_paths(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.paths, crate::RepeatedField::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "paths",
+            |m: &FieldMask| { &m.paths },
+            |m: &mut FieldMask| { &mut m.paths },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FieldMask>(
+            "FieldMask",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for FieldMask {
+    const NAME: &'static str = "FieldMask";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.paths)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.paths.push(is.read_string()?);
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -90,94 +83,65 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         for value in &self.paths {
             my_size += crate::rt::string_size(1, &value);
         };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         for v in &self.paths {
             os.write_string(1, &v)?;
         };
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FieldMask {
         FieldMask::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "paths",
-                |m: &FieldMask| { &m.paths },
-                |m: &mut FieldMask| { &mut m.paths },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FieldMask>(
-                "FieldMask",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.paths.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static FieldMask {
-        static instance: crate::rt::LazyV2<FieldMask> = crate::rt::LazyV2::INIT;
-        instance.get(FieldMask::new)
+        static instance: FieldMask = FieldMask {
+            paths: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for FieldMask {
-    fn clear(&mut self) {
-        self.paths.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for FieldMask {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FieldMask").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for FieldMask {
+impl ::std::fmt::Display for FieldMask {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FieldMask {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -372,14 +336,31 @@
     3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(FieldMask::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/mod.rs b/src/well_known_types/mod.rs
index 9ecf8fb..d2e1659 100644
--- a/src/well_known_types/mod.rs
+++ b/src/well_known_types/mod.rs
@@ -1,26 +1,19 @@
 // This file is generated. Do not edit
+// @generated
 //! Generated code for "well known types"
 //!
 //! [This document](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf) describes these types.
 
-mod any;
-mod api;
-mod duration;
-mod empty;
-mod field_mask;
-mod source_context;
-mod struct_pb;
-mod timestamp;
-mod type_pb;
-mod wrappers;
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
 
-pub use self::any::*;
-pub use self::api::*;
-pub use self::duration::*;
-pub use self::empty::*;
-pub use self::field_mask::*;
-pub use self::source_context::*;
-pub use self::struct_pb::*;
-pub use self::timestamp::*;
-pub use self::type_pb::*;
-pub use self::wrappers::*;
+pub mod any;
+pub mod api;
+pub mod duration;
+pub mod empty;
+pub mod field_mask;
+pub mod source_context;
+pub mod struct_;
+pub mod timestamp;
+pub mod type_;
+pub mod wrappers;
diff --git a/src/well_known_types/source_context.rs b/src/well_known_types/source_context.rs
index 646e87d..7edcecc 100644
--- a/src/well_known_types/source_context.rs
+++ b/src/well_known_types/source_context.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,20 +16,24 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/source_context.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  `SourceContext` represents information about the source of a
+///  protobuf element, like the file in which it is defined.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.SourceContext)
 pub struct SourceContext {
     // message fields
+    ///  The path-qualified name of the .proto file that contained the associated
+    ///  protobuf element.  For example: `"google/protobuf/source_context.proto"`.
+    // @@protoc_insertion_point(field:google.protobuf.SourceContext.file_name)
     pub file_name: ::std::string::String,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.SourceContext.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a SourceContext {
@@ -42,47 +47,37 @@
         ::std::default::Default::default()
     }
 
-    // string file_name = 1;
-
-
-    pub fn get_file_name(&self) -> &str {
-        &self.file_name
-    }
-    pub fn clear_file_name(&mut self) {
-        self.file_name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_file_name(&mut self, v: ::std::string::String) {
-        self.file_name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_file_name(&mut self) -> &mut ::std::string::String {
-        &mut self.file_name
-    }
-
-    // Take field
-    pub fn take_file_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.file_name, ::std::string::String::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "file_name",
+            |m: &SourceContext| { &m.file_name },
+            |m: &mut SourceContext| { &mut m.file_name },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<SourceContext>(
+            "SourceContext",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for SourceContext {
+    const NAME: &'static str = "SourceContext";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.file_name)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.file_name = is.read_string()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -91,94 +86,65 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.file_name.is_empty() {
             my_size += crate::rt::string_size(1, &self.file_name);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.file_name.is_empty() {
             os.write_string(1, &self.file_name)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> SourceContext {
         SourceContext::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "file_name",
-                |m: &SourceContext| { &m.file_name },
-                |m: &mut SourceContext| { &mut m.file_name },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<SourceContext>(
-                "SourceContext",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.file_name.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static SourceContext {
-        static instance: crate::rt::LazyV2<SourceContext> = crate::rt::LazyV2::INIT;
-        instance.get(SourceContext::new)
+        static instance: SourceContext = SourceContext {
+            file_name: ::std::string::String::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for SourceContext {
-    fn clear(&mut self) {
-        self.file_name.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for SourceContext {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("SourceContext").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for SourceContext {
+impl ::std::fmt::Display for SourceContext {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for SourceContext {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -238,14 +204,31 @@
     \x16b\x06proto3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(SourceContext::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/struct_.rs b/src/well_known_types/struct_.rs
new file mode 100644
index 0000000..d565c81
--- /dev/null
+++ b/src/well_known_types/struct_.rs
@@ -0,0 +1,990 @@
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
+// @generated
+
+// https://github.com/rust-lang/rust-clippy/issues/702
+#![allow(unknown_lints)]
+#![allow(clippy::all)]
+
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
+
+#![allow(box_pointers)]
+#![allow(dead_code)]
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+#![allow(trivial_casts)]
+#![allow(unused_results)]
+#![allow(unused_mut)]
+
+//! Generated file from `google/protobuf/struct.proto`
+
+///  `Struct` represents a structured data value, consisting of fields
+///  which map to dynamically typed values. In some languages, `Struct`
+///  might be supported by a native representation. For example, in
+///  scripting languages like JS a struct is represented as an
+///  object. The details of that representation are described together
+///  with the proto support for the language.
+///
+///  The JSON representation for `Struct` is JSON object.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Struct)
+pub struct Struct {
+    // message fields
+    ///  Unordered map of dynamically typed values.
+    // @@protoc_insertion_point(field:google.protobuf.Struct.fields)
+    pub fields: ::std::collections::HashMap<::std::string::String, Value>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.Struct.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Struct {
+    fn default() -> &'a Struct {
+        <Struct as crate::Message>::default_instance()
+    }
+}
+
+impl Struct {
+    pub fn new() -> Struct {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(
+            "fields",
+            |m: &Struct| { &m.fields },
+            |m: &mut Struct| { &mut m.fields },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Struct>(
+            "Struct",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for Struct {
+    const NAME: &'static str = "Struct";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    let len = is.read_raw_varint32()?;
+                    let old_limit = is.push_limit(len as u64)?;
+                    let mut key = ::std::default::Default::default();
+                    let mut value = ::std::default::Default::default();
+                    while let Some(tag) = is.read_raw_tag_or_eof()? {
+                        match tag {
+                            10 => key = is.read_string()?,
+                            18 => value = is.read_message()?,
+                            _ => crate::rt::skip_field_for_tag(tag, is)?,
+                        };
+                    }
+                    is.pop_limit(old_limit);
+                    self.fields.insert(key, value);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        for (k, v) in &self.fields {
+            let mut entry_size = 0;
+            entry_size += crate::rt::string_size(1, &k);
+            let len = v.compute_size();
+            entry_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+            my_size += 1 + crate::rt::compute_raw_varint64_size(entry_size) + entry_size
+        };
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        for (k, v) in &self.fields {
+            let mut entry_size = 0;
+            entry_size += crate::rt::string_size(1, &k);
+            let len = v.cached_size() as u64;
+            entry_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+            os.write_raw_varint32(10)?; // Tag.
+            os.write_raw_varint32(entry_size as u32)?;
+            os.write_string(1, &k)?;
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
+        };
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Struct {
+        Struct::new()
+    }
+
+    fn clear(&mut self) {
+        self.fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Struct {
+        static instance: crate::rt::Lazy<Struct> = crate::rt::Lazy::new();
+        instance.get(Struct::new)
+    }
+}
+
+impl crate::MessageFull for Struct {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Struct").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Struct {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for Struct {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+///  `Value` represents a dynamically typed value which can be either
+///  null, a number, a string, a boolean, a recursive struct value, or a
+///  list of values. A producer of value is expected to set one of these
+///  variants. Absence of any variant indicates an error.
+///
+///  The JSON representation for `Value` is JSON value.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Value)
+pub struct Value {
+    // message oneof groups
+    pub kind: ::std::option::Option<value::Kind>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.Value.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Value {
+    fn default() -> &'a Value {
+        <Value as crate::Message>::default_instance()
+    }
+}
+
+impl Value {
+    pub fn new() -> Value {
+        ::std::default::Default::default()
+    }
+
+    // .google.protobuf.NullValue null_value = 1;
+
+    pub fn null_value(&self) -> NullValue {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::NullValue(v)) => crate::EnumOrUnknown::enum_value_or_default(&v),
+            _ => NullValue::NULL_VALUE,
+        }
+    }
+
+    pub fn clear_null_value(&mut self) {
+        self.kind = ::std::option::Option::None;
+    }
+
+    pub fn has_null_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::NullValue(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_null_value(&mut self, v: NullValue) {
+        self.kind = ::std::option::Option::Some(value::Kind::NullValue(crate::EnumOrUnknown::new(v)))
+    }
+
+    // double number_value = 2;
+
+    pub fn number_value(&self) -> f64 {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::NumberValue(v)) => v,
+            _ => 0.,
+        }
+    }
+
+    pub fn clear_number_value(&mut self) {
+        self.kind = ::std::option::Option::None;
+    }
+
+    pub fn has_number_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::NumberValue(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_number_value(&mut self, v: f64) {
+        self.kind = ::std::option::Option::Some(value::Kind::NumberValue(v))
+    }
+
+    // string string_value = 3;
+
+    pub fn string_value(&self) -> &str {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::StringValue(ref v)) => v,
+            _ => "",
+        }
+    }
+
+    pub fn clear_string_value(&mut self) {
+        self.kind = ::std::option::Option::None;
+    }
+
+    pub fn has_string_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::StringValue(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_string_value(&mut self, v: ::std::string::String) {
+        self.kind = ::std::option::Option::Some(value::Kind::StringValue(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_string_value(&mut self) -> &mut ::std::string::String {
+        if let ::std::option::Option::Some(value::Kind::StringValue(_)) = self.kind {
+        } else {
+            self.kind = ::std::option::Option::Some(value::Kind::StringValue(::std::string::String::new()));
+        }
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::StringValue(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_string_value(&mut self) -> ::std::string::String {
+        if self.has_string_value() {
+            match self.kind.take() {
+                ::std::option::Option::Some(value::Kind::StringValue(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            ::std::string::String::new()
+        }
+    }
+
+    // bool bool_value = 4;
+
+    pub fn bool_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::BoolValue(v)) => v,
+            _ => false,
+        }
+    }
+
+    pub fn clear_bool_value(&mut self) {
+        self.kind = ::std::option::Option::None;
+    }
+
+    pub fn has_bool_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::BoolValue(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_bool_value(&mut self, v: bool) {
+        self.kind = ::std::option::Option::Some(value::Kind::BoolValue(v))
+    }
+
+    // .google.protobuf.Struct struct_value = 5;
+
+    pub fn struct_value(&self) -> &Struct {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::StructValue(ref v)) => v,
+            _ => <Struct as crate::Message>::default_instance(),
+        }
+    }
+
+    pub fn clear_struct_value(&mut self) {
+        self.kind = ::std::option::Option::None;
+    }
+
+    pub fn has_struct_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::StructValue(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_struct_value(&mut self, v: Struct) {
+        self.kind = ::std::option::Option::Some(value::Kind::StructValue(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_struct_value(&mut self) -> &mut Struct {
+        if let ::std::option::Option::Some(value::Kind::StructValue(_)) = self.kind {
+        } else {
+            self.kind = ::std::option::Option::Some(value::Kind::StructValue(Struct::new()));
+        }
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::StructValue(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_struct_value(&mut self) -> Struct {
+        if self.has_struct_value() {
+            match self.kind.take() {
+                ::std::option::Option::Some(value::Kind::StructValue(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            Struct::new()
+        }
+    }
+
+    // .google.protobuf.ListValue list_value = 6;
+
+    pub fn list_value(&self) -> &ListValue {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::ListValue(ref v)) => v,
+            _ => <ListValue as crate::Message>::default_instance(),
+        }
+    }
+
+    pub fn clear_list_value(&mut self) {
+        self.kind = ::std::option::Option::None;
+    }
+
+    pub fn has_list_value(&self) -> bool {
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::ListValue(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_list_value(&mut self, v: ListValue) {
+        self.kind = ::std::option::Option::Some(value::Kind::ListValue(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_list_value(&mut self) -> &mut ListValue {
+        if let ::std::option::Option::Some(value::Kind::ListValue(_)) = self.kind {
+        } else {
+            self.kind = ::std::option::Option::Some(value::Kind::ListValue(ListValue::new()));
+        }
+        match self.kind {
+            ::std::option::Option::Some(value::Kind::ListValue(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_list_value(&mut self) -> ListValue {
+        if self.has_list_value() {
+            match self.kind.take() {
+                ::std::option::Option::Some(value::Kind::ListValue(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            ListValue::new()
+        }
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(6);
+        let mut oneofs = ::std::vec::Vec::with_capacity(1);
+        fields.push(crate::reflect::rt::v2::make_oneof_enum_accessors::<_, _>(
+            "null_value",
+            |message: &Value| match &message.kind {
+                ::std::option::Option::Some(value::Kind::NullValue(e)) => ::std::option::Option::Some(*e),
+                _ => ::std::option::Option::None,
+            },
+            |message: &mut Value, e: crate::EnumOrUnknown<NullValue>| {
+                message.kind = ::std::option::Option::Some(value::Kind::NullValue(e));
+            },
+            NullValue::NULL_VALUE,
+        ));
+        fields.push(crate::reflect::rt::v2::make_oneof_copy_has_get_set_simpler_accessors::<_, _>(
+            "number_value",
+            Value::has_number_value,
+            Value::number_value,
+            Value::set_number_value,
+        ));
+        fields.push(crate::reflect::rt::v2::make_oneof_deref_has_get_set_simpler_accessor::<_, _>(
+            "string_value",
+            Value::has_string_value,
+            Value::string_value,
+            Value::set_string_value,
+        ));
+        fields.push(crate::reflect::rt::v2::make_oneof_copy_has_get_set_simpler_accessors::<_, _>(
+            "bool_value",
+            Value::has_bool_value,
+            Value::bool_value,
+            Value::set_bool_value,
+        ));
+        fields.push(crate::reflect::rt::v2::make_oneof_message_has_get_mut_set_accessor::<_, Struct>(
+            "struct_value",
+            Value::has_struct_value,
+            Value::struct_value,
+            Value::mut_struct_value,
+            Value::set_struct_value,
+        ));
+        fields.push(crate::reflect::rt::v2::make_oneof_message_has_get_mut_set_accessor::<_, ListValue>(
+            "list_value",
+            Value::has_list_value,
+            Value::list_value,
+            Value::mut_list_value,
+            Value::set_list_value,
+        ));
+        oneofs.push(value::Kind::generated_oneof_descriptor_data());
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Value>(
+            "Value",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for Value {
+    const NAME: &'static str = "Value";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.kind = ::std::option::Option::Some(value::Kind::NullValue(is.read_enum_or_unknown()?));
+                },
+                17 => {
+                    self.kind = ::std::option::Option::Some(value::Kind::NumberValue(is.read_double()?));
+                },
+                26 => {
+                    self.kind = ::std::option::Option::Some(value::Kind::StringValue(is.read_string()?));
+                },
+                32 => {
+                    self.kind = ::std::option::Option::Some(value::Kind::BoolValue(is.read_bool()?));
+                },
+                42 => {
+                    self.kind = ::std::option::Option::Some(value::Kind::StructValue(is.read_message()?));
+                },
+                50 => {
+                    self.kind = ::std::option::Option::Some(value::Kind::ListValue(is.read_message()?));
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        if let ::std::option::Option::Some(ref v) = self.kind {
+            match v {
+                &value::Kind::NullValue(v) => {
+                    my_size += crate::rt::int32_size(1, v.value());
+                },
+                &value::Kind::NumberValue(v) => {
+                    my_size += 1 + 8;
+                },
+                &value::Kind::StringValue(ref v) => {
+                    my_size += crate::rt::string_size(3, &v);
+                },
+                &value::Kind::BoolValue(v) => {
+                    my_size += 1 + 1;
+                },
+                &value::Kind::StructValue(ref v) => {
+                    let len = v.compute_size();
+                    my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+                },
+                &value::Kind::ListValue(ref v) => {
+                    let len = v.compute_size();
+                    my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+                },
+            };
+        }
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if let ::std::option::Option::Some(ref v) = self.kind {
+            match v {
+                &value::Kind::NullValue(v) => {
+                    os.write_enum(1, crate::EnumOrUnknown::value(&v))?;
+                },
+                &value::Kind::NumberValue(v) => {
+                    os.write_double(2, v)?;
+                },
+                &value::Kind::StringValue(ref v) => {
+                    os.write_string(3, v)?;
+                },
+                &value::Kind::BoolValue(v) => {
+                    os.write_bool(4, v)?;
+                },
+                &value::Kind::StructValue(ref v) => {
+                    crate::rt::write_message_field_with_cached_size(5, v, os)?;
+                },
+                &value::Kind::ListValue(ref v) => {
+                    crate::rt::write_message_field_with_cached_size(6, v, os)?;
+                },
+            };
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Value {
+        Value::new()
+    }
+
+    fn clear(&mut self) {
+        self.kind = ::std::option::Option::None;
+        self.kind = ::std::option::Option::None;
+        self.kind = ::std::option::Option::None;
+        self.kind = ::std::option::Option::None;
+        self.kind = ::std::option::Option::None;
+        self.kind = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Value {
+        static instance: Value = Value {
+            kind: ::std::option::Option::None,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for Value {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Value").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Value {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for Value {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+/// Nested message and enums of message `Value`
+pub mod value {
+
+    #[derive(Clone,PartialEq,Debug)]
+    #[non_exhaustive]
+    // @@protoc_insertion_point(oneof:google.protobuf.Value.kind)
+    pub enum Kind {
+        // @@protoc_insertion_point(oneof_field:google.protobuf.Value.null_value)
+        NullValue(crate::EnumOrUnknown<super::NullValue>),
+        // @@protoc_insertion_point(oneof_field:google.protobuf.Value.number_value)
+        NumberValue(f64),
+        // @@protoc_insertion_point(oneof_field:google.protobuf.Value.string_value)
+        StringValue(::std::string::String),
+        // @@protoc_insertion_point(oneof_field:google.protobuf.Value.bool_value)
+        BoolValue(bool),
+        // @@protoc_insertion_point(oneof_field:google.protobuf.Value.struct_value)
+        StructValue(super::Struct),
+        // @@protoc_insertion_point(oneof_field:google.protobuf.Value.list_value)
+        ListValue(super::ListValue),
+    }
+
+    impl crate::Oneof for Kind {
+    }
+
+    impl crate::OneofFull for Kind {
+        fn descriptor() -> crate::reflect::OneofDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::OneofDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| <super::Value as crate::MessageFull>::descriptor().oneof_by_name("kind").unwrap()).clone()
+        }
+    }
+
+    impl Kind {
+        pub(in super) fn generated_oneof_descriptor_data() -> crate::reflect::GeneratedOneofDescriptorData {
+            crate::reflect::GeneratedOneofDescriptorData::new::<Kind>("kind")
+        }
+    }
+}
+
+///  `ListValue` is a wrapper around a repeated field of values.
+///
+///  The JSON representation for `ListValue` is JSON array.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.ListValue)
+pub struct ListValue {
+    // message fields
+    ///  Repeated field of dynamically typed values.
+    // @@protoc_insertion_point(field:google.protobuf.ListValue.values)
+    pub values: ::std::vec::Vec<Value>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.ListValue.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a ListValue {
+    fn default() -> &'a ListValue {
+        <ListValue as crate::Message>::default_instance()
+    }
+}
+
+impl ListValue {
+    pub fn new() -> ListValue {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "values",
+            |m: &ListValue| { &m.values },
+            |m: &mut ListValue| { &mut m.values },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<ListValue>(
+            "ListValue",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for ListValue {
+    const NAME: &'static str = "ListValue";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.values.push(is.read_message()?);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        for value in &self.values {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        for v in &self.values {
+            crate::rt::write_message_field_with_cached_size(1, v, os)?;
+        };
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> ListValue {
+        ListValue::new()
+    }
+
+    fn clear(&mut self) {
+        self.values.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static ListValue {
+        static instance: ListValue = ListValue {
+            values: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for ListValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("ListValue").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for ListValue {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for ListValue {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+///  `NullValue` is a singleton enumeration to represent the null value for the
+///  `Value` type union.
+///
+///   The JSON representation for `NullValue` is JSON `null`.
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:google.protobuf.NullValue)
+pub enum NullValue {
+    // @@protoc_insertion_point(enum_value:google.protobuf.NullValue.NULL_VALUE)
+    NULL_VALUE = 0,
+}
+
+impl crate::Enum for NullValue {
+    const NAME: &'static str = "NullValue";
+
+    fn value(&self) -> i32 {
+        *self as i32
+    }
+
+    fn from_i32(value: i32) -> ::std::option::Option<NullValue> {
+        match value {
+            0 => ::std::option::Option::Some(NullValue::NULL_VALUE),
+            _ => ::std::option::Option::None
+        }
+    }
+
+    const VALUES: &'static [NullValue] = &[
+        NullValue::NULL_VALUE,
+    ];
+}
+
+impl crate::EnumFull for NullValue {
+    fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().enum_by_package_relative_name("NullValue").unwrap()).clone()
+    }
+
+    fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+        let index = *self as usize;
+        Self::enum_descriptor().value_by_index(index)
+    }
+}
+
+impl ::std::default::Default for NullValue {
+    fn default() -> Self {
+        NullValue::NULL_VALUE
+    }
+}
+
+impl NullValue {
+    fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+        crate::reflect::GeneratedEnumDescriptorData::new::<NullValue>("NullValue")
+    }
+}
+
+static file_descriptor_proto_data: &'static [u8] = b"\
+    \n\x1cgoogle/protobuf/struct.proto\x12\x0fgoogle.protobuf\"\x98\x01\n\
+    \x06Struct\x12;\n\x06fields\x18\x01\x20\x03(\x0b2#.google.protobuf.Struc\
+    t.FieldsEntryR\x06fields\x1aQ\n\x0bFieldsEntry\x12\x10\n\x03key\x18\x01\
+    \x20\x01(\tR\x03key\x12,\n\x05value\x18\x02\x20\x01(\x0b2\x16.google.pro\
+    tobuf.ValueR\x05value:\x028\x01\"\xb2\x02\n\x05Value\x12;\n\nnull_value\
+    \x18\x01\x20\x01(\x0e2\x1a.google.protobuf.NullValueH\0R\tnullValue\x12#\
+    \n\x0cnumber_value\x18\x02\x20\x01(\x01H\0R\x0bnumberValue\x12#\n\x0cstr\
+    ing_value\x18\x03\x20\x01(\tH\0R\x0bstringValue\x12\x1f\n\nbool_value\
+    \x18\x04\x20\x01(\x08H\0R\tboolValue\x12<\n\x0cstruct_value\x18\x05\x20\
+    \x01(\x0b2\x17.google.protobuf.StructH\0R\x0bstructValue\x12;\n\nlist_va\
+    lue\x18\x06\x20\x01(\x0b2\x1a.google.protobuf.ListValueH\0R\tlistValueB\
+    \x06\n\x04kind\";\n\tListValue\x12.\n\x06values\x18\x01\x20\x03(\x0b2\
+    \x16.google.protobuf.ValueR\x06values*\x1b\n\tNullValue\x12\x0e\n\nNULL_\
+    VALUE\x10\0B\x7f\n\x13com.google.protobufB\x0bStructProtoP\x01Z/google.g\
+    olang.org/protobuf/types/known/structpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\
+    \x02\x1eGoogle.Protobuf.WellKnownTypesJ\x9a\x1d\n\x06\x12\x04\x1e\0^\x01\
+    \n\xcc\x0c\n\x01\x0c\x12\x03\x1e\0\x122\xc1\x0c\x20Protocol\x20Buffers\
+    \x20-\x20Google's\x20data\x20interchange\x20format\n\x20Copyright\x20200\
+    8\x20Google\x20Inc.\x20\x20All\x20rights\x20reserved.\n\x20https://devel\
+    opers.google.com/protocol-buffers/\n\n\x20Redistribution\x20and\x20use\
+    \x20in\x20source\x20and\x20binary\x20forms,\x20with\x20or\x20without\n\
+    \x20modification,\x20are\x20permitted\x20provided\x20that\x20the\x20foll\
+    owing\x20conditions\x20are\n\x20met:\n\n\x20\x20\x20\x20\x20*\x20Redistr\
+    ibutions\x20of\x20source\x20code\x20must\x20retain\x20the\x20above\x20co\
+    pyright\n\x20notice,\x20this\x20list\x20of\x20conditions\x20and\x20the\
+    \x20following\x20disclaimer.\n\x20\x20\x20\x20\x20*\x20Redistributions\
+    \x20in\x20binary\x20form\x20must\x20reproduce\x20the\x20above\n\x20copyr\
+    ight\x20notice,\x20this\x20list\x20of\x20conditions\x20and\x20the\x20fol\
+    lowing\x20disclaimer\n\x20in\x20the\x20documentation\x20and/or\x20other\
+    \x20materials\x20provided\x20with\x20the\n\x20distribution.\n\x20\x20\
+    \x20\x20\x20*\x20Neither\x20the\x20name\x20of\x20Google\x20Inc.\x20nor\
+    \x20the\x20names\x20of\x20its\n\x20contributors\x20may\x20be\x20used\x20\
+    to\x20endorse\x20or\x20promote\x20products\x20derived\x20from\n\x20this\
+    \x20software\x20without\x20specific\x20prior\x20written\x20permission.\n\
+    \n\x20THIS\x20SOFTWARE\x20IS\x20PROVIDED\x20BY\x20THE\x20COPYRIGHT\x20HO\
+    LDERS\x20AND\x20CONTRIBUTORS\n\x20\"AS\x20IS\"\x20AND\x20ANY\x20EXPRESS\
+    \x20OR\x20IMPLIED\x20WARRANTIES,\x20INCLUDING,\x20BUT\x20NOT\n\x20LIMITE\
+    D\x20TO,\x20THE\x20IMPLIED\x20WARRANTIES\x20OF\x20MERCHANTABILITY\x20AND\
+    \x20FITNESS\x20FOR\n\x20A\x20PARTICULAR\x20PURPOSE\x20ARE\x20DISCLAIMED.\
+    \x20IN\x20NO\x20EVENT\x20SHALL\x20THE\x20COPYRIGHT\n\x20OWNER\x20OR\x20C\
+    ONTRIBUTORS\x20BE\x20LIABLE\x20FOR\x20ANY\x20DIRECT,\x20INDIRECT,\x20INC\
+    IDENTAL,\n\x20SPECIAL,\x20EXEMPLARY,\x20OR\x20CONSEQUENTIAL\x20DAMAGES\
+    \x20(INCLUDING,\x20BUT\x20NOT\n\x20LIMITED\x20TO,\x20PROCUREMENT\x20OF\
+    \x20SUBSTITUTE\x20GOODS\x20OR\x20SERVICES;\x20LOSS\x20OF\x20USE,\n\x20DA\
+    TA,\x20OR\x20PROFITS;\x20OR\x20BUSINESS\x20INTERRUPTION)\x20HOWEVER\x20C\
+    AUSED\x20AND\x20ON\x20ANY\n\x20THEORY\x20OF\x20LIABILITY,\x20WHETHER\x20\
+    IN\x20CONTRACT,\x20STRICT\x20LIABILITY,\x20OR\x20TORT\n\x20(INCLUDING\
+    \x20NEGLIGENCE\x20OR\x20OTHERWISE)\x20ARISING\x20IN\x20ANY\x20WAY\x20OUT\
+    \x20OF\x20THE\x20USE\n\x20OF\x20THIS\x20SOFTWARE,\x20EVEN\x20IF\x20ADVIS\
+    ED\x20OF\x20THE\x20POSSIBILITY\x20OF\x20SUCH\x20DAMAGE.\n\n\x08\n\x01\
+    \x02\x12\x03\x20\0\x18\n\x08\n\x01\x08\x12\x03\"\0;\n\t\n\x02\x08%\x12\
+    \x03\"\0;\n\x08\n\x01\x08\x12\x03#\0\x1f\n\t\n\x02\x08\x1f\x12\x03#\0\
+    \x1f\n\x08\n\x01\x08\x12\x03$\0F\n\t\n\x02\x08\x0b\x12\x03$\0F\n\x08\n\
+    \x01\x08\x12\x03%\0,\n\t\n\x02\x08\x01\x12\x03%\0,\n\x08\n\x01\x08\x12\
+    \x03&\0,\n\t\n\x02\x08\x08\x12\x03&\0,\n\x08\n\x01\x08\x12\x03'\0\"\n\t\
+    \n\x02\x08\n\x12\x03'\0\"\n\x08\n\x01\x08\x12\x03(\0!\n\t\n\x02\x08$\x12\
+    \x03(\0!\n\xb3\x03\n\x02\x04\0\x12\x042\05\x01\x1a\xa6\x03\x20`Struct`\
+    \x20represents\x20a\x20structured\x20data\x20value,\x20consisting\x20of\
+    \x20fields\n\x20which\x20map\x20to\x20dynamically\x20typed\x20values.\
+    \x20In\x20some\x20languages,\x20`Struct`\n\x20might\x20be\x20supported\
+    \x20by\x20a\x20native\x20representation.\x20For\x20example,\x20in\n\x20s\
+    cripting\x20languages\x20like\x20JS\x20a\x20struct\x20is\x20represented\
+    \x20as\x20an\n\x20object.\x20The\x20details\x20of\x20that\x20representat\
+    ion\x20are\x20described\x20together\n\x20with\x20the\x20proto\x20support\
+    \x20for\x20the\x20language.\n\n\x20The\x20JSON\x20representation\x20for\
+    \x20`Struct`\x20is\x20JSON\x20object.\n\n\n\n\x03\x04\0\x01\x12\x032\x08\
+    \x0e\n9\n\x04\x04\0\x02\0\x12\x034\x02\x20\x1a,\x20Unordered\x20map\x20o\
+    f\x20dynamically\x20typed\x20values.\n\n\x0c\n\x05\x04\0\x02\0\x06\x12\
+    \x034\x02\x14\n\x0c\n\x05\x04\0\x02\0\x01\x12\x034\x15\x1b\n\x0c\n\x05\
+    \x04\0\x02\0\x03\x12\x034\x1e\x1f\n\xc4\x02\n\x02\x04\x01\x12\x04=\0M\
+    \x01\x1a\xb7\x02\x20`Value`\x20represents\x20a\x20dynamically\x20typed\
+    \x20value\x20which\x20can\x20be\x20either\n\x20null,\x20a\x20number,\x20\
+    a\x20string,\x20a\x20boolean,\x20a\x20recursive\x20struct\x20value,\x20o\
+    r\x20a\n\x20list\x20of\x20values.\x20A\x20producer\x20of\x20value\x20is\
+    \x20expected\x20to\x20set\x20one\x20of\x20these\n\x20variants.\x20Absenc\
+    e\x20of\x20any\x20variant\x20indicates\x20an\x20error.\n\n\x20The\x20JSO\
+    N\x20representation\x20for\x20`Value`\x20is\x20JSON\x20value.\n\n\n\n\
+    \x03\x04\x01\x01\x12\x03=\x08\r\n\"\n\x04\x04\x01\x08\0\x12\x04?\x02L\
+    \x03\x1a\x14\x20The\x20kind\x20of\x20value.\n\n\x0c\n\x05\x04\x01\x08\0\
+    \x01\x12\x03?\x08\x0c\n'\n\x04\x04\x01\x02\0\x12\x03A\x04\x1d\x1a\x1a\
+    \x20Represents\x20a\x20null\x20value.\n\n\x0c\n\x05\x04\x01\x02\0\x06\
+    \x12\x03A\x04\r\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03A\x0e\x18\n\x0c\n\
+    \x05\x04\x01\x02\0\x03\x12\x03A\x1b\x1c\n)\n\x04\x04\x01\x02\x01\x12\x03\
+    C\x04\x1c\x1a\x1c\x20Represents\x20a\x20double\x20value.\n\n\x0c\n\x05\
+    \x04\x01\x02\x01\x05\x12\x03C\x04\n\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\
+    \x03C\x0b\x17\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03C\x1a\x1b\n)\n\x04\
+    \x04\x01\x02\x02\x12\x03E\x04\x1c\x1a\x1c\x20Represents\x20a\x20string\
+    \x20value.\n\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03E\x04\n\n\x0c\n\x05\
+    \x04\x01\x02\x02\x01\x12\x03E\x0b\x17\n\x0c\n\x05\x04\x01\x02\x02\x03\
+    \x12\x03E\x1a\x1b\n*\n\x04\x04\x01\x02\x03\x12\x03G\x04\x18\x1a\x1d\x20R\
+    epresents\x20a\x20boolean\x20value.\n\n\x0c\n\x05\x04\x01\x02\x03\x05\
+    \x12\x03G\x04\x08\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03G\t\x13\n\x0c\n\
+    \x05\x04\x01\x02\x03\x03\x12\x03G\x16\x17\n-\n\x04\x04\x01\x02\x04\x12\
+    \x03I\x04\x1c\x1a\x20\x20Represents\x20a\x20structured\x20value.\n\n\x0c\
+    \n\x05\x04\x01\x02\x04\x06\x12\x03I\x04\n\n\x0c\n\x05\x04\x01\x02\x04\
+    \x01\x12\x03I\x0b\x17\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x03I\x1a\x1b\n\
+    -\n\x04\x04\x01\x02\x05\x12\x03K\x04\x1d\x1a\x20\x20Represents\x20a\x20r\
+    epeated\x20`Value`.\n\n\x0c\n\x05\x04\x01\x02\x05\x06\x12\x03K\x04\r\n\
+    \x0c\n\x05\x04\x01\x02\x05\x01\x12\x03K\x0e\x18\n\x0c\n\x05\x04\x01\x02\
+    \x05\x03\x12\x03K\x1b\x1c\n\xa9\x01\n\x02\x05\0\x12\x04S\0V\x01\x1a\x9c\
+    \x01\x20`NullValue`\x20is\x20a\x20singleton\x20enumeration\x20to\x20repr\
+    esent\x20the\x20null\x20value\x20for\x20the\n\x20`Value`\x20type\x20unio\
+    n.\n\n\x20\x20The\x20JSON\x20representation\x20for\x20`NullValue`\x20is\
+    \x20JSON\x20`null`.\n\n\n\n\x03\x05\0\x01\x12\x03S\x05\x0e\n\x1a\n\x04\
+    \x05\0\x02\0\x12\x03U\x02\x11\x1a\r\x20Null\x20value.\n\n\x0c\n\x05\x05\
+    \0\x02\0\x01\x12\x03U\x02\x0c\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03U\x0f\
+    \x10\n\x82\x01\n\x02\x04\x02\x12\x04[\0^\x01\x1av\x20`ListValue`\x20is\
+    \x20a\x20wrapper\x20around\x20a\x20repeated\x20field\x20of\x20values.\n\
+    \n\x20The\x20JSON\x20representation\x20for\x20`ListValue`\x20is\x20JSON\
+    \x20array.\n\n\n\n\x03\x04\x02\x01\x12\x03[\x08\x11\n:\n\x04\x04\x02\x02\
+    \0\x12\x03]\x02\x1c\x1a-\x20Repeated\x20field\x20of\x20dynamically\x20ty\
+    ped\x20values.\n\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03]\x02\n\n\x0c\n\
+    \x05\x04\x02\x02\0\x06\x12\x03]\x0b\x10\n\x0c\n\x05\x04\x02\x02\0\x01\
+    \x12\x03]\x11\x17\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03]\x1a\x1bb\x06pro\
+    to3\
+";
+
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
+}
+
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(3);
+            messages.push(Struct::generated_message_descriptor_data());
+            messages.push(Value::generated_message_descriptor_data());
+            messages.push(ListValue::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(1);
+            enums.push(NullValue::generated_enum_descriptor_data());
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
+    })
+}
diff --git a/src/well_known_types/struct_pb.rs b/src/well_known_types/struct_pb.rs
deleted file mode 100644
index 5f18a42..0000000
--- a/src/well_known_types/struct_pb.rs
+++ /dev/null
@@ -1,1009 +0,0 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
-// @generated
-
-// https://github.com/rust-lang/rust-clippy/issues/702
-#![allow(unknown_lints)]
-#![allow(clippy::all)]
-
-#![allow(unused_attributes)]
-#![cfg_attr(rustfmt, rustfmt::skip)]
-
-#![allow(box_pointers)]
-#![allow(dead_code)]
-#![allow(missing_docs)]
-#![allow(non_camel_case_types)]
-#![allow(non_snake_case)]
-#![allow(non_upper_case_globals)]
-#![allow(trivial_casts)]
-#![allow(unused_imports)]
-#![allow(unused_results)]
-//! Generated file from `google/protobuf/struct.proto`
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Struct {
-    // message fields
-    pub fields: ::std::collections::HashMap<::std::string::String, Value>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Struct {
-    fn default() -> &'a Struct {
-        <Struct as crate::Message>::default_instance()
-    }
-}
-
-impl Struct {
-    pub fn new() -> Struct {
-        ::std::default::Default::default()
-    }
-
-    // repeated .google.protobuf.Struct.FieldsEntry fields = 1;
-
-
-    pub fn get_fields(&self) -> &::std::collections::HashMap<::std::string::String, Value> {
-        &self.fields
-    }
-    pub fn clear_fields(&mut self) {
-        self.fields.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_fields(&mut self, v: ::std::collections::HashMap<::std::string::String, Value>) {
-        self.fields = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_fields(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, Value> {
-        &mut self.fields
-    }
-
-    // Take field
-    pub fn take_fields(&mut self) -> ::std::collections::HashMap<::std::string::String, Value> {
-        ::std::mem::replace(&mut self.fields, ::std::collections::HashMap::new())
-    }
-}
-
-impl crate::Message for Struct {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_map_into::<crate::types::ProtobufTypeString, crate::types::ProtobufTypeMessage<Value>>(wire_type, is, &mut self.fields)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        my_size += crate::rt::compute_map_size::<crate::types::ProtobufTypeString, crate::types::ProtobufTypeMessage<Value>>(1, &self.fields);
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        crate::rt::write_map_with_cached_sizes::<crate::types::ProtobufTypeString, crate::types::ProtobufTypeMessage<Value>>(1, &self.fields, os)?;
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Struct {
-        Struct::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_map_accessor::<_, crate::types::ProtobufTypeString, crate::types::ProtobufTypeMessage<Value>>(
-                "fields",
-                |m: &Struct| { &m.fields },
-                |m: &mut Struct| { &mut m.fields },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Struct>(
-                "Struct",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Struct {
-        static instance: crate::rt::LazyV2<Struct> = crate::rt::LazyV2::INIT;
-        instance.get(Struct::new)
-    }
-}
-
-impl crate::Clear for Struct {
-    fn clear(&mut self) {
-        self.fields.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for Struct {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for Struct {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Value {
-    // message oneof groups
-    pub kind: ::std::option::Option<Value_oneof_kind>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Value {
-    fn default() -> &'a Value {
-        <Value as crate::Message>::default_instance()
-    }
-}
-
-#[derive(Clone,PartialEq,Debug)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum Value_oneof_kind {
-    null_value(NullValue),
-    number_value(f64),
-    string_value(::std::string::String),
-    bool_value(bool),
-    struct_value(Struct),
-    list_value(ListValue),
-}
-
-impl Value {
-    pub fn new() -> Value {
-        ::std::default::Default::default()
-    }
-
-    // .google.protobuf.NullValue null_value = 1;
-
-
-    pub fn get_null_value(&self) -> NullValue {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::null_value(v)) => v,
-            _ => NullValue::NULL_VALUE,
-        }
-    }
-    pub fn clear_null_value(&mut self) {
-        self.kind = ::std::option::Option::None;
-    }
-
-    pub fn has_null_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::null_value(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_null_value(&mut self, v: NullValue) {
-        self.kind = ::std::option::Option::Some(Value_oneof_kind::null_value(v))
-    }
-
-    // double number_value = 2;
-
-
-    pub fn get_number_value(&self) -> f64 {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::number_value(v)) => v,
-            _ => 0.,
-        }
-    }
-    pub fn clear_number_value(&mut self) {
-        self.kind = ::std::option::Option::None;
-    }
-
-    pub fn has_number_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::number_value(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_number_value(&mut self, v: f64) {
-        self.kind = ::std::option::Option::Some(Value_oneof_kind::number_value(v))
-    }
-
-    // string string_value = 3;
-
-
-    pub fn get_string_value(&self) -> &str {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::string_value(ref v)) => v,
-            _ => "",
-        }
-    }
-    pub fn clear_string_value(&mut self) {
-        self.kind = ::std::option::Option::None;
-    }
-
-    pub fn has_string_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::string_value(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_string_value(&mut self, v: ::std::string::String) {
-        self.kind = ::std::option::Option::Some(Value_oneof_kind::string_value(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_string_value(&mut self) -> &mut ::std::string::String {
-        if let ::std::option::Option::Some(Value_oneof_kind::string_value(_)) = self.kind {
-        } else {
-            self.kind = ::std::option::Option::Some(Value_oneof_kind::string_value(::std::string::String::new()));
-        }
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::string_value(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_string_value(&mut self) -> ::std::string::String {
-        if self.has_string_value() {
-            match self.kind.take() {
-                ::std::option::Option::Some(Value_oneof_kind::string_value(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            ::std::string::String::new()
-        }
-    }
-
-    // bool bool_value = 4;
-
-
-    pub fn get_bool_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::bool_value(v)) => v,
-            _ => false,
-        }
-    }
-    pub fn clear_bool_value(&mut self) {
-        self.kind = ::std::option::Option::None;
-    }
-
-    pub fn has_bool_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::bool_value(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_bool_value(&mut self, v: bool) {
-        self.kind = ::std::option::Option::Some(Value_oneof_kind::bool_value(v))
-    }
-
-    // .google.protobuf.Struct struct_value = 5;
-
-
-    pub fn get_struct_value(&self) -> &Struct {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::struct_value(ref v)) => v,
-            _ => <Struct as crate::Message>::default_instance(),
-        }
-    }
-    pub fn clear_struct_value(&mut self) {
-        self.kind = ::std::option::Option::None;
-    }
-
-    pub fn has_struct_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::struct_value(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_struct_value(&mut self, v: Struct) {
-        self.kind = ::std::option::Option::Some(Value_oneof_kind::struct_value(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_struct_value(&mut self) -> &mut Struct {
-        if let ::std::option::Option::Some(Value_oneof_kind::struct_value(_)) = self.kind {
-        } else {
-            self.kind = ::std::option::Option::Some(Value_oneof_kind::struct_value(Struct::new()));
-        }
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::struct_value(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_struct_value(&mut self) -> Struct {
-        if self.has_struct_value() {
-            match self.kind.take() {
-                ::std::option::Option::Some(Value_oneof_kind::struct_value(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            Struct::new()
-        }
-    }
-
-    // .google.protobuf.ListValue list_value = 6;
-
-
-    pub fn get_list_value(&self) -> &ListValue {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::list_value(ref v)) => v,
-            _ => <ListValue as crate::Message>::default_instance(),
-        }
-    }
-    pub fn clear_list_value(&mut self) {
-        self.kind = ::std::option::Option::None;
-    }
-
-    pub fn has_list_value(&self) -> bool {
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::list_value(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_list_value(&mut self, v: ListValue) {
-        self.kind = ::std::option::Option::Some(Value_oneof_kind::list_value(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_list_value(&mut self) -> &mut ListValue {
-        if let ::std::option::Option::Some(Value_oneof_kind::list_value(_)) = self.kind {
-        } else {
-            self.kind = ::std::option::Option::Some(Value_oneof_kind::list_value(ListValue::new()));
-        }
-        match self.kind {
-            ::std::option::Option::Some(Value_oneof_kind::list_value(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_list_value(&mut self) -> ListValue {
-        if self.has_list_value() {
-            match self.kind.take() {
-                ::std::option::Option::Some(Value_oneof_kind::list_value(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            ListValue::new()
-        }
-    }
-}
-
-impl crate::Message for Value {
-    fn is_initialized(&self) -> bool {
-        if let Some(Value_oneof_kind::struct_value(ref v)) = self.kind {
-            if !v.is_initialized() {
-                return false;
-            }
-        }
-        if let Some(Value_oneof_kind::list_value(ref v)) = self.kind {
-            if !v.is_initialized() {
-                return false;
-            }
-        }
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.kind = ::std::option::Option::Some(Value_oneof_kind::null_value(is.read_enum()?));
-                },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeFixed64 {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.kind = ::std::option::Option::Some(Value_oneof_kind::number_value(is.read_double()?));
-                },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.kind = ::std::option::Option::Some(Value_oneof_kind::string_value(is.read_string()?));
-                },
-                4 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.kind = ::std::option::Option::Some(Value_oneof_kind::bool_value(is.read_bool()?));
-                },
-                5 => {
-                    if wire_type != crate::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.kind = ::std::option::Option::Some(Value_oneof_kind::struct_value(is.read_message()?));
-                },
-                6 => {
-                    if wire_type != crate::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.kind = ::std::option::Option::Some(Value_oneof_kind::list_value(is.read_message()?));
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let ::std::option::Option::Some(ref v) = self.kind {
-            match v {
-                &Value_oneof_kind::null_value(v) => {
-                    my_size += crate::rt::enum_size(1, v);
-                },
-                &Value_oneof_kind::number_value(v) => {
-                    my_size += 9;
-                },
-                &Value_oneof_kind::string_value(ref v) => {
-                    my_size += crate::rt::string_size(3, &v);
-                },
-                &Value_oneof_kind::bool_value(v) => {
-                    my_size += 2;
-                },
-                &Value_oneof_kind::struct_value(ref v) => {
-                    let len = v.compute_size();
-                    my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-                },
-                &Value_oneof_kind::list_value(ref v) => {
-                    let len = v.compute_size();
-                    my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-                },
-            };
-        }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if let ::std::option::Option::Some(ref v) = self.kind {
-            match v {
-                &Value_oneof_kind::null_value(v) => {
-                    os.write_enum(1, crate::ProtobufEnum::value(&v))?;
-                },
-                &Value_oneof_kind::number_value(v) => {
-                    os.write_double(2, v)?;
-                },
-                &Value_oneof_kind::string_value(ref v) => {
-                    os.write_string(3, v)?;
-                },
-                &Value_oneof_kind::bool_value(v) => {
-                    os.write_bool(4, v)?;
-                },
-                &Value_oneof_kind::struct_value(ref v) => {
-                    os.write_tag(5, crate::wire_format::WireTypeLengthDelimited)?;
-                    os.write_raw_varint32(v.get_cached_size())?;
-                    v.write_to_with_cached_sizes(os)?;
-                },
-                &Value_oneof_kind::list_value(ref v) => {
-                    os.write_tag(6, crate::wire_format::WireTypeLengthDelimited)?;
-                    os.write_raw_varint32(v.get_cached_size())?;
-                    v.write_to_with_cached_sizes(os)?;
-                },
-            };
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Value {
-        Value::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_singular_enum_accessor::<_, NullValue>(
-                "null_value",
-                Value::has_null_value,
-                Value::get_null_value,
-            ));
-            fields.push(crate::reflect::accessor::make_singular_f64_accessor::<_>(
-                "number_value",
-                Value::has_number_value,
-                Value::get_number_value,
-            ));
-            fields.push(crate::reflect::accessor::make_singular_string_accessor::<_>(
-                "string_value",
-                Value::has_string_value,
-                Value::get_string_value,
-            ));
-            fields.push(crate::reflect::accessor::make_singular_bool_accessor::<_>(
-                "bool_value",
-                Value::has_bool_value,
-                Value::get_bool_value,
-            ));
-            fields.push(crate::reflect::accessor::make_singular_message_accessor::<_, Struct>(
-                "struct_value",
-                Value::has_struct_value,
-                Value::get_struct_value,
-            ));
-            fields.push(crate::reflect::accessor::make_singular_message_accessor::<_, ListValue>(
-                "list_value",
-                Value::has_list_value,
-                Value::get_list_value,
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Value>(
-                "Value",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Value {
-        static instance: crate::rt::LazyV2<Value> = crate::rt::LazyV2::INIT;
-        instance.get(Value::new)
-    }
-}
-
-impl crate::Clear for Value {
-    fn clear(&mut self) {
-        self.kind = ::std::option::Option::None;
-        self.kind = ::std::option::Option::None;
-        self.kind = ::std::option::Option::None;
-        self.kind = ::std::option::Option::None;
-        self.kind = ::std::option::Option::None;
-        self.kind = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for Value {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for Value {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct ListValue {
-    // message fields
-    pub values: crate::RepeatedField<Value>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a ListValue {
-    fn default() -> &'a ListValue {
-        <ListValue as crate::Message>::default_instance()
-    }
-}
-
-impl ListValue {
-    pub fn new() -> ListValue {
-        ::std::default::Default::default()
-    }
-
-    // repeated .google.protobuf.Value values = 1;
-
-
-    pub fn get_values(&self) -> &[Value] {
-        &self.values
-    }
-    pub fn clear_values(&mut self) {
-        self.values.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_values(&mut self, v: crate::RepeatedField<Value>) {
-        self.values = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_values(&mut self) -> &mut crate::RepeatedField<Value> {
-        &mut self.values
-    }
-
-    // Take field
-    pub fn take_values(&mut self) -> crate::RepeatedField<Value> {
-        ::std::mem::replace(&mut self.values, crate::RepeatedField::new())
-    }
-}
-
-impl crate::Message for ListValue {
-    fn is_initialized(&self) -> bool {
-        for v in &self.values {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.values)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        for value in &self.values {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        for v in &self.values {
-            os.write_tag(1, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> ListValue {
-        ListValue::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Value>>(
-                "values",
-                |m: &ListValue| { &m.values },
-                |m: &mut ListValue| { &mut m.values },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<ListValue>(
-                "ListValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static ListValue {
-        static instance: crate::rt::LazyV2<ListValue> = crate::rt::LazyV2::INIT;
-        instance.get(ListValue::new)
-    }
-}
-
-impl crate::Clear for ListValue {
-    fn clear(&mut self) {
-        self.values.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for ListValue {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for ListValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum NullValue {
-    NULL_VALUE = 0,
-}
-
-impl crate::ProtobufEnum for NullValue {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<NullValue> {
-        match value {
-            0 => ::std::option::Option::Some(NullValue::NULL_VALUE),
-            _ => ::std::option::Option::None
-        }
-    }
-
-    fn values() -> &'static [Self] {
-        static values: &'static [NullValue] = &[
-            NullValue::NULL_VALUE,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<NullValue>("NullValue", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for NullValue {
-}
-
-impl ::std::default::Default for NullValue {
-    fn default() -> Self {
-        NullValue::NULL_VALUE
-    }
-}
-
-impl crate::reflect::ProtobufValue for NullValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\x1cgoogle/protobuf/struct.proto\x12\x0fgoogle.protobuf\"\x98\x01\n\
-    \x06Struct\x12;\n\x06fields\x18\x01\x20\x03(\x0b2#.google.protobuf.Struc\
-    t.FieldsEntryR\x06fields\x1aQ\n\x0bFieldsEntry\x12\x10\n\x03key\x18\x01\
-    \x20\x01(\tR\x03key\x12,\n\x05value\x18\x02\x20\x01(\x0b2\x16.google.pro\
-    tobuf.ValueR\x05value:\x028\x01\"\xb2\x02\n\x05Value\x12;\n\nnull_value\
-    \x18\x01\x20\x01(\x0e2\x1a.google.protobuf.NullValueH\0R\tnullValue\x12#\
-    \n\x0cnumber_value\x18\x02\x20\x01(\x01H\0R\x0bnumberValue\x12#\n\x0cstr\
-    ing_value\x18\x03\x20\x01(\tH\0R\x0bstringValue\x12\x1f\n\nbool_value\
-    \x18\x04\x20\x01(\x08H\0R\tboolValue\x12<\n\x0cstruct_value\x18\x05\x20\
-    \x01(\x0b2\x17.google.protobuf.StructH\0R\x0bstructValue\x12;\n\nlist_va\
-    lue\x18\x06\x20\x01(\x0b2\x1a.google.protobuf.ListValueH\0R\tlistValueB\
-    \x06\n\x04kind\";\n\tListValue\x12.\n\x06values\x18\x01\x20\x03(\x0b2\
-    \x16.google.protobuf.ValueR\x06values*\x1b\n\tNullValue\x12\x0e\n\nNULL_\
-    VALUE\x10\0B\x7f\n\x13com.google.protobufB\x0bStructProtoP\x01Z/google.g\
-    olang.org/protobuf/types/known/structpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\
-    \x02\x1eGoogle.Protobuf.WellKnownTypesJ\x99\x1d\n\x06\x12\x04\x1e\0^\x01\
-    \n\xcc\x0c\n\x01\x0c\x12\x03\x1e\0\x122\xc1\x0c\x20Protocol\x20Buffers\
-    \x20-\x20Google's\x20data\x20interchange\x20format\n\x20Copyright\x20200\
-    8\x20Google\x20Inc.\x20\x20All\x20rights\x20reserved.\n\x20https://devel\
-    opers.google.com/protocol-buffers/\n\n\x20Redistribution\x20and\x20use\
-    \x20in\x20source\x20and\x20binary\x20forms,\x20with\x20or\x20without\n\
-    \x20modification,\x20are\x20permitted\x20provided\x20that\x20the\x20foll\
-    owing\x20conditions\x20are\n\x20met:\n\n\x20\x20\x20\x20\x20*\x20Redistr\
-    ibutions\x20of\x20source\x20code\x20must\x20retain\x20the\x20above\x20co\
-    pyright\n\x20notice,\x20this\x20list\x20of\x20conditions\x20and\x20the\
-    \x20following\x20disclaimer.\n\x20\x20\x20\x20\x20*\x20Redistributions\
-    \x20in\x20binary\x20form\x20must\x20reproduce\x20the\x20above\n\x20copyr\
-    ight\x20notice,\x20this\x20list\x20of\x20conditions\x20and\x20the\x20fol\
-    lowing\x20disclaimer\n\x20in\x20the\x20documentation\x20and/or\x20other\
-    \x20materials\x20provided\x20with\x20the\n\x20distribution.\n\x20\x20\
-    \x20\x20\x20*\x20Neither\x20the\x20name\x20of\x20Google\x20Inc.\x20nor\
-    \x20the\x20names\x20of\x20its\n\x20contributors\x20may\x20be\x20used\x20\
-    to\x20endorse\x20or\x20promote\x20products\x20derived\x20from\n\x20this\
-    \x20software\x20without\x20specific\x20prior\x20written\x20permission.\n\
-    \n\x20THIS\x20SOFTWARE\x20IS\x20PROVIDED\x20BY\x20THE\x20COPYRIGHT\x20HO\
-    LDERS\x20AND\x20CONTRIBUTORS\n\x20\"AS\x20IS\"\x20AND\x20ANY\x20EXPRESS\
-    \x20OR\x20IMPLIED\x20WARRANTIES,\x20INCLUDING,\x20BUT\x20NOT\n\x20LIMITE\
-    D\x20TO,\x20THE\x20IMPLIED\x20WARRANTIES\x20OF\x20MERCHANTABILITY\x20AND\
-    \x20FITNESS\x20FOR\n\x20A\x20PARTICULAR\x20PURPOSE\x20ARE\x20DISCLAIMED.\
-    \x20IN\x20NO\x20EVENT\x20SHALL\x20THE\x20COPYRIGHT\n\x20OWNER\x20OR\x20C\
-    ONTRIBUTORS\x20BE\x20LIABLE\x20FOR\x20ANY\x20DIRECT,\x20INDIRECT,\x20INC\
-    IDENTAL,\n\x20SPECIAL,\x20EXEMPLARY,\x20OR\x20CONSEQUENTIAL\x20DAMAGES\
-    \x20(INCLUDING,\x20BUT\x20NOT\n\x20LIMITED\x20TO,\x20PROCUREMENT\x20OF\
-    \x20SUBSTITUTE\x20GOODS\x20OR\x20SERVICES;\x20LOSS\x20OF\x20USE,\n\x20DA\
-    TA,\x20OR\x20PROFITS;\x20OR\x20BUSINESS\x20INTERRUPTION)\x20HOWEVER\x20C\
-    AUSED\x20AND\x20ON\x20ANY\n\x20THEORY\x20OF\x20LIABILITY,\x20WHETHER\x20\
-    IN\x20CONTRACT,\x20STRICT\x20LIABILITY,\x20OR\x20TORT\n\x20(INCLUDING\
-    \x20NEGLIGENCE\x20OR\x20OTHERWISE)\x20ARISING\x20IN\x20ANY\x20WAY\x20OUT\
-    \x20OF\x20THE\x20USE\n\x20OF\x20THIS\x20SOFTWARE,\x20EVEN\x20IF\x20ADVIS\
-    ED\x20OF\x20THE\x20POSSIBILITY\x20OF\x20SUCH\x20DAMAGE.\n\n\x08\n\x01\
-    \x02\x12\x03\x20\0\x18\n\x08\n\x01\x08\x12\x03\"\0;\n\t\n\x02\x08%\x12\
-    \x03\"\0;\n\x08\n\x01\x08\x12\x03#\0\x1f\n\t\n\x02\x08\x1f\x12\x03#\0\
-    \x1f\n\x08\n\x01\x08\x12\x03$\0F\n\t\n\x02\x08\x0b\x12\x03$\0F\n\x08\n\
-    \x01\x08\x12\x03%\0,\n\t\n\x02\x08\x01\x12\x03%\0,\n\x08\n\x01\x08\x12\
-    \x03&\0,\n\t\n\x02\x08\x08\x12\x03&\0,\n\x08\n\x01\x08\x12\x03'\0\"\n\t\
-    \n\x02\x08\n\x12\x03'\0\"\n\x08\n\x01\x08\x12\x03(\0!\n\t\n\x02\x08$\x12\
-    \x03(\0!\n\xb3\x03\n\x02\x04\0\x12\x042\05\x01\x1a\xa6\x03\x20`Struct`\
-    \x20represents\x20a\x20structured\x20data\x20value,\x20consisting\x20of\
-    \x20fields\n\x20which\x20map\x20to\x20dynamically\x20typed\x20values.\
-    \x20In\x20some\x20languages,\x20`Struct`\n\x20might\x20be\x20supported\
-    \x20by\x20a\x20native\x20representation.\x20For\x20example,\x20in\n\x20s\
-    cripting\x20languages\x20like\x20JS\x20a\x20struct\x20is\x20represented\
-    \x20as\x20an\n\x20object.\x20The\x20details\x20of\x20that\x20representat\
-    ion\x20are\x20described\x20together\n\x20with\x20the\x20proto\x20support\
-    \x20for\x20the\x20language.\n\n\x20The\x20JSON\x20representation\x20for\
-    \x20`Struct`\x20is\x20JSON\x20object.\n\n\n\n\x03\x04\0\x01\x12\x032\x08\
-    \x0e\n9\n\x04\x04\0\x02\0\x12\x034\x02\x20\x1a,\x20Unordered\x20map\x20o\
-    f\x20dynamically\x20typed\x20values.\n\n\x0c\n\x05\x04\0\x02\0\x06\x12\
-    \x034\x02\x14\n\x0c\n\x05\x04\0\x02\0\x01\x12\x034\x15\x1b\n\x0c\n\x05\
-    \x04\0\x02\0\x03\x12\x034\x1e\x1f\n\xc3\x02\n\x02\x04\x01\x12\x04=\0M\
-    \x01\x1a\xb6\x02\x20`Value`\x20represents\x20a\x20dynamically\x20typed\
-    \x20value\x20which\x20can\x20be\x20either\n\x20null,\x20a\x20number,\x20\
-    a\x20string,\x20a\x20boolean,\x20a\x20recursive\x20struct\x20value,\x20o\
-    r\x20a\n\x20list\x20of\x20values.\x20A\x20producer\x20of\x20value\x20is\
-    \x20expected\x20to\x20set\x20one\x20of\x20that\n\x20variants,\x20absence\
-    \x20of\x20any\x20variant\x20indicates\x20an\x20error.\n\n\x20The\x20JSON\
-    \x20representation\x20for\x20`Value`\x20is\x20JSON\x20value.\n\n\n\n\x03\
-    \x04\x01\x01\x12\x03=\x08\r\n\"\n\x04\x04\x01\x08\0\x12\x04?\x02L\x03\
-    \x1a\x14\x20The\x20kind\x20of\x20value.\n\n\x0c\n\x05\x04\x01\x08\0\x01\
-    \x12\x03?\x08\x0c\n'\n\x04\x04\x01\x02\0\x12\x03A\x04\x1d\x1a\x1a\x20Rep\
-    resents\x20a\x20null\x20value.\n\n\x0c\n\x05\x04\x01\x02\0\x06\x12\x03A\
-    \x04\r\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03A\x0e\x18\n\x0c\n\x05\x04\
-    \x01\x02\0\x03\x12\x03A\x1b\x1c\n)\n\x04\x04\x01\x02\x01\x12\x03C\x04\
-    \x1c\x1a\x1c\x20Represents\x20a\x20double\x20value.\n\n\x0c\n\x05\x04\
-    \x01\x02\x01\x05\x12\x03C\x04\n\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\x03C\
-    \x0b\x17\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03C\x1a\x1b\n)\n\x04\x04\
-    \x01\x02\x02\x12\x03E\x04\x1c\x1a\x1c\x20Represents\x20a\x20string\x20va\
-    lue.\n\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03E\x04\n\n\x0c\n\x05\x04\
-    \x01\x02\x02\x01\x12\x03E\x0b\x17\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\
-    \x03E\x1a\x1b\n*\n\x04\x04\x01\x02\x03\x12\x03G\x04\x18\x1a\x1d\x20Repre\
-    sents\x20a\x20boolean\x20value.\n\n\x0c\n\x05\x04\x01\x02\x03\x05\x12\
-    \x03G\x04\x08\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03G\t\x13\n\x0c\n\x05\
-    \x04\x01\x02\x03\x03\x12\x03G\x16\x17\n-\n\x04\x04\x01\x02\x04\x12\x03I\
-    \x04\x1c\x1a\x20\x20Represents\x20a\x20structured\x20value.\n\n\x0c\n\
-    \x05\x04\x01\x02\x04\x06\x12\x03I\x04\n\n\x0c\n\x05\x04\x01\x02\x04\x01\
-    \x12\x03I\x0b\x17\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x03I\x1a\x1b\n-\n\
-    \x04\x04\x01\x02\x05\x12\x03K\x04\x1d\x1a\x20\x20Represents\x20a\x20repe\
-    ated\x20`Value`.\n\n\x0c\n\x05\x04\x01\x02\x05\x06\x12\x03K\x04\r\n\x0c\
-    \n\x05\x04\x01\x02\x05\x01\x12\x03K\x0e\x18\n\x0c\n\x05\x04\x01\x02\x05\
-    \x03\x12\x03K\x1b\x1c\n\xa9\x01\n\x02\x05\0\x12\x04S\0V\x01\x1a\x9c\x01\
-    \x20`NullValue`\x20is\x20a\x20singleton\x20enumeration\x20to\x20represen\
-    t\x20the\x20null\x20value\x20for\x20the\n\x20`Value`\x20type\x20union.\n\
-    \n\x20\x20The\x20JSON\x20representation\x20for\x20`NullValue`\x20is\x20J\
-    SON\x20`null`.\n\n\n\n\x03\x05\0\x01\x12\x03S\x05\x0e\n\x1a\n\x04\x05\0\
-    \x02\0\x12\x03U\x02\x11\x1a\r\x20Null\x20value.\n\n\x0c\n\x05\x05\0\x02\
-    \0\x01\x12\x03U\x02\x0c\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03U\x0f\x10\n\
-    \x82\x01\n\x02\x04\x02\x12\x04[\0^\x01\x1av\x20`ListValue`\x20is\x20a\
-    \x20wrapper\x20around\x20a\x20repeated\x20field\x20of\x20values.\n\n\x20\
-    The\x20JSON\x20representation\x20for\x20`ListValue`\x20is\x20JSON\x20arr\
-    ay.\n\n\n\n\x03\x04\x02\x01\x12\x03[\x08\x11\n:\n\x04\x04\x02\x02\0\x12\
-    \x03]\x02\x1c\x1a-\x20Repeated\x20field\x20of\x20dynamically\x20typed\
-    \x20values.\n\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03]\x02\n\n\x0c\n\x05\
-    \x04\x02\x02\0\x06\x12\x03]\x0b\x10\n\x0c\n\x05\x04\x02\x02\0\x01\x12\
-    \x03]\x11\x17\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03]\x1a\x1bb\x06proto3\
-";
-
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
-}
-
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
-    })
-}
diff --git a/src/well_known_types/timestamp.rs b/src/well_known_types/timestamp.rs
index 25e7acf..8692696 100644
--- a/src/well_known_types/timestamp.rs
+++ b/src/well_known_types/timestamp.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,21 +16,29 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/timestamp.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Timestamp)
 pub struct Timestamp {
     // message fields
+    ///  Represents seconds of UTC time since Unix epoch
+    ///  1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+    ///  9999-12-31T23:59:59Z inclusive.
+    // @@protoc_insertion_point(field:google.protobuf.Timestamp.seconds)
     pub seconds: i64,
+    ///  Non-negative fractions of a second at nanosecond resolution. Negative
+    ///  second values with fractions must still have non-negative nanos values
+    ///  that count forward in time. Must be from 0 to 999,999,999
+    ///  inclusive.
+    // @@protoc_insertion_point(field:google.protobuf.Timestamp.nanos)
     pub nanos: i32,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Timestamp.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Timestamp {
@@ -43,62 +52,45 @@
         ::std::default::Default::default()
     }
 
-    // int64 seconds = 1;
-
-
-    pub fn get_seconds(&self) -> i64 {
-        self.seconds
-    }
-    pub fn clear_seconds(&mut self) {
-        self.seconds = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_seconds(&mut self, v: i64) {
-        self.seconds = v;
-    }
-
-    // int32 nanos = 2;
-
-
-    pub fn get_nanos(&self) -> i32 {
-        self.nanos
-    }
-    pub fn clear_nanos(&mut self) {
-        self.nanos = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_nanos(&mut self, v: i32) {
-        self.nanos = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "seconds",
+            |m: &Timestamp| { &m.seconds },
+            |m: &mut Timestamp| { &mut m.seconds },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "nanos",
+            |m: &Timestamp| { &m.nanos },
+            |m: &mut Timestamp| { &mut m.nanos },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Timestamp>(
+            "Timestamp",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Timestamp {
+    const NAME: &'static str = "Timestamp";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.seconds = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.seconds = is.read_int64()?;
                 },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.nanos = tmp;
+                16 => {
+                    self.nanos = is.read_int32()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -107,106 +99,73 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.seconds != 0 {
-            my_size += crate::rt::value_size(1, self.seconds, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int64_size(1, self.seconds);
         }
         if self.nanos != 0 {
-            my_size += crate::rt::value_size(2, self.nanos, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(2, self.nanos);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.seconds != 0 {
             os.write_int64(1, self.seconds)?;
         }
         if self.nanos != 0 {
             os.write_int32(2, self.nanos)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Timestamp {
         Timestamp::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt64>(
-                "seconds",
-                |m: &Timestamp| { &m.seconds },
-                |m: &mut Timestamp| { &mut m.seconds },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "nanos",
-                |m: &Timestamp| { &m.nanos },
-                |m: &mut Timestamp| { &mut m.nanos },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Timestamp>(
-                "Timestamp",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Timestamp {
-        static instance: crate::rt::LazyV2<Timestamp> = crate::rt::LazyV2::INIT;
-        instance.get(Timestamp::new)
-    }
-}
-
-impl crate::Clear for Timestamp {
     fn clear(&mut self) {
         self.seconds = 0;
         self.nanos = 0;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Timestamp {
+        static instance: Timestamp = Timestamp {
+            seconds: 0,
+            nanos: 0,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::std::fmt::Debug for Timestamp {
+impl crate::MessageFull for Timestamp {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Timestamp").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Timestamp {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Timestamp {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -350,14 +309,31 @@
     \x03\x12\x04\x91\x01\x10\x11b\x06proto3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(1);
+            messages.push(Timestamp::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types/type_.rs b/src/well_known_types/type_.rs
new file mode 100644
index 0000000..a342830
--- /dev/null
+++ b/src/well_known_types/type_.rs
@@ -0,0 +1,1626 @@
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
+// @generated
+
+// https://github.com/rust-lang/rust-clippy/issues/702
+#![allow(unknown_lints)]
+#![allow(clippy::all)]
+
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
+
+#![allow(box_pointers)]
+#![allow(dead_code)]
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+#![allow(trivial_casts)]
+#![allow(unused_results)]
+#![allow(unused_mut)]
+
+//! Generated file from `google/protobuf/type.proto`
+
+///  A protocol buffer message type.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Type)
+pub struct Type {
+    // message fields
+    ///  The fully qualified message name.
+    // @@protoc_insertion_point(field:google.protobuf.Type.name)
+    pub name: ::std::string::String,
+    ///  The list of fields.
+    // @@protoc_insertion_point(field:google.protobuf.Type.fields)
+    pub fields: ::std::vec::Vec<Field>,
+    ///  The list of types appearing in `oneof` definitions in this type.
+    // @@protoc_insertion_point(field:google.protobuf.Type.oneofs)
+    pub oneofs: ::std::vec::Vec<::std::string::String>,
+    ///  The protocol buffer options.
+    // @@protoc_insertion_point(field:google.protobuf.Type.options)
+    pub options: ::std::vec::Vec<Option>,
+    ///  The source context.
+    // @@protoc_insertion_point(field:google.protobuf.Type.source_context)
+    pub source_context: crate::MessageField<crate::well_known_types::source_context::SourceContext>,
+    ///  The source syntax.
+    // @@protoc_insertion_point(field:google.protobuf.Type.syntax)
+    pub syntax: crate::EnumOrUnknown<Syntax>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.Type.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Type {
+    fn default() -> &'a Type {
+        <Type as crate::Message>::default_instance()
+    }
+}
+
+impl Type {
+    pub fn new() -> Type {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(6);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Type| { &m.name },
+            |m: &mut Type| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "fields",
+            |m: &Type| { &m.fields },
+            |m: &mut Type| { &mut m.fields },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "oneofs",
+            |m: &Type| { &m.oneofs },
+            |m: &mut Type| { &mut m.oneofs },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "options",
+            |m: &Type| { &m.options },
+            |m: &mut Type| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, crate::well_known_types::source_context::SourceContext>(
+            "source_context",
+            |m: &Type| { &m.source_context },
+            |m: &mut Type| { &mut m.source_context },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "syntax",
+            |m: &Type| { &m.syntax },
+            |m: &mut Type| { &mut m.syntax },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Type>(
+            "Type",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for Type {
+    const NAME: &'static str = "Type";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
+                },
+                18 => {
+                    self.fields.push(is.read_message()?);
+                },
+                26 => {
+                    self.oneofs.push(is.read_string()?);
+                },
+                34 => {
+                    self.options.push(is.read_message()?);
+                },
+                42 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.source_context)?;
+                },
+                48 => {
+                    self.syntax = is.read_enum_or_unknown()?;
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        if !self.name.is_empty() {
+            my_size += crate::rt::string_size(1, &self.name);
+        }
+        for value in &self.fields {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        for value in &self.oneofs {
+            my_size += crate::rt::string_size(3, &value);
+        };
+        for value in &self.options {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        if let Some(v) = self.source_context.as_ref() {
+            let len = v.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        }
+        if self.syntax != crate::EnumOrUnknown::new(Syntax::SYNTAX_PROTO2) {
+            my_size += crate::rt::int32_size(6, self.syntax.value());
+        }
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if !self.name.is_empty() {
+            os.write_string(1, &self.name)?;
+        }
+        for v in &self.fields {
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
+        };
+        for v in &self.oneofs {
+            os.write_string(3, &v)?;
+        };
+        for v in &self.options {
+            crate::rt::write_message_field_with_cached_size(4, v, os)?;
+        };
+        if let Some(v) = self.source_context.as_ref() {
+            crate::rt::write_message_field_with_cached_size(5, v, os)?;
+        }
+        if self.syntax != crate::EnumOrUnknown::new(Syntax::SYNTAX_PROTO2) {
+            os.write_enum(6, crate::EnumOrUnknown::value(&self.syntax))?;
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Type {
+        Type::new()
+    }
+
+    fn clear(&mut self) {
+        self.name.clear();
+        self.fields.clear();
+        self.oneofs.clear();
+        self.options.clear();
+        self.source_context.clear();
+        self.syntax = crate::EnumOrUnknown::new(Syntax::SYNTAX_PROTO2);
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Type {
+        static instance: Type = Type {
+            name: ::std::string::String::new(),
+            fields: ::std::vec::Vec::new(),
+            oneofs: ::std::vec::Vec::new(),
+            options: ::std::vec::Vec::new(),
+            source_context: crate::MessageField::none(),
+            syntax: crate::EnumOrUnknown::from_i32(0),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for Type {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Type").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Type {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for Type {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+///  A single field of a message type.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Field)
+pub struct Field {
+    // message fields
+    ///  The field type.
+    // @@protoc_insertion_point(field:google.protobuf.Field.kind)
+    pub kind: crate::EnumOrUnknown<field::Kind>,
+    ///  The field cardinality.
+    // @@protoc_insertion_point(field:google.protobuf.Field.cardinality)
+    pub cardinality: crate::EnumOrUnknown<field::Cardinality>,
+    ///  The field number.
+    // @@protoc_insertion_point(field:google.protobuf.Field.number)
+    pub number: i32,
+    ///  The field name.
+    // @@protoc_insertion_point(field:google.protobuf.Field.name)
+    pub name: ::std::string::String,
+    ///  The field type URL, without the scheme, for message or enumeration
+    ///  types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+    // @@protoc_insertion_point(field:google.protobuf.Field.type_url)
+    pub type_url: ::std::string::String,
+    ///  The index of the field type in `Type.oneofs`, for message or enumeration
+    ///  types. The first type has index 1; zero means the type is not in the list.
+    // @@protoc_insertion_point(field:google.protobuf.Field.oneof_index)
+    pub oneof_index: i32,
+    ///  Whether to use alternative packed wire representation.
+    // @@protoc_insertion_point(field:google.protobuf.Field.packed)
+    pub packed: bool,
+    ///  The protocol buffer options.
+    // @@protoc_insertion_point(field:google.protobuf.Field.options)
+    pub options: ::std::vec::Vec<Option>,
+    ///  The field JSON name.
+    // @@protoc_insertion_point(field:google.protobuf.Field.json_name)
+    pub json_name: ::std::string::String,
+    ///  The string value of the default value of this field. Proto2 syntax only.
+    // @@protoc_insertion_point(field:google.protobuf.Field.default_value)
+    pub default_value: ::std::string::String,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.Field.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Field {
+    fn default() -> &'a Field {
+        <Field as crate::Message>::default_instance()
+    }
+}
+
+impl Field {
+    pub fn new() -> Field {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(10);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "kind",
+            |m: &Field| { &m.kind },
+            |m: &mut Field| { &mut m.kind },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "cardinality",
+            |m: &Field| { &m.cardinality },
+            |m: &mut Field| { &mut m.cardinality },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "number",
+            |m: &Field| { &m.number },
+            |m: &mut Field| { &mut m.number },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Field| { &m.name },
+            |m: &mut Field| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "type_url",
+            |m: &Field| { &m.type_url },
+            |m: &mut Field| { &mut m.type_url },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "oneof_index",
+            |m: &Field| { &m.oneof_index },
+            |m: &mut Field| { &mut m.oneof_index },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "packed",
+            |m: &Field| { &m.packed },
+            |m: &mut Field| { &mut m.packed },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "options",
+            |m: &Field| { &m.options },
+            |m: &mut Field| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "json_name",
+            |m: &Field| { &m.json_name },
+            |m: &mut Field| { &mut m.json_name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "default_value",
+            |m: &Field| { &m.default_value },
+            |m: &mut Field| { &mut m.default_value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Field>(
+            "Field",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for Field {
+    const NAME: &'static str = "Field";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.kind = is.read_enum_or_unknown()?;
+                },
+                16 => {
+                    self.cardinality = is.read_enum_or_unknown()?;
+                },
+                24 => {
+                    self.number = is.read_int32()?;
+                },
+                34 => {
+                    self.name = is.read_string()?;
+                },
+                50 => {
+                    self.type_url = is.read_string()?;
+                },
+                56 => {
+                    self.oneof_index = is.read_int32()?;
+                },
+                64 => {
+                    self.packed = is.read_bool()?;
+                },
+                74 => {
+                    self.options.push(is.read_message()?);
+                },
+                82 => {
+                    self.json_name = is.read_string()?;
+                },
+                90 => {
+                    self.default_value = is.read_string()?;
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        if self.kind != crate::EnumOrUnknown::new(field::Kind::TYPE_UNKNOWN) {
+            my_size += crate::rt::int32_size(1, self.kind.value());
+        }
+        if self.cardinality != crate::EnumOrUnknown::new(field::Cardinality::CARDINALITY_UNKNOWN) {
+            my_size += crate::rt::int32_size(2, self.cardinality.value());
+        }
+        if self.number != 0 {
+            my_size += crate::rt::int32_size(3, self.number);
+        }
+        if !self.name.is_empty() {
+            my_size += crate::rt::string_size(4, &self.name);
+        }
+        if !self.type_url.is_empty() {
+            my_size += crate::rt::string_size(6, &self.type_url);
+        }
+        if self.oneof_index != 0 {
+            my_size += crate::rt::int32_size(7, self.oneof_index);
+        }
+        if self.packed != false {
+            my_size += 1 + 1;
+        }
+        for value in &self.options {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        if !self.json_name.is_empty() {
+            my_size += crate::rt::string_size(10, &self.json_name);
+        }
+        if !self.default_value.is_empty() {
+            my_size += crate::rt::string_size(11, &self.default_value);
+        }
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if self.kind != crate::EnumOrUnknown::new(field::Kind::TYPE_UNKNOWN) {
+            os.write_enum(1, crate::EnumOrUnknown::value(&self.kind))?;
+        }
+        if self.cardinality != crate::EnumOrUnknown::new(field::Cardinality::CARDINALITY_UNKNOWN) {
+            os.write_enum(2, crate::EnumOrUnknown::value(&self.cardinality))?;
+        }
+        if self.number != 0 {
+            os.write_int32(3, self.number)?;
+        }
+        if !self.name.is_empty() {
+            os.write_string(4, &self.name)?;
+        }
+        if !self.type_url.is_empty() {
+            os.write_string(6, &self.type_url)?;
+        }
+        if self.oneof_index != 0 {
+            os.write_int32(7, self.oneof_index)?;
+        }
+        if self.packed != false {
+            os.write_bool(8, self.packed)?;
+        }
+        for v in &self.options {
+            crate::rt::write_message_field_with_cached_size(9, v, os)?;
+        };
+        if !self.json_name.is_empty() {
+            os.write_string(10, &self.json_name)?;
+        }
+        if !self.default_value.is_empty() {
+            os.write_string(11, &self.default_value)?;
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Field {
+        Field::new()
+    }
+
+    fn clear(&mut self) {
+        self.kind = crate::EnumOrUnknown::new(field::Kind::TYPE_UNKNOWN);
+        self.cardinality = crate::EnumOrUnknown::new(field::Cardinality::CARDINALITY_UNKNOWN);
+        self.number = 0;
+        self.name.clear();
+        self.type_url.clear();
+        self.oneof_index = 0;
+        self.packed = false;
+        self.options.clear();
+        self.json_name.clear();
+        self.default_value.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Field {
+        static instance: Field = Field {
+            kind: crate::EnumOrUnknown::from_i32(0),
+            cardinality: crate::EnumOrUnknown::from_i32(0),
+            number: 0,
+            name: ::std::string::String::new(),
+            type_url: ::std::string::String::new(),
+            oneof_index: 0,
+            packed: false,
+            options: ::std::vec::Vec::new(),
+            json_name: ::std::string::String::new(),
+            default_value: ::std::string::String::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for Field {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Field").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Field {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for Field {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+/// Nested message and enums of message `Field`
+pub mod field {
+    ///  Basic field types.
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.Field.Kind)
+    pub enum Kind {
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_UNKNOWN)
+        TYPE_UNKNOWN = 0,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_DOUBLE)
+        TYPE_DOUBLE = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_FLOAT)
+        TYPE_FLOAT = 2,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_INT64)
+        TYPE_INT64 = 3,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_UINT64)
+        TYPE_UINT64 = 4,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_INT32)
+        TYPE_INT32 = 5,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_FIXED64)
+        TYPE_FIXED64 = 6,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_FIXED32)
+        TYPE_FIXED32 = 7,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_BOOL)
+        TYPE_BOOL = 8,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_STRING)
+        TYPE_STRING = 9,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_GROUP)
+        TYPE_GROUP = 10,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_MESSAGE)
+        TYPE_MESSAGE = 11,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_BYTES)
+        TYPE_BYTES = 12,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_UINT32)
+        TYPE_UINT32 = 13,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_ENUM)
+        TYPE_ENUM = 14,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_SFIXED32)
+        TYPE_SFIXED32 = 15,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_SFIXED64)
+        TYPE_SFIXED64 = 16,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_SINT32)
+        TYPE_SINT32 = 17,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Kind.TYPE_SINT64)
+        TYPE_SINT64 = 18,
+    }
+
+    impl crate::Enum for Kind {
+        const NAME: &'static str = "Kind";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<Kind> {
+            match value {
+                0 => ::std::option::Option::Some(Kind::TYPE_UNKNOWN),
+                1 => ::std::option::Option::Some(Kind::TYPE_DOUBLE),
+                2 => ::std::option::Option::Some(Kind::TYPE_FLOAT),
+                3 => ::std::option::Option::Some(Kind::TYPE_INT64),
+                4 => ::std::option::Option::Some(Kind::TYPE_UINT64),
+                5 => ::std::option::Option::Some(Kind::TYPE_INT32),
+                6 => ::std::option::Option::Some(Kind::TYPE_FIXED64),
+                7 => ::std::option::Option::Some(Kind::TYPE_FIXED32),
+                8 => ::std::option::Option::Some(Kind::TYPE_BOOL),
+                9 => ::std::option::Option::Some(Kind::TYPE_STRING),
+                10 => ::std::option::Option::Some(Kind::TYPE_GROUP),
+                11 => ::std::option::Option::Some(Kind::TYPE_MESSAGE),
+                12 => ::std::option::Option::Some(Kind::TYPE_BYTES),
+                13 => ::std::option::Option::Some(Kind::TYPE_UINT32),
+                14 => ::std::option::Option::Some(Kind::TYPE_ENUM),
+                15 => ::std::option::Option::Some(Kind::TYPE_SFIXED32),
+                16 => ::std::option::Option::Some(Kind::TYPE_SFIXED64),
+                17 => ::std::option::Option::Some(Kind::TYPE_SINT32),
+                18 => ::std::option::Option::Some(Kind::TYPE_SINT64),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [Kind] = &[
+            Kind::TYPE_UNKNOWN,
+            Kind::TYPE_DOUBLE,
+            Kind::TYPE_FLOAT,
+            Kind::TYPE_INT64,
+            Kind::TYPE_UINT64,
+            Kind::TYPE_INT32,
+            Kind::TYPE_FIXED64,
+            Kind::TYPE_FIXED32,
+            Kind::TYPE_BOOL,
+            Kind::TYPE_STRING,
+            Kind::TYPE_GROUP,
+            Kind::TYPE_MESSAGE,
+            Kind::TYPE_BYTES,
+            Kind::TYPE_UINT32,
+            Kind::TYPE_ENUM,
+            Kind::TYPE_SFIXED32,
+            Kind::TYPE_SFIXED64,
+            Kind::TYPE_SINT32,
+            Kind::TYPE_SINT64,
+        ];
+    }
+
+    impl crate::EnumFull for Kind {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("Field.Kind").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = *self as usize;
+            Self::enum_descriptor().value_by_index(index)
+        }
+    }
+
+    impl ::std::default::Default for Kind {
+        fn default() -> Self {
+            Kind::TYPE_UNKNOWN
+        }
+    }
+
+    impl Kind {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<Kind>("Field.Kind")
+        }
+    }
+
+    ///  Whether a field is optional, required, or repeated.
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:google.protobuf.Field.Cardinality)
+    pub enum Cardinality {
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Cardinality.CARDINALITY_UNKNOWN)
+        CARDINALITY_UNKNOWN = 0,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Cardinality.CARDINALITY_OPTIONAL)
+        CARDINALITY_OPTIONAL = 1,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Cardinality.CARDINALITY_REQUIRED)
+        CARDINALITY_REQUIRED = 2,
+        // @@protoc_insertion_point(enum_value:google.protobuf.Field.Cardinality.CARDINALITY_REPEATED)
+        CARDINALITY_REPEATED = 3,
+    }
+
+    impl crate::Enum for Cardinality {
+        const NAME: &'static str = "Cardinality";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<Cardinality> {
+            match value {
+                0 => ::std::option::Option::Some(Cardinality::CARDINALITY_UNKNOWN),
+                1 => ::std::option::Option::Some(Cardinality::CARDINALITY_OPTIONAL),
+                2 => ::std::option::Option::Some(Cardinality::CARDINALITY_REQUIRED),
+                3 => ::std::option::Option::Some(Cardinality::CARDINALITY_REPEATED),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [Cardinality] = &[
+            Cardinality::CARDINALITY_UNKNOWN,
+            Cardinality::CARDINALITY_OPTIONAL,
+            Cardinality::CARDINALITY_REQUIRED,
+            Cardinality::CARDINALITY_REPEATED,
+        ];
+    }
+
+    impl crate::EnumFull for Cardinality {
+        fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+            static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("Field.Cardinality").unwrap()).clone()
+        }
+
+        fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+            let index = *self as usize;
+            Self::enum_descriptor().value_by_index(index)
+        }
+    }
+
+    impl ::std::default::Default for Cardinality {
+        fn default() -> Self {
+            Cardinality::CARDINALITY_UNKNOWN
+        }
+    }
+
+    impl Cardinality {
+        pub(in super) fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+            crate::reflect::GeneratedEnumDescriptorData::new::<Cardinality>("Field.Cardinality")
+        }
+    }
+}
+
+///  Enum type definition.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Enum)
+pub struct Enum {
+    // message fields
+    ///  Enum type name.
+    // @@protoc_insertion_point(field:google.protobuf.Enum.name)
+    pub name: ::std::string::String,
+    ///  Enum value definitions.
+    // @@protoc_insertion_point(field:google.protobuf.Enum.enumvalue)
+    pub enumvalue: ::std::vec::Vec<EnumValue>,
+    ///  Protocol buffer options.
+    // @@protoc_insertion_point(field:google.protobuf.Enum.options)
+    pub options: ::std::vec::Vec<Option>,
+    ///  The source context.
+    // @@protoc_insertion_point(field:google.protobuf.Enum.source_context)
+    pub source_context: crate::MessageField<crate::well_known_types::source_context::SourceContext>,
+    ///  The source syntax.
+    // @@protoc_insertion_point(field:google.protobuf.Enum.syntax)
+    pub syntax: crate::EnumOrUnknown<Syntax>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.Enum.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Enum {
+    fn default() -> &'a Enum {
+        <Enum as crate::Message>::default_instance()
+    }
+}
+
+impl Enum {
+    pub fn new() -> Enum {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(5);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Enum| { &m.name },
+            |m: &mut Enum| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "enumvalue",
+            |m: &Enum| { &m.enumvalue },
+            |m: &mut Enum| { &mut m.enumvalue },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "options",
+            |m: &Enum| { &m.options },
+            |m: &mut Enum| { &mut m.options },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, crate::well_known_types::source_context::SourceContext>(
+            "source_context",
+            |m: &Enum| { &m.source_context },
+            |m: &mut Enum| { &mut m.source_context },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "syntax",
+            |m: &Enum| { &m.syntax },
+            |m: &mut Enum| { &mut m.syntax },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Enum>(
+            "Enum",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for Enum {
+    const NAME: &'static str = "Enum";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
+                },
+                18 => {
+                    self.enumvalue.push(is.read_message()?);
+                },
+                26 => {
+                    self.options.push(is.read_message()?);
+                },
+                34 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.source_context)?;
+                },
+                40 => {
+                    self.syntax = is.read_enum_or_unknown()?;
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        if !self.name.is_empty() {
+            my_size += crate::rt::string_size(1, &self.name);
+        }
+        for value in &self.enumvalue {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        for value in &self.options {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        if let Some(v) = self.source_context.as_ref() {
+            let len = v.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        }
+        if self.syntax != crate::EnumOrUnknown::new(Syntax::SYNTAX_PROTO2) {
+            my_size += crate::rt::int32_size(5, self.syntax.value());
+        }
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if !self.name.is_empty() {
+            os.write_string(1, &self.name)?;
+        }
+        for v in &self.enumvalue {
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
+        };
+        for v in &self.options {
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
+        };
+        if let Some(v) = self.source_context.as_ref() {
+            crate::rt::write_message_field_with_cached_size(4, v, os)?;
+        }
+        if self.syntax != crate::EnumOrUnknown::new(Syntax::SYNTAX_PROTO2) {
+            os.write_enum(5, crate::EnumOrUnknown::value(&self.syntax))?;
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Enum {
+        Enum::new()
+    }
+
+    fn clear(&mut self) {
+        self.name.clear();
+        self.enumvalue.clear();
+        self.options.clear();
+        self.source_context.clear();
+        self.syntax = crate::EnumOrUnknown::new(Syntax::SYNTAX_PROTO2);
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Enum {
+        static instance: Enum = Enum {
+            name: ::std::string::String::new(),
+            enumvalue: ::std::vec::Vec::new(),
+            options: ::std::vec::Vec::new(),
+            source_context: crate::MessageField::none(),
+            syntax: crate::EnumOrUnknown::from_i32(0),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for Enum {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Enum").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Enum {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for Enum {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+///  Enum value definition.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.EnumValue)
+pub struct EnumValue {
+    // message fields
+    ///  Enum value name.
+    // @@protoc_insertion_point(field:google.protobuf.EnumValue.name)
+    pub name: ::std::string::String,
+    ///  Enum value number.
+    // @@protoc_insertion_point(field:google.protobuf.EnumValue.number)
+    pub number: i32,
+    ///  Protocol buffer options.
+    // @@protoc_insertion_point(field:google.protobuf.EnumValue.options)
+    pub options: ::std::vec::Vec<Option>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.EnumValue.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a EnumValue {
+    fn default() -> &'a EnumValue {
+        <EnumValue as crate::Message>::default_instance()
+    }
+}
+
+impl EnumValue {
+    pub fn new() -> EnumValue {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(3);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &EnumValue| { &m.name },
+            |m: &mut EnumValue| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "number",
+            |m: &EnumValue| { &m.number },
+            |m: &mut EnumValue| { &mut m.number },
+        ));
+        fields.push(crate::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+            "options",
+            |m: &EnumValue| { &m.options },
+            |m: &mut EnumValue| { &mut m.options },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<EnumValue>(
+            "EnumValue",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for EnumValue {
+    const NAME: &'static str = "EnumValue";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
+                },
+                16 => {
+                    self.number = is.read_int32()?;
+                },
+                26 => {
+                    self.options.push(is.read_message()?);
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        if !self.name.is_empty() {
+            my_size += crate::rt::string_size(1, &self.name);
+        }
+        if self.number != 0 {
+            my_size += crate::rt::int32_size(2, self.number);
+        }
+        for value in &self.options {
+            let len = value.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        };
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if !self.name.is_empty() {
+            os.write_string(1, &self.name)?;
+        }
+        if self.number != 0 {
+            os.write_int32(2, self.number)?;
+        }
+        for v in &self.options {
+            crate::rt::write_message_field_with_cached_size(3, v, os)?;
+        };
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> EnumValue {
+        EnumValue::new()
+    }
+
+    fn clear(&mut self) {
+        self.name.clear();
+        self.number = 0;
+        self.options.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static EnumValue {
+        static instance: EnumValue = EnumValue {
+            name: ::std::string::String::new(),
+            number: 0,
+            options: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for EnumValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("EnumValue").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for EnumValue {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for EnumValue {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+///  A protocol buffer option, which can be attached to a message, field,
+///  enumeration, etc.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Option)
+pub struct Option {
+    // message fields
+    ///  The option's name. For protobuf built-in options (options defined in
+    ///  descriptor.proto), this is the short name. For example, `"map_entry"`.
+    ///  For custom options, it should be the fully-qualified name. For example,
+    ///  `"google.api.http"`.
+    // @@protoc_insertion_point(field:google.protobuf.Option.name)
+    pub name: ::std::string::String,
+    ///  The option's value packed in an Any message. If the value is a primitive,
+    ///  the corresponding wrapper type defined in google/protobuf/wrappers.proto
+    ///  should be used. If the value is an enum, it should be stored as an int32
+    ///  value using the google.protobuf.Int32Value type.
+    // @@protoc_insertion_point(field:google.protobuf.Option.value)
+    pub value: crate::MessageField<crate::well_known_types::any::Any>,
+    // special fields
+    // @@protoc_insertion_point(special_field:google.protobuf.Option.special_fields)
+    pub special_fields: crate::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Option {
+    fn default() -> &'a Option {
+        <Option as crate::Message>::default_instance()
+    }
+}
+
+impl Option {
+    pub fn new() -> Option {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(2);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "name",
+            |m: &Option| { &m.name },
+            |m: &mut Option| { &mut m.name },
+        ));
+        fields.push(crate::reflect::rt::v2::make_message_field_accessor::<_, crate::well_known_types::any::Any>(
+            "value",
+            |m: &Option| { &m.value },
+            |m: &mut Option| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Option>(
+            "Option",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl crate::Message for Option {
+    const NAME: &'static str = "Option";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.name = is.read_string()?;
+                },
+                18 => {
+                    crate::rt::read_singular_message_into_field(is, &mut self.value)?;
+                },
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        if !self.name.is_empty() {
+            my_size += crate::rt::string_size(1, &self.name);
+        }
+        if let Some(v) = self.value.as_ref() {
+            let len = v.compute_size();
+            my_size += 1 + crate::rt::compute_raw_varint64_size(len) + len;
+        }
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
+        if !self.name.is_empty() {
+            os.write_string(1, &self.name)?;
+        }
+        if let Some(v) = self.value.as_ref() {
+            crate::rt::write_message_field_with_cached_size(2, v, os)?;
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Option {
+        Option::new()
+    }
+
+    fn clear(&mut self) {
+        self.name.clear();
+        self.value.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Option {
+        static instance: Option = Option {
+            name: ::std::string::String::new(),
+            value: crate::MessageField::none(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl crate::MessageFull for Option {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Option").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Option {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        crate::text_format::fmt(self, f)
+    }
+}
+
+impl crate::reflect::ProtobufValue for Option {
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+///  The syntax in which a protocol buffer element is defined.
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:google.protobuf.Syntax)
+pub enum Syntax {
+    // @@protoc_insertion_point(enum_value:google.protobuf.Syntax.SYNTAX_PROTO2)
+    SYNTAX_PROTO2 = 0,
+    // @@protoc_insertion_point(enum_value:google.protobuf.Syntax.SYNTAX_PROTO3)
+    SYNTAX_PROTO3 = 1,
+}
+
+impl crate::Enum for Syntax {
+    const NAME: &'static str = "Syntax";
+
+    fn value(&self) -> i32 {
+        *self as i32
+    }
+
+    fn from_i32(value: i32) -> ::std::option::Option<Syntax> {
+        match value {
+            0 => ::std::option::Option::Some(Syntax::SYNTAX_PROTO2),
+            1 => ::std::option::Option::Some(Syntax::SYNTAX_PROTO3),
+            _ => ::std::option::Option::None
+        }
+    }
+
+    const VALUES: &'static [Syntax] = &[
+        Syntax::SYNTAX_PROTO2,
+        Syntax::SYNTAX_PROTO3,
+    ];
+}
+
+impl crate::EnumFull for Syntax {
+    fn enum_descriptor() -> crate::reflect::EnumDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::EnumDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().enum_by_package_relative_name("Syntax").unwrap()).clone()
+    }
+
+    fn descriptor(&self) -> crate::reflect::EnumValueDescriptor {
+        let index = *self as usize;
+        Self::enum_descriptor().value_by_index(index)
+    }
+}
+
+impl ::std::default::Default for Syntax {
+    fn default() -> Self {
+        Syntax::SYNTAX_PROTO2
+    }
+}
+
+impl Syntax {
+    fn generated_enum_descriptor_data() -> crate::reflect::GeneratedEnumDescriptorData {
+        crate::reflect::GeneratedEnumDescriptorData::new::<Syntax>("Syntax")
+    }
+}
+
+static file_descriptor_proto_data: &'static [u8] = b"\
+    \n\x1agoogle/protobuf/type.proto\x12\x0fgoogle.protobuf\x1a\x19google/pr\
+    otobuf/any.proto\x1a$google/protobuf/source_context.proto\"\x8d\x02\n\
+    \x04Type\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\x12.\n\x06fields\
+    \x18\x02\x20\x03(\x0b2\x16.google.protobuf.FieldR\x06fields\x12\x16\n\
+    \x06oneofs\x18\x03\x20\x03(\tR\x06oneofs\x121\n\x07options\x18\x04\x20\
+    \x03(\x0b2\x17.google.protobuf.OptionR\x07options\x12E\n\x0esource_conte\
+    xt\x18\x05\x20\x01(\x0b2\x1e.google.protobuf.SourceContextR\rsourceConte\
+    xt\x12/\n\x06syntax\x18\x06\x20\x01(\x0e2\x17.google.protobuf.SyntaxR\
+    \x06syntax\"\xb4\x06\n\x05Field\x12/\n\x04kind\x18\x01\x20\x01(\x0e2\x1b\
+    .google.protobuf.Field.KindR\x04kind\x12D\n\x0bcardinality\x18\x02\x20\
+    \x01(\x0e2\".google.protobuf.Field.CardinalityR\x0bcardinality\x12\x16\n\
+    \x06number\x18\x03\x20\x01(\x05R\x06number\x12\x12\n\x04name\x18\x04\x20\
+    \x01(\tR\x04name\x12\x19\n\x08type_url\x18\x06\x20\x01(\tR\x07typeUrl\
+    \x12\x1f\n\x0boneof_index\x18\x07\x20\x01(\x05R\noneofIndex\x12\x16\n\
+    \x06packed\x18\x08\x20\x01(\x08R\x06packed\x121\n\x07options\x18\t\x20\
+    \x03(\x0b2\x17.google.protobuf.OptionR\x07options\x12\x1b\n\tjson_name\
+    \x18\n\x20\x01(\tR\x08jsonName\x12#\n\rdefault_value\x18\x0b\x20\x01(\tR\
+    \x0cdefaultValue\"\xc8\x02\n\x04Kind\x12\x10\n\x0cTYPE_UNKNOWN\x10\0\x12\
+    \x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nT\
+    YPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\
+    \x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\
+    \x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\
+    \nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYT\
+    ES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\
+    \x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\
+    \x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"t\n\x0bCardina\
+    lity\x12\x17\n\x13CARDINALITY_UNKNOWN\x10\0\x12\x18\n\x14CARDINALITY_OPT\
+    IONAL\x10\x01\x12\x18\n\x14CARDINALITY_REQUIRED\x10\x02\x12\x18\n\x14CAR\
+    DINALITY_REPEATED\x10\x03\"\xff\x01\n\x04Enum\x12\x12\n\x04name\x18\x01\
+    \x20\x01(\tR\x04name\x128\n\tenumvalue\x18\x02\x20\x03(\x0b2\x1a.google.\
+    protobuf.EnumValueR\tenumvalue\x121\n\x07options\x18\x03\x20\x03(\x0b2\
+    \x17.google.protobuf.OptionR\x07options\x12E\n\x0esource_context\x18\x04\
+    \x20\x01(\x0b2\x1e.google.protobuf.SourceContextR\rsourceContext\x12/\n\
+    \x06syntax\x18\x05\x20\x01(\x0e2\x17.google.protobuf.SyntaxR\x06syntax\"\
+    j\n\tEnumValue\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\x12\x16\n\
+    \x06number\x18\x02\x20\x01(\x05R\x06number\x121\n\x07options\x18\x03\x20\
+    \x03(\x0b2\x17.google.protobuf.OptionR\x07options\"H\n\x06Option\x12\x12\
+    \n\x04name\x18\x01\x20\x01(\tR\x04name\x12*\n\x05value\x18\x02\x20\x01(\
+    \x0b2\x14.google.protobuf.AnyR\x05value*.\n\x06Syntax\x12\x11\n\rSYNTAX_\
+    PROTO2\x10\0\x12\x11\n\rSYNTAX_PROTO3\x10\x01B{\n\x13com.google.protobuf\
+    B\tTypeProtoP\x01Z-google.golang.org/protobuf/types/known/typepb\xf8\x01\
+    \x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesJ\xc38\n\
+    \x07\x12\x05\x1e\0\xba\x01\x01\n\xcc\x0c\n\x01\x0c\x12\x03\x1e\0\x122\
+    \xc1\x0c\x20Protocol\x20Buffers\x20-\x20Google's\x20data\x20interchange\
+    \x20format\n\x20Copyright\x202008\x20Google\x20Inc.\x20\x20All\x20rights\
+    \x20reserved.\n\x20https://developers.google.com/protocol-buffers/\n\n\
+    \x20Redistribution\x20and\x20use\x20in\x20source\x20and\x20binary\x20for\
+    ms,\x20with\x20or\x20without\n\x20modification,\x20are\x20permitted\x20p\
+    rovided\x20that\x20the\x20following\x20conditions\x20are\n\x20met:\n\n\
+    \x20\x20\x20\x20\x20*\x20Redistributions\x20of\x20source\x20code\x20must\
+    \x20retain\x20the\x20above\x20copyright\n\x20notice,\x20this\x20list\x20\
+    of\x20conditions\x20and\x20the\x20following\x20disclaimer.\n\x20\x20\x20\
+    \x20\x20*\x20Redistributions\x20in\x20binary\x20form\x20must\x20reproduc\
+    e\x20the\x20above\n\x20copyright\x20notice,\x20this\x20list\x20of\x20con\
+    ditions\x20and\x20the\x20following\x20disclaimer\n\x20in\x20the\x20docum\
+    entation\x20and/or\x20other\x20materials\x20provided\x20with\x20the\n\
+    \x20distribution.\n\x20\x20\x20\x20\x20*\x20Neither\x20the\x20name\x20of\
+    \x20Google\x20Inc.\x20nor\x20the\x20names\x20of\x20its\n\x20contributors\
+    \x20may\x20be\x20used\x20to\x20endorse\x20or\x20promote\x20products\x20d\
+    erived\x20from\n\x20this\x20software\x20without\x20specific\x20prior\x20\
+    written\x20permission.\n\n\x20THIS\x20SOFTWARE\x20IS\x20PROVIDED\x20BY\
+    \x20THE\x20COPYRIGHT\x20HOLDERS\x20AND\x20CONTRIBUTORS\n\x20\"AS\x20IS\"\
+    \x20AND\x20ANY\x20EXPRESS\x20OR\x20IMPLIED\x20WARRANTIES,\x20INCLUDING,\
+    \x20BUT\x20NOT\n\x20LIMITED\x20TO,\x20THE\x20IMPLIED\x20WARRANTIES\x20OF\
+    \x20MERCHANTABILITY\x20AND\x20FITNESS\x20FOR\n\x20A\x20PARTICULAR\x20PUR\
+    POSE\x20ARE\x20DISCLAIMED.\x20IN\x20NO\x20EVENT\x20SHALL\x20THE\x20COPYR\
+    IGHT\n\x20OWNER\x20OR\x20CONTRIBUTORS\x20BE\x20LIABLE\x20FOR\x20ANY\x20D\
+    IRECT,\x20INDIRECT,\x20INCIDENTAL,\n\x20SPECIAL,\x20EXEMPLARY,\x20OR\x20\
+    CONSEQUENTIAL\x20DAMAGES\x20(INCLUDING,\x20BUT\x20NOT\n\x20LIMITED\x20TO\
+    ,\x20PROCUREMENT\x20OF\x20SUBSTITUTE\x20GOODS\x20OR\x20SERVICES;\x20LOSS\
+    \x20OF\x20USE,\n\x20DATA,\x20OR\x20PROFITS;\x20OR\x20BUSINESS\x20INTERRU\
+    PTION)\x20HOWEVER\x20CAUSED\x20AND\x20ON\x20ANY\n\x20THEORY\x20OF\x20LIA\
+    BILITY,\x20WHETHER\x20IN\x20CONTRACT,\x20STRICT\x20LIABILITY,\x20OR\x20T\
+    ORT\n\x20(INCLUDING\x20NEGLIGENCE\x20OR\x20OTHERWISE)\x20ARISING\x20IN\
+    \x20ANY\x20WAY\x20OUT\x20OF\x20THE\x20USE\n\x20OF\x20THIS\x20SOFTWARE,\
+    \x20EVEN\x20IF\x20ADVISED\x20OF\x20THE\x20POSSIBILITY\x20OF\x20SUCH\x20D\
+    AMAGE.\n\n\x08\n\x01\x02\x12\x03\x20\0\x18\n\t\n\x02\x03\0\x12\x03\"\0#\
+    \n\t\n\x02\x03\x01\x12\x03#\0.\n\x08\n\x01\x08\x12\x03%\0;\n\t\n\x02\x08\
+    %\x12\x03%\0;\n\x08\n\x01\x08\x12\x03&\0\x1f\n\t\n\x02\x08\x1f\x12\x03&\
+    \0\x1f\n\x08\n\x01\x08\x12\x03'\0,\n\t\n\x02\x08\x01\x12\x03'\0,\n\x08\n\
+    \x01\x08\x12\x03(\0*\n\t\n\x02\x08\x08\x12\x03(\0*\n\x08\n\x01\x08\x12\
+    \x03)\0\"\n\t\n\x02\x08\n\x12\x03)\0\"\n\x08\n\x01\x08\x12\x03*\0!\n\t\n\
+    \x02\x08$\x12\x03*\0!\n\x08\n\x01\x08\x12\x03+\0D\n\t\n\x02\x08\x0b\x12\
+    \x03+\0D\n-\n\x02\x04\0\x12\x04.\0;\x01\x1a!\x20A\x20protocol\x20buffer\
+    \x20message\x20type.\n\n\n\n\x03\x04\0\x01\x12\x03.\x08\x0c\n0\n\x04\x04\
+    \0\x02\0\x12\x030\x02\x12\x1a#\x20The\x20fully\x20qualified\x20message\
+    \x20name.\n\n\x0c\n\x05\x04\0\x02\0\x05\x12\x030\x02\x08\n\x0c\n\x05\x04\
+    \0\x02\0\x01\x12\x030\t\r\n\x0c\n\x05\x04\0\x02\0\x03\x12\x030\x10\x11\n\
+    \"\n\x04\x04\0\x02\x01\x12\x032\x02\x1c\x1a\x15\x20The\x20list\x20of\x20\
+    fields.\n\n\x0c\n\x05\x04\0\x02\x01\x04\x12\x032\x02\n\n\x0c\n\x05\x04\0\
+    \x02\x01\x06\x12\x032\x0b\x10\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x032\x11\
+    \x17\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x032\x1a\x1b\nO\n\x04\x04\0\x02\
+    \x02\x12\x034\x02\x1d\x1aB\x20The\x20list\x20of\x20types\x20appearing\
+    \x20in\x20`oneof`\x20definitions\x20in\x20this\x20type.\n\n\x0c\n\x05\
+    \x04\0\x02\x02\x04\x12\x034\x02\n\n\x0c\n\x05\x04\0\x02\x02\x05\x12\x034\
+    \x0b\x11\n\x0c\n\x05\x04\0\x02\x02\x01\x12\x034\x12\x18\n\x0c\n\x05\x04\
+    \0\x02\x02\x03\x12\x034\x1b\x1c\n+\n\x04\x04\0\x02\x03\x12\x036\x02\x1e\
+    \x1a\x1e\x20The\x20protocol\x20buffer\x20options.\n\n\x0c\n\x05\x04\0\
+    \x02\x03\x04\x12\x036\x02\n\n\x0c\n\x05\x04\0\x02\x03\x06\x12\x036\x0b\
+    \x11\n\x0c\n\x05\x04\0\x02\x03\x01\x12\x036\x12\x19\n\x0c\n\x05\x04\0\
+    \x02\x03\x03\x12\x036\x1c\x1d\n\"\n\x04\x04\0\x02\x04\x12\x038\x02#\x1a\
+    \x15\x20The\x20source\x20context.\n\n\x0c\n\x05\x04\0\x02\x04\x06\x12\
+    \x038\x02\x0f\n\x0c\n\x05\x04\0\x02\x04\x01\x12\x038\x10\x1e\n\x0c\n\x05\
+    \x04\0\x02\x04\x03\x12\x038!\"\n!\n\x04\x04\0\x02\x05\x12\x03:\x02\x14\
+    \x1a\x14\x20The\x20source\x20syntax.\n\n\x0c\n\x05\x04\0\x02\x05\x06\x12\
+    \x03:\x02\x08\n\x0c\n\x05\x04\0\x02\x05\x01\x12\x03:\t\x0f\n\x0c\n\x05\
+    \x04\0\x02\x05\x03\x12\x03:\x12\x13\n0\n\x02\x04\x01\x12\x05>\0\x8b\x01\
+    \x01\x1a#\x20A\x20single\x20field\x20of\x20a\x20message\x20type.\n\n\n\n\
+    \x03\x04\x01\x01\x12\x03>\x08\r\n\"\n\x04\x04\x01\x04\0\x12\x04@\x02g\
+    \x03\x1a\x14\x20Basic\x20field\x20types.\n\n\x0c\n\x05\x04\x01\x04\0\x01\
+    \x12\x03@\x07\x0b\n$\n\x06\x04\x01\x04\0\x02\0\x12\x03B\x04\x15\x1a\x15\
+    \x20Field\x20type\x20unknown.\n\n\x0e\n\x07\x04\x01\x04\0\x02\0\x01\x12\
+    \x03B\x04\x10\n\x0e\n\x07\x04\x01\x04\0\x02\0\x02\x12\x03B\x13\x14\n#\n\
+    \x06\x04\x01\x04\0\x02\x01\x12\x03D\x04\x14\x1a\x14\x20Field\x20type\x20\
+    double.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x01\x01\x12\x03D\x04\x0f\n\x0e\n\
+    \x07\x04\x01\x04\0\x02\x01\x02\x12\x03D\x12\x13\n\"\n\x06\x04\x01\x04\0\
+    \x02\x02\x12\x03F\x04\x13\x1a\x13\x20Field\x20type\x20float.\n\n\x0e\n\
+    \x07\x04\x01\x04\0\x02\x02\x01\x12\x03F\x04\x0e\n\x0e\n\x07\x04\x01\x04\
+    \0\x02\x02\x02\x12\x03F\x11\x12\n\"\n\x06\x04\x01\x04\0\x02\x03\x12\x03H\
+    \x04\x13\x1a\x13\x20Field\x20type\x20int64.\n\n\x0e\n\x07\x04\x01\x04\0\
+    \x02\x03\x01\x12\x03H\x04\x0e\n\x0e\n\x07\x04\x01\x04\0\x02\x03\x02\x12\
+    \x03H\x11\x12\n#\n\x06\x04\x01\x04\0\x02\x04\x12\x03J\x04\x14\x1a\x14\
+    \x20Field\x20type\x20uint64.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x04\x01\x12\
+    \x03J\x04\x0f\n\x0e\n\x07\x04\x01\x04\0\x02\x04\x02\x12\x03J\x12\x13\n\"\
+    \n\x06\x04\x01\x04\0\x02\x05\x12\x03L\x04\x13\x1a\x13\x20Field\x20type\
+    \x20int32.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x05\x01\x12\x03L\x04\x0e\n\
+    \x0e\n\x07\x04\x01\x04\0\x02\x05\x02\x12\x03L\x11\x12\n$\n\x06\x04\x01\
+    \x04\0\x02\x06\x12\x03N\x04\x15\x1a\x15\x20Field\x20type\x20fixed64.\n\n\
+    \x0e\n\x07\x04\x01\x04\0\x02\x06\x01\x12\x03N\x04\x10\n\x0e\n\x07\x04\
+    \x01\x04\0\x02\x06\x02\x12\x03N\x13\x14\n$\n\x06\x04\x01\x04\0\x02\x07\
+    \x12\x03P\x04\x15\x1a\x15\x20Field\x20type\x20fixed32.\n\n\x0e\n\x07\x04\
+    \x01\x04\0\x02\x07\x01\x12\x03P\x04\x10\n\x0e\n\x07\x04\x01\x04\0\x02\
+    \x07\x02\x12\x03P\x13\x14\n!\n\x06\x04\x01\x04\0\x02\x08\x12\x03R\x04\
+    \x12\x1a\x12\x20Field\x20type\x20bool.\n\n\x0e\n\x07\x04\x01\x04\0\x02\
+    \x08\x01\x12\x03R\x04\r\n\x0e\n\x07\x04\x01\x04\0\x02\x08\x02\x12\x03R\
+    \x10\x11\n#\n\x06\x04\x01\x04\0\x02\t\x12\x03T\x04\x14\x1a\x14\x20Field\
+    \x20type\x20string.\n\n\x0e\n\x07\x04\x01\x04\0\x02\t\x01\x12\x03T\x04\
+    \x0f\n\x0e\n\x07\x04\x01\x04\0\x02\t\x02\x12\x03T\x12\x13\nF\n\x06\x04\
+    \x01\x04\0\x02\n\x12\x03V\x04\x14\x1a7\x20Field\x20type\x20group.\x20Pro\
+    to2\x20syntax\x20only,\x20and\x20deprecated.\n\n\x0e\n\x07\x04\x01\x04\0\
+    \x02\n\x01\x12\x03V\x04\x0e\n\x0e\n\x07\x04\x01\x04\0\x02\n\x02\x12\x03V\
+    \x11\x13\n$\n\x06\x04\x01\x04\0\x02\x0b\x12\x03X\x04\x16\x1a\x15\x20Fiel\
+    d\x20type\x20message.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x0b\x01\x12\x03X\
+    \x04\x10\n\x0e\n\x07\x04\x01\x04\0\x02\x0b\x02\x12\x03X\x13\x15\n\"\n\
+    \x06\x04\x01\x04\0\x02\x0c\x12\x03Z\x04\x14\x1a\x13\x20Field\x20type\x20\
+    bytes.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x0c\x01\x12\x03Z\x04\x0e\n\x0e\n\
+    \x07\x04\x01\x04\0\x02\x0c\x02\x12\x03Z\x11\x13\n#\n\x06\x04\x01\x04\0\
+    \x02\r\x12\x03\\\x04\x15\x1a\x14\x20Field\x20type\x20uint32.\n\n\x0e\n\
+    \x07\x04\x01\x04\0\x02\r\x01\x12\x03\\\x04\x0f\n\x0e\n\x07\x04\x01\x04\0\
+    \x02\r\x02\x12\x03\\\x12\x14\n!\n\x06\x04\x01\x04\0\x02\x0e\x12\x03^\x04\
+    \x13\x1a\x12\x20Field\x20type\x20enum.\n\n\x0e\n\x07\x04\x01\x04\0\x02\
+    \x0e\x01\x12\x03^\x04\r\n\x0e\n\x07\x04\x01\x04\0\x02\x0e\x02\x12\x03^\
+    \x10\x12\n%\n\x06\x04\x01\x04\0\x02\x0f\x12\x03`\x04\x17\x1a\x16\x20Fiel\
+    d\x20type\x20sfixed32.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x0f\x01\x12\x03`\
+    \x04\x11\n\x0e\n\x07\x04\x01\x04\0\x02\x0f\x02\x12\x03`\x14\x16\n%\n\x06\
+    \x04\x01\x04\0\x02\x10\x12\x03b\x04\x17\x1a\x16\x20Field\x20type\x20sfix\
+    ed64.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x10\x01\x12\x03b\x04\x11\n\x0e\n\
+    \x07\x04\x01\x04\0\x02\x10\x02\x12\x03b\x14\x16\n#\n\x06\x04\x01\x04\0\
+    \x02\x11\x12\x03d\x04\x15\x1a\x14\x20Field\x20type\x20sint32.\n\n\x0e\n\
+    \x07\x04\x01\x04\0\x02\x11\x01\x12\x03d\x04\x0f\n\x0e\n\x07\x04\x01\x04\
+    \0\x02\x11\x02\x12\x03d\x12\x14\n#\n\x06\x04\x01\x04\0\x02\x12\x12\x03f\
+    \x04\x15\x1a\x14\x20Field\x20type\x20sint64.\n\n\x0e\n\x07\x04\x01\x04\0\
+    \x02\x12\x01\x12\x03f\x04\x0f\n\x0e\n\x07\x04\x01\x04\0\x02\x12\x02\x12\
+    \x03f\x12\x14\nC\n\x04\x04\x01\x04\x01\x12\x04j\x02s\x03\x1a5\x20Whether\
+    \x20a\x20field\x20is\x20optional,\x20required,\x20or\x20repeated.\n\n\
+    \x0c\n\x05\x04\x01\x04\x01\x01\x12\x03j\x07\x12\n5\n\x06\x04\x01\x04\x01\
+    \x02\0\x12\x03l\x04\x1c\x1a&\x20For\x20fields\x20with\x20unknown\x20card\
+    inality.\n\n\x0e\n\x07\x04\x01\x04\x01\x02\0\x01\x12\x03l\x04\x17\n\x0e\
+    \n\x07\x04\x01\x04\x01\x02\0\x02\x12\x03l\x1a\x1b\n%\n\x06\x04\x01\x04\
+    \x01\x02\x01\x12\x03n\x04\x1d\x1a\x16\x20For\x20optional\x20fields.\n\n\
+    \x0e\n\x07\x04\x01\x04\x01\x02\x01\x01\x12\x03n\x04\x18\n\x0e\n\x07\x04\
+    \x01\x04\x01\x02\x01\x02\x12\x03n\x1b\x1c\n9\n\x06\x04\x01\x04\x01\x02\
+    \x02\x12\x03p\x04\x1d\x1a*\x20For\x20required\x20fields.\x20Proto2\x20sy\
+    ntax\x20only.\n\n\x0e\n\x07\x04\x01\x04\x01\x02\x02\x01\x12\x03p\x04\x18\
+    \n\x0e\n\x07\x04\x01\x04\x01\x02\x02\x02\x12\x03p\x1b\x1c\n%\n\x06\x04\
+    \x01\x04\x01\x02\x03\x12\x03r\x04\x1d\x1a\x16\x20For\x20repeated\x20fiel\
+    ds.\n\n\x0e\n\x07\x04\x01\x04\x01\x02\x03\x01\x12\x03r\x04\x18\n\x0e\n\
+    \x07\x04\x01\x04\x01\x02\x03\x02\x12\x03r\x1b\x1c\n\x1e\n\x04\x04\x01\
+    \x02\0\x12\x03v\x02\x10\x1a\x11\x20The\x20field\x20type.\n\n\x0c\n\x05\
+    \x04\x01\x02\0\x06\x12\x03v\x02\x06\n\x0c\n\x05\x04\x01\x02\0\x01\x12\
+    \x03v\x07\x0b\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03v\x0e\x0f\n%\n\x04\
+    \x04\x01\x02\x01\x12\x03x\x02\x1e\x1a\x18\x20The\x20field\x20cardinality\
+    .\n\n\x0c\n\x05\x04\x01\x02\x01\x06\x12\x03x\x02\r\n\x0c\n\x05\x04\x01\
+    \x02\x01\x01\x12\x03x\x0e\x19\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03x\
+    \x1c\x1d\n\x20\n\x04\x04\x01\x02\x02\x12\x03z\x02\x13\x1a\x13\x20The\x20\
+    field\x20number.\n\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03z\x02\x07\n\
+    \x0c\n\x05\x04\x01\x02\x02\x01\x12\x03z\x08\x0e\n\x0c\n\x05\x04\x01\x02\
+    \x02\x03\x12\x03z\x11\x12\n\x1e\n\x04\x04\x01\x02\x03\x12\x03|\x02\x12\
+    \x1a\x11\x20The\x20field\x20name.\n\n\x0c\n\x05\x04\x01\x02\x03\x05\x12\
+    \x03|\x02\x08\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03|\t\r\n\x0c\n\x05\
+    \x04\x01\x02\x03\x03\x12\x03|\x10\x11\n\x96\x01\n\x04\x04\x01\x02\x04\
+    \x12\x03\x7f\x02\x16\x1a\x88\x01\x20The\x20field\x20type\x20URL,\x20with\
+    out\x20the\x20scheme,\x20for\x20message\x20or\x20enumeration\n\x20types.\
+    \x20Example:\x20`\"type.googleapis.com/google.protobuf.Timestamp\"`.\n\n\
+    \x0c\n\x05\x04\x01\x02\x04\x05\x12\x03\x7f\x02\x08\n\x0c\n\x05\x04\x01\
+    \x02\x04\x01\x12\x03\x7f\t\x11\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x03\
+    \x7f\x14\x15\n\xa5\x01\n\x04\x04\x01\x02\x05\x12\x04\x82\x01\x02\x18\x1a\
+    \x96\x01\x20The\x20index\x20of\x20the\x20field\x20type\x20in\x20`Type.on\
+    eofs`,\x20for\x20message\x20or\x20enumeration\n\x20types.\x20The\x20firs\
+    t\x20type\x20has\x20index\x201;\x20zero\x20means\x20the\x20type\x20is\
+    \x20not\x20in\x20the\x20list.\n\n\r\n\x05\x04\x01\x02\x05\x05\x12\x04\
+    \x82\x01\x02\x07\n\r\n\x05\x04\x01\x02\x05\x01\x12\x04\x82\x01\x08\x13\n\
+    \r\n\x05\x04\x01\x02\x05\x03\x12\x04\x82\x01\x16\x17\nF\n\x04\x04\x01\
+    \x02\x06\x12\x04\x84\x01\x02\x12\x1a8\x20Whether\x20to\x20use\x20alterna\
+    tive\x20packed\x20wire\x20representation.\n\n\r\n\x05\x04\x01\x02\x06\
+    \x05\x12\x04\x84\x01\x02\x06\n\r\n\x05\x04\x01\x02\x06\x01\x12\x04\x84\
+    \x01\x07\r\n\r\n\x05\x04\x01\x02\x06\x03\x12\x04\x84\x01\x10\x11\n,\n\
+    \x04\x04\x01\x02\x07\x12\x04\x86\x01\x02\x1e\x1a\x1e\x20The\x20protocol\
+    \x20buffer\x20options.\n\n\r\n\x05\x04\x01\x02\x07\x04\x12\x04\x86\x01\
+    \x02\n\n\r\n\x05\x04\x01\x02\x07\x06\x12\x04\x86\x01\x0b\x11\n\r\n\x05\
+    \x04\x01\x02\x07\x01\x12\x04\x86\x01\x12\x19\n\r\n\x05\x04\x01\x02\x07\
+    \x03\x12\x04\x86\x01\x1c\x1d\n$\n\x04\x04\x01\x02\x08\x12\x04\x88\x01\
+    \x02\x18\x1a\x16\x20The\x20field\x20JSON\x20name.\n\n\r\n\x05\x04\x01\
+    \x02\x08\x05\x12\x04\x88\x01\x02\x08\n\r\n\x05\x04\x01\x02\x08\x01\x12\
+    \x04\x88\x01\t\x12\n\r\n\x05\x04\x01\x02\x08\x03\x12\x04\x88\x01\x15\x17\
+    \nX\n\x04\x04\x01\x02\t\x12\x04\x8a\x01\x02\x1c\x1aJ\x20The\x20string\
+    \x20value\x20of\x20the\x20default\x20value\x20of\x20this\x20field.\x20Pr\
+    oto2\x20syntax\x20only.\n\n\r\n\x05\x04\x01\x02\t\x05\x12\x04\x8a\x01\
+    \x02\x08\n\r\n\x05\x04\x01\x02\t\x01\x12\x04\x8a\x01\t\x16\n\r\n\x05\x04\
+    \x01\x02\t\x03\x12\x04\x8a\x01\x19\x1b\n%\n\x02\x04\x02\x12\x06\x8e\x01\
+    \0\x99\x01\x01\x1a\x17\x20Enum\x20type\x20definition.\n\n\x0b\n\x03\x04\
+    \x02\x01\x12\x04\x8e\x01\x08\x0c\n\x1f\n\x04\x04\x02\x02\0\x12\x04\x90\
+    \x01\x02\x12\x1a\x11\x20Enum\x20type\x20name.\n\n\r\n\x05\x04\x02\x02\0\
+    \x05\x12\x04\x90\x01\x02\x08\n\r\n\x05\x04\x02\x02\0\x01\x12\x04\x90\x01\
+    \t\r\n\r\n\x05\x04\x02\x02\0\x03\x12\x04\x90\x01\x10\x11\n'\n\x04\x04\
+    \x02\x02\x01\x12\x04\x92\x01\x02#\x1a\x19\x20Enum\x20value\x20definition\
+    s.\n\n\r\n\x05\x04\x02\x02\x01\x04\x12\x04\x92\x01\x02\n\n\r\n\x05\x04\
+    \x02\x02\x01\x06\x12\x04\x92\x01\x0b\x14\n\r\n\x05\x04\x02\x02\x01\x01\
+    \x12\x04\x92\x01\x15\x1e\n\r\n\x05\x04\x02\x02\x01\x03\x12\x04\x92\x01!\
+    \"\n(\n\x04\x04\x02\x02\x02\x12\x04\x94\x01\x02\x1e\x1a\x1a\x20Protocol\
+    \x20buffer\x20options.\n\n\r\n\x05\x04\x02\x02\x02\x04\x12\x04\x94\x01\
+    \x02\n\n\r\n\x05\x04\x02\x02\x02\x06\x12\x04\x94\x01\x0b\x11\n\r\n\x05\
+    \x04\x02\x02\x02\x01\x12\x04\x94\x01\x12\x19\n\r\n\x05\x04\x02\x02\x02\
+    \x03\x12\x04\x94\x01\x1c\x1d\n#\n\x04\x04\x02\x02\x03\x12\x04\x96\x01\
+    \x02#\x1a\x15\x20The\x20source\x20context.\n\n\r\n\x05\x04\x02\x02\x03\
+    \x06\x12\x04\x96\x01\x02\x0f\n\r\n\x05\x04\x02\x02\x03\x01\x12\x04\x96\
+    \x01\x10\x1e\n\r\n\x05\x04\x02\x02\x03\x03\x12\x04\x96\x01!\"\n\"\n\x04\
+    \x04\x02\x02\x04\x12\x04\x98\x01\x02\x14\x1a\x14\x20The\x20source\x20syn\
+    tax.\n\n\r\n\x05\x04\x02\x02\x04\x06\x12\x04\x98\x01\x02\x08\n\r\n\x05\
+    \x04\x02\x02\x04\x01\x12\x04\x98\x01\t\x0f\n\r\n\x05\x04\x02\x02\x04\x03\
+    \x12\x04\x98\x01\x12\x13\n&\n\x02\x04\x03\x12\x06\x9c\x01\0\xa3\x01\x01\
+    \x1a\x18\x20Enum\x20value\x20definition.\n\n\x0b\n\x03\x04\x03\x01\x12\
+    \x04\x9c\x01\x08\x11\n\x20\n\x04\x04\x03\x02\0\x12\x04\x9e\x01\x02\x12\
+    \x1a\x12\x20Enum\x20value\x20name.\n\n\r\n\x05\x04\x03\x02\0\x05\x12\x04\
+    \x9e\x01\x02\x08\n\r\n\x05\x04\x03\x02\0\x01\x12\x04\x9e\x01\t\r\n\r\n\
+    \x05\x04\x03\x02\0\x03\x12\x04\x9e\x01\x10\x11\n\"\n\x04\x04\x03\x02\x01\
+    \x12\x04\xa0\x01\x02\x13\x1a\x14\x20Enum\x20value\x20number.\n\n\r\n\x05\
+    \x04\x03\x02\x01\x05\x12\x04\xa0\x01\x02\x07\n\r\n\x05\x04\x03\x02\x01\
+    \x01\x12\x04\xa0\x01\x08\x0e\n\r\n\x05\x04\x03\x02\x01\x03\x12\x04\xa0\
+    \x01\x11\x12\n(\n\x04\x04\x03\x02\x02\x12\x04\xa2\x01\x02\x1e\x1a\x1a\
+    \x20Protocol\x20buffer\x20options.\n\n\r\n\x05\x04\x03\x02\x02\x04\x12\
+    \x04\xa2\x01\x02\n\n\r\n\x05\x04\x03\x02\x02\x06\x12\x04\xa2\x01\x0b\x11\
+    \n\r\n\x05\x04\x03\x02\x02\x01\x12\x04\xa2\x01\x12\x19\n\r\n\x05\x04\x03\
+    \x02\x02\x03\x12\x04\xa2\x01\x1c\x1d\ng\n\x02\x04\x04\x12\x06\xa7\x01\0\
+    \xb2\x01\x01\x1aY\x20A\x20protocol\x20buffer\x20option,\x20which\x20can\
+    \x20be\x20attached\x20to\x20a\x20message,\x20field,\n\x20enumeration,\
+    \x20etc.\n\n\x0b\n\x03\x04\x04\x01\x12\x04\xa7\x01\x08\x0e\n\xfc\x01\n\
+    \x04\x04\x04\x02\0\x12\x04\xac\x01\x02\x12\x1a\xed\x01\x20The\x20option'\
+    s\x20name.\x20For\x20protobuf\x20built-in\x20options\x20(options\x20defi\
+    ned\x20in\n\x20descriptor.proto),\x20this\x20is\x20the\x20short\x20name.\
+    \x20For\x20example,\x20`\"map_entry\"`.\n\x20For\x20custom\x20options,\
+    \x20it\x20should\x20be\x20the\x20fully-qualified\x20name.\x20For\x20exam\
+    ple,\n\x20`\"google.api.http\"`.\n\n\r\n\x05\x04\x04\x02\0\x05\x12\x04\
+    \xac\x01\x02\x08\n\r\n\x05\x04\x04\x02\0\x01\x12\x04\xac\x01\t\r\n\r\n\
+    \x05\x04\x04\x02\0\x03\x12\x04\xac\x01\x10\x11\n\xa0\x02\n\x04\x04\x04\
+    \x02\x01\x12\x04\xb1\x01\x02\x10\x1a\x91\x02\x20The\x20option's\x20value\
+    \x20packed\x20in\x20an\x20Any\x20message.\x20If\x20the\x20value\x20is\
+    \x20a\x20primitive,\n\x20the\x20corresponding\x20wrapper\x20type\x20defi\
+    ned\x20in\x20google/protobuf/wrappers.proto\n\x20should\x20be\x20used.\
+    \x20If\x20the\x20value\x20is\x20an\x20enum,\x20it\x20should\x20be\x20sto\
+    red\x20as\x20an\x20int32\n\x20value\x20using\x20the\x20google.protobuf.I\
+    nt32Value\x20type.\n\n\r\n\x05\x04\x04\x02\x01\x06\x12\x04\xb1\x01\x02\
+    \x05\n\r\n\x05\x04\x04\x02\x01\x01\x12\x04\xb1\x01\x06\x0b\n\r\n\x05\x04\
+    \x04\x02\x01\x03\x12\x04\xb1\x01\x0e\x0f\nI\n\x02\x05\0\x12\x06\xb5\x01\
+    \0\xba\x01\x01\x1a;\x20The\x20syntax\x20in\x20which\x20a\x20protocol\x20\
+    buffer\x20element\x20is\x20defined.\n\n\x0b\n\x03\x05\0\x01\x12\x04\xb5\
+    \x01\x05\x0b\n\x20\n\x04\x05\0\x02\0\x12\x04\xb7\x01\x02\x14\x1a\x12\x20\
+    Syntax\x20`proto2`.\n\n\r\n\x05\x05\0\x02\0\x01\x12\x04\xb7\x01\x02\x0f\
+    \n\r\n\x05\x05\0\x02\0\x02\x12\x04\xb7\x01\x12\x13\n\x20\n\x04\x05\0\x02\
+    \x01\x12\x04\xb9\x01\x02\x14\x1a\x12\x20Syntax\x20`proto3`.\n\n\r\n\x05\
+    \x05\0\x02\x01\x01\x12\x04\xb9\x01\x02\x0f\n\r\n\x05\x05\0\x02\x01\x02\
+    \x12\x04\xb9\x01\x12\x13b\x06proto3\
+";
+
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
+}
+
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(2);
+            deps.push(crate::well_known_types::any::file_descriptor().clone());
+            deps.push(crate::well_known_types::source_context::file_descriptor().clone());
+            let mut messages = ::std::vec::Vec::with_capacity(5);
+            messages.push(Type::generated_message_descriptor_data());
+            messages.push(Field::generated_message_descriptor_data());
+            messages.push(Enum::generated_message_descriptor_data());
+            messages.push(EnumValue::generated_message_descriptor_data());
+            messages.push(Option::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(3);
+            enums.push(Syntax::generated_enum_descriptor_data());
+            enums.push(field::Kind::generated_enum_descriptor_data());
+            enums.push(field::Cardinality::generated_enum_descriptor_data());
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
+    })
+}
diff --git a/src/well_known_types/type_pb.rs b/src/well_known_types/type_pb.rs
deleted file mode 100644
index 14bfdb2..0000000
--- a/src/well_known_types/type_pb.rs
+++ /dev/null
@@ -1,2233 +0,0 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
-// @generated
-
-// https://github.com/rust-lang/rust-clippy/issues/702
-#![allow(unknown_lints)]
-#![allow(clippy::all)]
-
-#![allow(unused_attributes)]
-#![cfg_attr(rustfmt, rustfmt::skip)]
-
-#![allow(box_pointers)]
-#![allow(dead_code)]
-#![allow(missing_docs)]
-#![allow(non_camel_case_types)]
-#![allow(non_snake_case)]
-#![allow(non_upper_case_globals)]
-#![allow(trivial_casts)]
-#![allow(unused_imports)]
-#![allow(unused_results)]
-//! Generated file from `google/protobuf/type.proto`
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Type {
-    // message fields
-    pub name: ::std::string::String,
-    pub fields: crate::RepeatedField<Field>,
-    pub oneofs: crate::RepeatedField<::std::string::String>,
-    pub options: crate::RepeatedField<Option>,
-    pub source_context: crate::SingularPtrField<crate::well_known_types::SourceContext>,
-    pub syntax: Syntax,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Type {
-    fn default() -> &'a Type {
-        <Type as crate::Message>::default_instance()
-    }
-}
-
-impl Type {
-    pub fn new() -> Type {
-        ::std::default::Default::default()
-    }
-
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // repeated .google.protobuf.Field fields = 2;
-
-
-    pub fn get_fields(&self) -> &[Field] {
-        &self.fields
-    }
-    pub fn clear_fields(&mut self) {
-        self.fields.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_fields(&mut self, v: crate::RepeatedField<Field>) {
-        self.fields = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_fields(&mut self) -> &mut crate::RepeatedField<Field> {
-        &mut self.fields
-    }
-
-    // Take field
-    pub fn take_fields(&mut self) -> crate::RepeatedField<Field> {
-        ::std::mem::replace(&mut self.fields, crate::RepeatedField::new())
-    }
-
-    // repeated string oneofs = 3;
-
-
-    pub fn get_oneofs(&self) -> &[::std::string::String] {
-        &self.oneofs
-    }
-    pub fn clear_oneofs(&mut self) {
-        self.oneofs.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_oneofs(&mut self, v: crate::RepeatedField<::std::string::String>) {
-        self.oneofs = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_oneofs(&mut self) -> &mut crate::RepeatedField<::std::string::String> {
-        &mut self.oneofs
-    }
-
-    // Take field
-    pub fn take_oneofs(&mut self) -> crate::RepeatedField<::std::string::String> {
-        ::std::mem::replace(&mut self.oneofs, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.Option options = 4;
-
-
-    pub fn get_options(&self) -> &[Option] {
-        &self.options
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: crate::RepeatedField<Option>) {
-        self.options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_options(&mut self) -> &mut crate::RepeatedField<Option> {
-        &mut self.options
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> crate::RepeatedField<Option> {
-        ::std::mem::replace(&mut self.options, crate::RepeatedField::new())
-    }
-
-    // .google.protobuf.SourceContext source_context = 5;
-
-
-    pub fn get_source_context(&self) -> &crate::well_known_types::SourceContext {
-        self.source_context.as_ref().unwrap_or_else(|| <crate::well_known_types::SourceContext as crate::Message>::default_instance())
-    }
-    pub fn clear_source_context(&mut self) {
-        self.source_context.clear();
-    }
-
-    pub fn has_source_context(&self) -> bool {
-        self.source_context.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_source_context(&mut self, v: crate::well_known_types::SourceContext) {
-        self.source_context = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_source_context(&mut self) -> &mut crate::well_known_types::SourceContext {
-        if self.source_context.is_none() {
-            self.source_context.set_default();
-        }
-        self.source_context.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_source_context(&mut self) -> crate::well_known_types::SourceContext {
-        self.source_context.take().unwrap_or_else(|| crate::well_known_types::SourceContext::new())
-    }
-
-    // .google.protobuf.Syntax syntax = 6;
-
-
-    pub fn get_syntax(&self) -> Syntax {
-        self.syntax
-    }
-    pub fn clear_syntax(&mut self) {
-        self.syntax = Syntax::SYNTAX_PROTO2;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_syntax(&mut self, v: Syntax) {
-        self.syntax = v;
-    }
-}
-
-impl crate::Message for Type {
-    fn is_initialized(&self) -> bool {
-        for v in &self.fields {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.source_context {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.fields)?;
-                },
-                3 => {
-                    crate::rt::read_repeated_string_into(wire_type, is, &mut self.oneofs)?;
-                },
-                4 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.options)?;
-                },
-                5 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.source_context)?;
-                },
-                6 => {
-                    crate::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.syntax, 6, &mut self.unknown_fields)?
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.name.is_empty() {
-            my_size += crate::rt::string_size(1, &self.name);
-        }
-        for value in &self.fields {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        for value in &self.oneofs {
-            my_size += crate::rt::string_size(3, &value);
-        };
-        for value in &self.options {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        if let Some(ref v) = self.source_context.as_ref() {
-            let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        }
-        if self.syntax != Syntax::SYNTAX_PROTO2 {
-            my_size += crate::rt::enum_size(6, self.syntax);
-        }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if !self.name.is_empty() {
-            os.write_string(1, &self.name)?;
-        }
-        for v in &self.fields {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        for v in &self.oneofs {
-            os.write_string(3, &v)?;
-        };
-        for v in &self.options {
-            os.write_tag(4, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        if let Some(ref v) = self.source_context.as_ref() {
-            os.write_tag(5, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        }
-        if self.syntax != Syntax::SYNTAX_PROTO2 {
-            os.write_enum(6, crate::ProtobufEnum::value(&self.syntax))?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Type {
-        Type::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Type| { &m.name },
-                |m: &mut Type| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Field>>(
-                "fields",
-                |m: &Type| { &m.fields },
-                |m: &mut Type| { &mut m.fields },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "oneofs",
-                |m: &Type| { &m.oneofs },
-                |m: &mut Type| { &mut m.oneofs },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Option>>(
-                "options",
-                |m: &Type| { &m.options },
-                |m: &mut Type| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::well_known_types::SourceContext>>(
-                "source_context",
-                |m: &Type| { &m.source_context },
-                |m: &mut Type| { &mut m.source_context },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeEnum<Syntax>>(
-                "syntax",
-                |m: &Type| { &m.syntax },
-                |m: &mut Type| { &mut m.syntax },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Type>(
-                "Type",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Type {
-        static instance: crate::rt::LazyV2<Type> = crate::rt::LazyV2::INIT;
-        instance.get(Type::new)
-    }
-}
-
-impl crate::Clear for Type {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.fields.clear();
-        self.oneofs.clear();
-        self.options.clear();
-        self.source_context.clear();
-        self.syntax = Syntax::SYNTAX_PROTO2;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for Type {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for Type {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Field {
-    // message fields
-    pub kind: Field_Kind,
-    pub cardinality: Field_Cardinality,
-    pub number: i32,
-    pub name: ::std::string::String,
-    pub type_url: ::std::string::String,
-    pub oneof_index: i32,
-    pub packed: bool,
-    pub options: crate::RepeatedField<Option>,
-    pub json_name: ::std::string::String,
-    pub default_value: ::std::string::String,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Field {
-    fn default() -> &'a Field {
-        <Field as crate::Message>::default_instance()
-    }
-}
-
-impl Field {
-    pub fn new() -> Field {
-        ::std::default::Default::default()
-    }
-
-    // .google.protobuf.Field.Kind kind = 1;
-
-
-    pub fn get_kind(&self) -> Field_Kind {
-        self.kind
-    }
-    pub fn clear_kind(&mut self) {
-        self.kind = Field_Kind::TYPE_UNKNOWN;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_kind(&mut self, v: Field_Kind) {
-        self.kind = v;
-    }
-
-    // .google.protobuf.Field.Cardinality cardinality = 2;
-
-
-    pub fn get_cardinality(&self) -> Field_Cardinality {
-        self.cardinality
-    }
-    pub fn clear_cardinality(&mut self) {
-        self.cardinality = Field_Cardinality::CARDINALITY_UNKNOWN;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_cardinality(&mut self, v: Field_Cardinality) {
-        self.cardinality = v;
-    }
-
-    // int32 number = 3;
-
-
-    pub fn get_number(&self) -> i32 {
-        self.number
-    }
-    pub fn clear_number(&mut self) {
-        self.number = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_number(&mut self, v: i32) {
-        self.number = v;
-    }
-
-    // string name = 4;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // string type_url = 6;
-
-
-    pub fn get_type_url(&self) -> &str {
-        &self.type_url
-    }
-    pub fn clear_type_url(&mut self) {
-        self.type_url.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_type_url(&mut self, v: ::std::string::String) {
-        self.type_url = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_type_url(&mut self) -> &mut ::std::string::String {
-        &mut self.type_url
-    }
-
-    // Take field
-    pub fn take_type_url(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.type_url, ::std::string::String::new())
-    }
-
-    // int32 oneof_index = 7;
-
-
-    pub fn get_oneof_index(&self) -> i32 {
-        self.oneof_index
-    }
-    pub fn clear_oneof_index(&mut self) {
-        self.oneof_index = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_oneof_index(&mut self, v: i32) {
-        self.oneof_index = v;
-    }
-
-    // bool packed = 8;
-
-
-    pub fn get_packed(&self) -> bool {
-        self.packed
-    }
-    pub fn clear_packed(&mut self) {
-        self.packed = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_packed(&mut self, v: bool) {
-        self.packed = v;
-    }
-
-    // repeated .google.protobuf.Option options = 9;
-
-
-    pub fn get_options(&self) -> &[Option] {
-        &self.options
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: crate::RepeatedField<Option>) {
-        self.options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_options(&mut self) -> &mut crate::RepeatedField<Option> {
-        &mut self.options
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> crate::RepeatedField<Option> {
-        ::std::mem::replace(&mut self.options, crate::RepeatedField::new())
-    }
-
-    // string json_name = 10;
-
-
-    pub fn get_json_name(&self) -> &str {
-        &self.json_name
-    }
-    pub fn clear_json_name(&mut self) {
-        self.json_name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_json_name(&mut self, v: ::std::string::String) {
-        self.json_name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_json_name(&mut self) -> &mut ::std::string::String {
-        &mut self.json_name
-    }
-
-    // Take field
-    pub fn take_json_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.json_name, ::std::string::String::new())
-    }
-
-    // string default_value = 11;
-
-
-    pub fn get_default_value(&self) -> &str {
-        &self.default_value
-    }
-    pub fn clear_default_value(&mut self) {
-        self.default_value.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_default_value(&mut self, v: ::std::string::String) {
-        self.default_value = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_default_value(&mut self) -> &mut ::std::string::String {
-        &mut self.default_value
-    }
-
-    // Take field
-    pub fn take_default_value(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.default_value, ::std::string::String::new())
-    }
-}
-
-impl crate::Message for Field {
-    fn is_initialized(&self) -> bool {
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.kind, 1, &mut self.unknown_fields)?
-                },
-                2 => {
-                    crate::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.cardinality, 2, &mut self.unknown_fields)?
-                },
-                3 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.number = tmp;
-                },
-                4 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
-                },
-                6 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_url)?;
-                },
-                7 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.oneof_index = tmp;
-                },
-                8 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.packed = tmp;
-                },
-                9 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.options)?;
-                },
-                10 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.json_name)?;
-                },
-                11 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.default_value)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if self.kind != Field_Kind::TYPE_UNKNOWN {
-            my_size += crate::rt::enum_size(1, self.kind);
-        }
-        if self.cardinality != Field_Cardinality::CARDINALITY_UNKNOWN {
-            my_size += crate::rt::enum_size(2, self.cardinality);
-        }
-        if self.number != 0 {
-            my_size += crate::rt::value_size(3, self.number, crate::wire_format::WireTypeVarint);
-        }
-        if !self.name.is_empty() {
-            my_size += crate::rt::string_size(4, &self.name);
-        }
-        if !self.type_url.is_empty() {
-            my_size += crate::rt::string_size(6, &self.type_url);
-        }
-        if self.oneof_index != 0 {
-            my_size += crate::rt::value_size(7, self.oneof_index, crate::wire_format::WireTypeVarint);
-        }
-        if self.packed != false {
-            my_size += 2;
-        }
-        for value in &self.options {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        if !self.json_name.is_empty() {
-            my_size += crate::rt::string_size(10, &self.json_name);
-        }
-        if !self.default_value.is_empty() {
-            my_size += crate::rt::string_size(11, &self.default_value);
-        }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if self.kind != Field_Kind::TYPE_UNKNOWN {
-            os.write_enum(1, crate::ProtobufEnum::value(&self.kind))?;
-        }
-        if self.cardinality != Field_Cardinality::CARDINALITY_UNKNOWN {
-            os.write_enum(2, crate::ProtobufEnum::value(&self.cardinality))?;
-        }
-        if self.number != 0 {
-            os.write_int32(3, self.number)?;
-        }
-        if !self.name.is_empty() {
-            os.write_string(4, &self.name)?;
-        }
-        if !self.type_url.is_empty() {
-            os.write_string(6, &self.type_url)?;
-        }
-        if self.oneof_index != 0 {
-            os.write_int32(7, self.oneof_index)?;
-        }
-        if self.packed != false {
-            os.write_bool(8, self.packed)?;
-        }
-        for v in &self.options {
-            os.write_tag(9, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        if !self.json_name.is_empty() {
-            os.write_string(10, &self.json_name)?;
-        }
-        if !self.default_value.is_empty() {
-            os.write_string(11, &self.default_value)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Field {
-        Field::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeEnum<Field_Kind>>(
-                "kind",
-                |m: &Field| { &m.kind },
-                |m: &mut Field| { &mut m.kind },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeEnum<Field_Cardinality>>(
-                "cardinality",
-                |m: &Field| { &m.cardinality },
-                |m: &mut Field| { &mut m.cardinality },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "number",
-                |m: &Field| { &m.number },
-                |m: &mut Field| { &mut m.number },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Field| { &m.name },
-                |m: &mut Field| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "type_url",
-                |m: &Field| { &m.type_url },
-                |m: &mut Field| { &mut m.type_url },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "oneof_index",
-                |m: &Field| { &m.oneof_index },
-                |m: &mut Field| { &mut m.oneof_index },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeBool>(
-                "packed",
-                |m: &Field| { &m.packed },
-                |m: &mut Field| { &mut m.packed },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Option>>(
-                "options",
-                |m: &Field| { &m.options },
-                |m: &mut Field| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "json_name",
-                |m: &Field| { &m.json_name },
-                |m: &mut Field| { &mut m.json_name },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "default_value",
-                |m: &Field| { &m.default_value },
-                |m: &mut Field| { &mut m.default_value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Field>(
-                "Field",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Field {
-        static instance: crate::rt::LazyV2<Field> = crate::rt::LazyV2::INIT;
-        instance.get(Field::new)
-    }
-}
-
-impl crate::Clear for Field {
-    fn clear(&mut self) {
-        self.kind = Field_Kind::TYPE_UNKNOWN;
-        self.cardinality = Field_Cardinality::CARDINALITY_UNKNOWN;
-        self.number = 0;
-        self.name.clear();
-        self.type_url.clear();
-        self.oneof_index = 0;
-        self.packed = false;
-        self.options.clear();
-        self.json_name.clear();
-        self.default_value.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for Field {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for Field {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum Field_Kind {
-    TYPE_UNKNOWN = 0,
-    TYPE_DOUBLE = 1,
-    TYPE_FLOAT = 2,
-    TYPE_INT64 = 3,
-    TYPE_UINT64 = 4,
-    TYPE_INT32 = 5,
-    TYPE_FIXED64 = 6,
-    TYPE_FIXED32 = 7,
-    TYPE_BOOL = 8,
-    TYPE_STRING = 9,
-    TYPE_GROUP = 10,
-    TYPE_MESSAGE = 11,
-    TYPE_BYTES = 12,
-    TYPE_UINT32 = 13,
-    TYPE_ENUM = 14,
-    TYPE_SFIXED32 = 15,
-    TYPE_SFIXED64 = 16,
-    TYPE_SINT32 = 17,
-    TYPE_SINT64 = 18,
-}
-
-impl crate::ProtobufEnum for Field_Kind {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<Field_Kind> {
-        match value {
-            0 => ::std::option::Option::Some(Field_Kind::TYPE_UNKNOWN),
-            1 => ::std::option::Option::Some(Field_Kind::TYPE_DOUBLE),
-            2 => ::std::option::Option::Some(Field_Kind::TYPE_FLOAT),
-            3 => ::std::option::Option::Some(Field_Kind::TYPE_INT64),
-            4 => ::std::option::Option::Some(Field_Kind::TYPE_UINT64),
-            5 => ::std::option::Option::Some(Field_Kind::TYPE_INT32),
-            6 => ::std::option::Option::Some(Field_Kind::TYPE_FIXED64),
-            7 => ::std::option::Option::Some(Field_Kind::TYPE_FIXED32),
-            8 => ::std::option::Option::Some(Field_Kind::TYPE_BOOL),
-            9 => ::std::option::Option::Some(Field_Kind::TYPE_STRING),
-            10 => ::std::option::Option::Some(Field_Kind::TYPE_GROUP),
-            11 => ::std::option::Option::Some(Field_Kind::TYPE_MESSAGE),
-            12 => ::std::option::Option::Some(Field_Kind::TYPE_BYTES),
-            13 => ::std::option::Option::Some(Field_Kind::TYPE_UINT32),
-            14 => ::std::option::Option::Some(Field_Kind::TYPE_ENUM),
-            15 => ::std::option::Option::Some(Field_Kind::TYPE_SFIXED32),
-            16 => ::std::option::Option::Some(Field_Kind::TYPE_SFIXED64),
-            17 => ::std::option::Option::Some(Field_Kind::TYPE_SINT32),
-            18 => ::std::option::Option::Some(Field_Kind::TYPE_SINT64),
-            _ => ::std::option::Option::None
-        }
-    }
-
-    fn values() -> &'static [Self] {
-        static values: &'static [Field_Kind] = &[
-            Field_Kind::TYPE_UNKNOWN,
-            Field_Kind::TYPE_DOUBLE,
-            Field_Kind::TYPE_FLOAT,
-            Field_Kind::TYPE_INT64,
-            Field_Kind::TYPE_UINT64,
-            Field_Kind::TYPE_INT32,
-            Field_Kind::TYPE_FIXED64,
-            Field_Kind::TYPE_FIXED32,
-            Field_Kind::TYPE_BOOL,
-            Field_Kind::TYPE_STRING,
-            Field_Kind::TYPE_GROUP,
-            Field_Kind::TYPE_MESSAGE,
-            Field_Kind::TYPE_BYTES,
-            Field_Kind::TYPE_UINT32,
-            Field_Kind::TYPE_ENUM,
-            Field_Kind::TYPE_SFIXED32,
-            Field_Kind::TYPE_SFIXED64,
-            Field_Kind::TYPE_SINT32,
-            Field_Kind::TYPE_SINT64,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<Field_Kind>("Field.Kind", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for Field_Kind {
-}
-
-impl ::std::default::Default for Field_Kind {
-    fn default() -> Self {
-        Field_Kind::TYPE_UNKNOWN
-    }
-}
-
-impl crate::reflect::ProtobufValue for Field_Kind {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum Field_Cardinality {
-    CARDINALITY_UNKNOWN = 0,
-    CARDINALITY_OPTIONAL = 1,
-    CARDINALITY_REQUIRED = 2,
-    CARDINALITY_REPEATED = 3,
-}
-
-impl crate::ProtobufEnum for Field_Cardinality {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<Field_Cardinality> {
-        match value {
-            0 => ::std::option::Option::Some(Field_Cardinality::CARDINALITY_UNKNOWN),
-            1 => ::std::option::Option::Some(Field_Cardinality::CARDINALITY_OPTIONAL),
-            2 => ::std::option::Option::Some(Field_Cardinality::CARDINALITY_REQUIRED),
-            3 => ::std::option::Option::Some(Field_Cardinality::CARDINALITY_REPEATED),
-            _ => ::std::option::Option::None
-        }
-    }
-
-    fn values() -> &'static [Self] {
-        static values: &'static [Field_Cardinality] = &[
-            Field_Cardinality::CARDINALITY_UNKNOWN,
-            Field_Cardinality::CARDINALITY_OPTIONAL,
-            Field_Cardinality::CARDINALITY_REQUIRED,
-            Field_Cardinality::CARDINALITY_REPEATED,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<Field_Cardinality>("Field.Cardinality", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for Field_Cardinality {
-}
-
-impl ::std::default::Default for Field_Cardinality {
-    fn default() -> Self {
-        Field_Cardinality::CARDINALITY_UNKNOWN
-    }
-}
-
-impl crate::reflect::ProtobufValue for Field_Cardinality {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Enum {
-    // message fields
-    pub name: ::std::string::String,
-    pub enumvalue: crate::RepeatedField<EnumValue>,
-    pub options: crate::RepeatedField<Option>,
-    pub source_context: crate::SingularPtrField<crate::well_known_types::SourceContext>,
-    pub syntax: Syntax,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Enum {
-    fn default() -> &'a Enum {
-        <Enum as crate::Message>::default_instance()
-    }
-}
-
-impl Enum {
-    pub fn new() -> Enum {
-        ::std::default::Default::default()
-    }
-
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // repeated .google.protobuf.EnumValue enumvalue = 2;
-
-
-    pub fn get_enumvalue(&self) -> &[EnumValue] {
-        &self.enumvalue
-    }
-    pub fn clear_enumvalue(&mut self) {
-        self.enumvalue.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_enumvalue(&mut self, v: crate::RepeatedField<EnumValue>) {
-        self.enumvalue = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_enumvalue(&mut self) -> &mut crate::RepeatedField<EnumValue> {
-        &mut self.enumvalue
-    }
-
-    // Take field
-    pub fn take_enumvalue(&mut self) -> crate::RepeatedField<EnumValue> {
-        ::std::mem::replace(&mut self.enumvalue, crate::RepeatedField::new())
-    }
-
-    // repeated .google.protobuf.Option options = 3;
-
-
-    pub fn get_options(&self) -> &[Option] {
-        &self.options
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: crate::RepeatedField<Option>) {
-        self.options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_options(&mut self) -> &mut crate::RepeatedField<Option> {
-        &mut self.options
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> crate::RepeatedField<Option> {
-        ::std::mem::replace(&mut self.options, crate::RepeatedField::new())
-    }
-
-    // .google.protobuf.SourceContext source_context = 4;
-
-
-    pub fn get_source_context(&self) -> &crate::well_known_types::SourceContext {
-        self.source_context.as_ref().unwrap_or_else(|| <crate::well_known_types::SourceContext as crate::Message>::default_instance())
-    }
-    pub fn clear_source_context(&mut self) {
-        self.source_context.clear();
-    }
-
-    pub fn has_source_context(&self) -> bool {
-        self.source_context.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_source_context(&mut self, v: crate::well_known_types::SourceContext) {
-        self.source_context = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_source_context(&mut self) -> &mut crate::well_known_types::SourceContext {
-        if self.source_context.is_none() {
-            self.source_context.set_default();
-        }
-        self.source_context.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_source_context(&mut self) -> crate::well_known_types::SourceContext {
-        self.source_context.take().unwrap_or_else(|| crate::well_known_types::SourceContext::new())
-    }
-
-    // .google.protobuf.Syntax syntax = 5;
-
-
-    pub fn get_syntax(&self) -> Syntax {
-        self.syntax
-    }
-    pub fn clear_syntax(&mut self) {
-        self.syntax = Syntax::SYNTAX_PROTO2;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_syntax(&mut self, v: Syntax) {
-        self.syntax = v;
-    }
-}
-
-impl crate::Message for Enum {
-    fn is_initialized(&self) -> bool {
-        for v in &self.enumvalue {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.source_context {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.enumvalue)?;
-                },
-                3 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.options)?;
-                },
-                4 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.source_context)?;
-                },
-                5 => {
-                    crate::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.syntax, 5, &mut self.unknown_fields)?
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.name.is_empty() {
-            my_size += crate::rt::string_size(1, &self.name);
-        }
-        for value in &self.enumvalue {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        for value in &self.options {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        if let Some(ref v) = self.source_context.as_ref() {
-            let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        }
-        if self.syntax != Syntax::SYNTAX_PROTO2 {
-            my_size += crate::rt::enum_size(5, self.syntax);
-        }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if !self.name.is_empty() {
-            os.write_string(1, &self.name)?;
-        }
-        for v in &self.enumvalue {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        for v in &self.options {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        if let Some(ref v) = self.source_context.as_ref() {
-            os.write_tag(4, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        }
-        if self.syntax != Syntax::SYNTAX_PROTO2 {
-            os.write_enum(5, crate::ProtobufEnum::value(&self.syntax))?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Enum {
-        Enum::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Enum| { &m.name },
-                |m: &mut Enum| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<EnumValue>>(
-                "enumvalue",
-                |m: &Enum| { &m.enumvalue },
-                |m: &mut Enum| { &mut m.enumvalue },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Option>>(
-                "options",
-                |m: &Enum| { &m.options },
-                |m: &mut Enum| { &mut m.options },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::well_known_types::SourceContext>>(
-                "source_context",
-                |m: &Enum| { &m.source_context },
-                |m: &mut Enum| { &mut m.source_context },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeEnum<Syntax>>(
-                "syntax",
-                |m: &Enum| { &m.syntax },
-                |m: &mut Enum| { &mut m.syntax },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Enum>(
-                "Enum",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Enum {
-        static instance: crate::rt::LazyV2<Enum> = crate::rt::LazyV2::INIT;
-        instance.get(Enum::new)
-    }
-}
-
-impl crate::Clear for Enum {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.enumvalue.clear();
-        self.options.clear();
-        self.source_context.clear();
-        self.syntax = Syntax::SYNTAX_PROTO2;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for Enum {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for Enum {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct EnumValue {
-    // message fields
-    pub name: ::std::string::String,
-    pub number: i32,
-    pub options: crate::RepeatedField<Option>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a EnumValue {
-    fn default() -> &'a EnumValue {
-        <EnumValue as crate::Message>::default_instance()
-    }
-}
-
-impl EnumValue {
-    pub fn new() -> EnumValue {
-        ::std::default::Default::default()
-    }
-
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // int32 number = 2;
-
-
-    pub fn get_number(&self) -> i32 {
-        self.number
-    }
-    pub fn clear_number(&mut self) {
-        self.number = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_number(&mut self, v: i32) {
-        self.number = v;
-    }
-
-    // repeated .google.protobuf.Option options = 3;
-
-
-    pub fn get_options(&self) -> &[Option] {
-        &self.options
-    }
-    pub fn clear_options(&mut self) {
-        self.options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_options(&mut self, v: crate::RepeatedField<Option>) {
-        self.options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_options(&mut self) -> &mut crate::RepeatedField<Option> {
-        &mut self.options
-    }
-
-    // Take field
-    pub fn take_options(&mut self) -> crate::RepeatedField<Option> {
-        ::std::mem::replace(&mut self.options, crate::RepeatedField::new())
-    }
-}
-
-impl crate::Message for EnumValue {
-    fn is_initialized(&self) -> bool {
-        for v in &self.options {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.number = tmp;
-                },
-                3 => {
-                    crate::rt::read_repeated_message_into(wire_type, is, &mut self.options)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.name.is_empty() {
-            my_size += crate::rt::string_size(1, &self.name);
-        }
-        if self.number != 0 {
-            my_size += crate::rt::value_size(2, self.number, crate::wire_format::WireTypeVarint);
-        }
-        for value in &self.options {
-            let len = value.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        };
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if !self.name.is_empty() {
-            os.write_string(1, &self.name)?;
-        }
-        if self.number != 0 {
-            os.write_int32(2, self.number)?;
-        }
-        for v in &self.options {
-            os.write_tag(3, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> EnumValue {
-        EnumValue::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &EnumValue| { &m.name },
-                |m: &mut EnumValue| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "number",
-                |m: &EnumValue| { &m.number },
-                |m: &mut EnumValue| { &mut m.number },
-            ));
-            fields.push(crate::reflect::accessor::make_repeated_field_accessor::<_, crate::types::ProtobufTypeMessage<Option>>(
-                "options",
-                |m: &EnumValue| { &m.options },
-                |m: &mut EnumValue| { &mut m.options },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<EnumValue>(
-                "EnumValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static EnumValue {
-        static instance: crate::rt::LazyV2<EnumValue> = crate::rt::LazyV2::INIT;
-        instance.get(EnumValue::new)
-    }
-}
-
-impl crate::Clear for EnumValue {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.number = 0;
-        self.options.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for EnumValue {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for EnumValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Option {
-    // message fields
-    pub name: ::std::string::String,
-    pub value: crate::SingularPtrField<crate::well_known_types::Any>,
-    // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Option {
-    fn default() -> &'a Option {
-        <Option as crate::Message>::default_instance()
-    }
-}
-
-impl Option {
-    pub fn new() -> Option {
-        ::std::default::Default::default()
-    }
-
-    // string name = 1;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // .google.protobuf.Any value = 2;
-
-
-    pub fn get_value(&self) -> &crate::well_known_types::Any {
-        self.value.as_ref().unwrap_or_else(|| <crate::well_known_types::Any as crate::Message>::default_instance())
-    }
-    pub fn clear_value(&mut self) {
-        self.value.clear();
-    }
-
-    pub fn has_value(&self) -> bool {
-        self.value.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: crate::well_known_types::Any) {
-        self.value = crate::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_value(&mut self) -> &mut crate::well_known_types::Any {
-        if self.value.is_none() {
-            self.value.set_default();
-        }
-        self.value.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_value(&mut self) -> crate::well_known_types::Any {
-        self.value.take().unwrap_or_else(|| crate::well_known_types::Any::new())
-    }
-}
-
-impl crate::Message for Option {
-    fn is_initialized(&self) -> bool {
-        for v in &self.value {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
-                },
-                2 => {
-                    crate::rt::read_singular_message_into(wire_type, is, &mut self.value)?;
-                },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.name.is_empty() {
-            my_size += crate::rt::string_size(1, &self.name);
-        }
-        if let Some(ref v) = self.value.as_ref() {
-            let len = v.compute_size();
-            my_size += 1 + crate::rt::compute_raw_varint32_size(len) + len;
-        }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
-        if !self.name.is_empty() {
-            os.write_string(1, &self.name)?;
-        }
-        if let Some(ref v) = self.value.as_ref() {
-            os.write_tag(2, crate::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Option {
-        Option::new()
-    }
-
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "name",
-                |m: &Option| { &m.name },
-                |m: &mut Option| { &mut m.name },
-            ));
-            fields.push(crate::reflect::accessor::make_singular_ptr_field_accessor::<_, crate::types::ProtobufTypeMessage<crate::well_known_types::Any>>(
-                "value",
-                |m: &Option| { &m.value },
-                |m: &mut Option| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Option>(
-                "Option",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static Option {
-        static instance: crate::rt::LazyV2<Option> = crate::rt::LazyV2::INIT;
-        instance.get(Option::new)
-    }
-}
-
-impl crate::Clear for Option {
-    fn clear(&mut self) {
-        self.name.clear();
-        self.value.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for Option {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        crate::text_format::fmt(self, f)
-    }
-}
-
-impl crate::reflect::ProtobufValue for Option {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub enum Syntax {
-    SYNTAX_PROTO2 = 0,
-    SYNTAX_PROTO3 = 1,
-}
-
-impl crate::ProtobufEnum for Syntax {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<Syntax> {
-        match value {
-            0 => ::std::option::Option::Some(Syntax::SYNTAX_PROTO2),
-            1 => ::std::option::Option::Some(Syntax::SYNTAX_PROTO3),
-            _ => ::std::option::Option::None
-        }
-    }
-
-    fn values() -> &'static [Self] {
-        static values: &'static [Syntax] = &[
-            Syntax::SYNTAX_PROTO2,
-            Syntax::SYNTAX_PROTO3,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static crate::reflect::EnumDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::EnumDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            crate::reflect::EnumDescriptor::new_pb_name::<Syntax>("Syntax", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for Syntax {
-}
-
-impl ::std::default::Default for Syntax {
-    fn default() -> Self {
-        Syntax::SYNTAX_PROTO2
-    }
-}
-
-impl crate::reflect::ProtobufValue for Syntax {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Enum(crate::ProtobufEnum::descriptor(self))
-    }
-}
-
-static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\x1agoogle/protobuf/type.proto\x12\x0fgoogle.protobuf\x1a\x19google/pr\
-    otobuf/any.proto\x1a$google/protobuf/source_context.proto\"\x8d\x02\n\
-    \x04Type\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\x12.\n\x06fields\
-    \x18\x02\x20\x03(\x0b2\x16.google.protobuf.FieldR\x06fields\x12\x16\n\
-    \x06oneofs\x18\x03\x20\x03(\tR\x06oneofs\x121\n\x07options\x18\x04\x20\
-    \x03(\x0b2\x17.google.protobuf.OptionR\x07options\x12E\n\x0esource_conte\
-    xt\x18\x05\x20\x01(\x0b2\x1e.google.protobuf.SourceContextR\rsourceConte\
-    xt\x12/\n\x06syntax\x18\x06\x20\x01(\x0e2\x17.google.protobuf.SyntaxR\
-    \x06syntax\"\xb4\x06\n\x05Field\x12/\n\x04kind\x18\x01\x20\x01(\x0e2\x1b\
-    .google.protobuf.Field.KindR\x04kind\x12D\n\x0bcardinality\x18\x02\x20\
-    \x01(\x0e2\".google.protobuf.Field.CardinalityR\x0bcardinality\x12\x16\n\
-    \x06number\x18\x03\x20\x01(\x05R\x06number\x12\x12\n\x04name\x18\x04\x20\
-    \x01(\tR\x04name\x12\x19\n\x08type_url\x18\x06\x20\x01(\tR\x07typeUrl\
-    \x12\x1f\n\x0boneof_index\x18\x07\x20\x01(\x05R\noneofIndex\x12\x16\n\
-    \x06packed\x18\x08\x20\x01(\x08R\x06packed\x121\n\x07options\x18\t\x20\
-    \x03(\x0b2\x17.google.protobuf.OptionR\x07options\x12\x1b\n\tjson_name\
-    \x18\n\x20\x01(\tR\x08jsonName\x12#\n\rdefault_value\x18\x0b\x20\x01(\tR\
-    \x0cdefaultValue\"\xc8\x02\n\x04Kind\x12\x10\n\x0cTYPE_UNKNOWN\x10\0\x12\
-    \x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nT\
-    YPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\
-    \x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\
-    \x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\
-    \nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYT\
-    ES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\
-    \x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\
-    \x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"t\n\x0bCardina\
-    lity\x12\x17\n\x13CARDINALITY_UNKNOWN\x10\0\x12\x18\n\x14CARDINALITY_OPT\
-    IONAL\x10\x01\x12\x18\n\x14CARDINALITY_REQUIRED\x10\x02\x12\x18\n\x14CAR\
-    DINALITY_REPEATED\x10\x03\"\xff\x01\n\x04Enum\x12\x12\n\x04name\x18\x01\
-    \x20\x01(\tR\x04name\x128\n\tenumvalue\x18\x02\x20\x03(\x0b2\x1a.google.\
-    protobuf.EnumValueR\tenumvalue\x121\n\x07options\x18\x03\x20\x03(\x0b2\
-    \x17.google.protobuf.OptionR\x07options\x12E\n\x0esource_context\x18\x04\
-    \x20\x01(\x0b2\x1e.google.protobuf.SourceContextR\rsourceContext\x12/\n\
-    \x06syntax\x18\x05\x20\x01(\x0e2\x17.google.protobuf.SyntaxR\x06syntax\"\
-    j\n\tEnumValue\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\x12\x16\n\
-    \x06number\x18\x02\x20\x01(\x05R\x06number\x121\n\x07options\x18\x03\x20\
-    \x03(\x0b2\x17.google.protobuf.OptionR\x07options\"H\n\x06Option\x12\x12\
-    \n\x04name\x18\x01\x20\x01(\tR\x04name\x12*\n\x05value\x18\x02\x20\x01(\
-    \x0b2\x14.google.protobuf.AnyR\x05value*.\n\x06Syntax\x12\x11\n\rSYNTAX_\
-    PROTO2\x10\0\x12\x11\n\rSYNTAX_PROTO3\x10\x01B{\n\x13com.google.protobuf\
-    B\tTypeProtoP\x01Z-google.golang.org/protobuf/types/known/typepb\xf8\x01\
-    \x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesJ\xc38\n\
-    \x07\x12\x05\x1e\0\xba\x01\x01\n\xcc\x0c\n\x01\x0c\x12\x03\x1e\0\x122\
-    \xc1\x0c\x20Protocol\x20Buffers\x20-\x20Google's\x20data\x20interchange\
-    \x20format\n\x20Copyright\x202008\x20Google\x20Inc.\x20\x20All\x20rights\
-    \x20reserved.\n\x20https://developers.google.com/protocol-buffers/\n\n\
-    \x20Redistribution\x20and\x20use\x20in\x20source\x20and\x20binary\x20for\
-    ms,\x20with\x20or\x20without\n\x20modification,\x20are\x20permitted\x20p\
-    rovided\x20that\x20the\x20following\x20conditions\x20are\n\x20met:\n\n\
-    \x20\x20\x20\x20\x20*\x20Redistributions\x20of\x20source\x20code\x20must\
-    \x20retain\x20the\x20above\x20copyright\n\x20notice,\x20this\x20list\x20\
-    of\x20conditions\x20and\x20the\x20following\x20disclaimer.\n\x20\x20\x20\
-    \x20\x20*\x20Redistributions\x20in\x20binary\x20form\x20must\x20reproduc\
-    e\x20the\x20above\n\x20copyright\x20notice,\x20this\x20list\x20of\x20con\
-    ditions\x20and\x20the\x20following\x20disclaimer\n\x20in\x20the\x20docum\
-    entation\x20and/or\x20other\x20materials\x20provided\x20with\x20the\n\
-    \x20distribution.\n\x20\x20\x20\x20\x20*\x20Neither\x20the\x20name\x20of\
-    \x20Google\x20Inc.\x20nor\x20the\x20names\x20of\x20its\n\x20contributors\
-    \x20may\x20be\x20used\x20to\x20endorse\x20or\x20promote\x20products\x20d\
-    erived\x20from\n\x20this\x20software\x20without\x20specific\x20prior\x20\
-    written\x20permission.\n\n\x20THIS\x20SOFTWARE\x20IS\x20PROVIDED\x20BY\
-    \x20THE\x20COPYRIGHT\x20HOLDERS\x20AND\x20CONTRIBUTORS\n\x20\"AS\x20IS\"\
-    \x20AND\x20ANY\x20EXPRESS\x20OR\x20IMPLIED\x20WARRANTIES,\x20INCLUDING,\
-    \x20BUT\x20NOT\n\x20LIMITED\x20TO,\x20THE\x20IMPLIED\x20WARRANTIES\x20OF\
-    \x20MERCHANTABILITY\x20AND\x20FITNESS\x20FOR\n\x20A\x20PARTICULAR\x20PUR\
-    POSE\x20ARE\x20DISCLAIMED.\x20IN\x20NO\x20EVENT\x20SHALL\x20THE\x20COPYR\
-    IGHT\n\x20OWNER\x20OR\x20CONTRIBUTORS\x20BE\x20LIABLE\x20FOR\x20ANY\x20D\
-    IRECT,\x20INDIRECT,\x20INCIDENTAL,\n\x20SPECIAL,\x20EXEMPLARY,\x20OR\x20\
-    CONSEQUENTIAL\x20DAMAGES\x20(INCLUDING,\x20BUT\x20NOT\n\x20LIMITED\x20TO\
-    ,\x20PROCUREMENT\x20OF\x20SUBSTITUTE\x20GOODS\x20OR\x20SERVICES;\x20LOSS\
-    \x20OF\x20USE,\n\x20DATA,\x20OR\x20PROFITS;\x20OR\x20BUSINESS\x20INTERRU\
-    PTION)\x20HOWEVER\x20CAUSED\x20AND\x20ON\x20ANY\n\x20THEORY\x20OF\x20LIA\
-    BILITY,\x20WHETHER\x20IN\x20CONTRACT,\x20STRICT\x20LIABILITY,\x20OR\x20T\
-    ORT\n\x20(INCLUDING\x20NEGLIGENCE\x20OR\x20OTHERWISE)\x20ARISING\x20IN\
-    \x20ANY\x20WAY\x20OUT\x20OF\x20THE\x20USE\n\x20OF\x20THIS\x20SOFTWARE,\
-    \x20EVEN\x20IF\x20ADVISED\x20OF\x20THE\x20POSSIBILITY\x20OF\x20SUCH\x20D\
-    AMAGE.\n\n\x08\n\x01\x02\x12\x03\x20\0\x18\n\t\n\x02\x03\0\x12\x03\"\0#\
-    \n\t\n\x02\x03\x01\x12\x03#\0.\n\x08\n\x01\x08\x12\x03%\0;\n\t\n\x02\x08\
-    %\x12\x03%\0;\n\x08\n\x01\x08\x12\x03&\0\x1f\n\t\n\x02\x08\x1f\x12\x03&\
-    \0\x1f\n\x08\n\x01\x08\x12\x03'\0,\n\t\n\x02\x08\x01\x12\x03'\0,\n\x08\n\
-    \x01\x08\x12\x03(\0*\n\t\n\x02\x08\x08\x12\x03(\0*\n\x08\n\x01\x08\x12\
-    \x03)\0\"\n\t\n\x02\x08\n\x12\x03)\0\"\n\x08\n\x01\x08\x12\x03*\0!\n\t\n\
-    \x02\x08$\x12\x03*\0!\n\x08\n\x01\x08\x12\x03+\0D\n\t\n\x02\x08\x0b\x12\
-    \x03+\0D\n-\n\x02\x04\0\x12\x04.\0;\x01\x1a!\x20A\x20protocol\x20buffer\
-    \x20message\x20type.\n\n\n\n\x03\x04\0\x01\x12\x03.\x08\x0c\n0\n\x04\x04\
-    \0\x02\0\x12\x030\x02\x12\x1a#\x20The\x20fully\x20qualified\x20message\
-    \x20name.\n\n\x0c\n\x05\x04\0\x02\0\x05\x12\x030\x02\x08\n\x0c\n\x05\x04\
-    \0\x02\0\x01\x12\x030\t\r\n\x0c\n\x05\x04\0\x02\0\x03\x12\x030\x10\x11\n\
-    \"\n\x04\x04\0\x02\x01\x12\x032\x02\x1c\x1a\x15\x20The\x20list\x20of\x20\
-    fields.\n\n\x0c\n\x05\x04\0\x02\x01\x04\x12\x032\x02\n\n\x0c\n\x05\x04\0\
-    \x02\x01\x06\x12\x032\x0b\x10\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x032\x11\
-    \x17\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x032\x1a\x1b\nO\n\x04\x04\0\x02\
-    \x02\x12\x034\x02\x1d\x1aB\x20The\x20list\x20of\x20types\x20appearing\
-    \x20in\x20`oneof`\x20definitions\x20in\x20this\x20type.\n\n\x0c\n\x05\
-    \x04\0\x02\x02\x04\x12\x034\x02\n\n\x0c\n\x05\x04\0\x02\x02\x05\x12\x034\
-    \x0b\x11\n\x0c\n\x05\x04\0\x02\x02\x01\x12\x034\x12\x18\n\x0c\n\x05\x04\
-    \0\x02\x02\x03\x12\x034\x1b\x1c\n+\n\x04\x04\0\x02\x03\x12\x036\x02\x1e\
-    \x1a\x1e\x20The\x20protocol\x20buffer\x20options.\n\n\x0c\n\x05\x04\0\
-    \x02\x03\x04\x12\x036\x02\n\n\x0c\n\x05\x04\0\x02\x03\x06\x12\x036\x0b\
-    \x11\n\x0c\n\x05\x04\0\x02\x03\x01\x12\x036\x12\x19\n\x0c\n\x05\x04\0\
-    \x02\x03\x03\x12\x036\x1c\x1d\n\"\n\x04\x04\0\x02\x04\x12\x038\x02#\x1a\
-    \x15\x20The\x20source\x20context.\n\n\x0c\n\x05\x04\0\x02\x04\x06\x12\
-    \x038\x02\x0f\n\x0c\n\x05\x04\0\x02\x04\x01\x12\x038\x10\x1e\n\x0c\n\x05\
-    \x04\0\x02\x04\x03\x12\x038!\"\n!\n\x04\x04\0\x02\x05\x12\x03:\x02\x14\
-    \x1a\x14\x20The\x20source\x20syntax.\n\n\x0c\n\x05\x04\0\x02\x05\x06\x12\
-    \x03:\x02\x08\n\x0c\n\x05\x04\0\x02\x05\x01\x12\x03:\t\x0f\n\x0c\n\x05\
-    \x04\0\x02\x05\x03\x12\x03:\x12\x13\n0\n\x02\x04\x01\x12\x05>\0\x8b\x01\
-    \x01\x1a#\x20A\x20single\x20field\x20of\x20a\x20message\x20type.\n\n\n\n\
-    \x03\x04\x01\x01\x12\x03>\x08\r\n\"\n\x04\x04\x01\x04\0\x12\x04@\x02g\
-    \x03\x1a\x14\x20Basic\x20field\x20types.\n\n\x0c\n\x05\x04\x01\x04\0\x01\
-    \x12\x03@\x07\x0b\n$\n\x06\x04\x01\x04\0\x02\0\x12\x03B\x04\x15\x1a\x15\
-    \x20Field\x20type\x20unknown.\n\n\x0e\n\x07\x04\x01\x04\0\x02\0\x01\x12\
-    \x03B\x04\x10\n\x0e\n\x07\x04\x01\x04\0\x02\0\x02\x12\x03B\x13\x14\n#\n\
-    \x06\x04\x01\x04\0\x02\x01\x12\x03D\x04\x14\x1a\x14\x20Field\x20type\x20\
-    double.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x01\x01\x12\x03D\x04\x0f\n\x0e\n\
-    \x07\x04\x01\x04\0\x02\x01\x02\x12\x03D\x12\x13\n\"\n\x06\x04\x01\x04\0\
-    \x02\x02\x12\x03F\x04\x13\x1a\x13\x20Field\x20type\x20float.\n\n\x0e\n\
-    \x07\x04\x01\x04\0\x02\x02\x01\x12\x03F\x04\x0e\n\x0e\n\x07\x04\x01\x04\
-    \0\x02\x02\x02\x12\x03F\x11\x12\n\"\n\x06\x04\x01\x04\0\x02\x03\x12\x03H\
-    \x04\x13\x1a\x13\x20Field\x20type\x20int64.\n\n\x0e\n\x07\x04\x01\x04\0\
-    \x02\x03\x01\x12\x03H\x04\x0e\n\x0e\n\x07\x04\x01\x04\0\x02\x03\x02\x12\
-    \x03H\x11\x12\n#\n\x06\x04\x01\x04\0\x02\x04\x12\x03J\x04\x14\x1a\x14\
-    \x20Field\x20type\x20uint64.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x04\x01\x12\
-    \x03J\x04\x0f\n\x0e\n\x07\x04\x01\x04\0\x02\x04\x02\x12\x03J\x12\x13\n\"\
-    \n\x06\x04\x01\x04\0\x02\x05\x12\x03L\x04\x13\x1a\x13\x20Field\x20type\
-    \x20int32.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x05\x01\x12\x03L\x04\x0e\n\
-    \x0e\n\x07\x04\x01\x04\0\x02\x05\x02\x12\x03L\x11\x12\n$\n\x06\x04\x01\
-    \x04\0\x02\x06\x12\x03N\x04\x15\x1a\x15\x20Field\x20type\x20fixed64.\n\n\
-    \x0e\n\x07\x04\x01\x04\0\x02\x06\x01\x12\x03N\x04\x10\n\x0e\n\x07\x04\
-    \x01\x04\0\x02\x06\x02\x12\x03N\x13\x14\n$\n\x06\x04\x01\x04\0\x02\x07\
-    \x12\x03P\x04\x15\x1a\x15\x20Field\x20type\x20fixed32.\n\n\x0e\n\x07\x04\
-    \x01\x04\0\x02\x07\x01\x12\x03P\x04\x10\n\x0e\n\x07\x04\x01\x04\0\x02\
-    \x07\x02\x12\x03P\x13\x14\n!\n\x06\x04\x01\x04\0\x02\x08\x12\x03R\x04\
-    \x12\x1a\x12\x20Field\x20type\x20bool.\n\n\x0e\n\x07\x04\x01\x04\0\x02\
-    \x08\x01\x12\x03R\x04\r\n\x0e\n\x07\x04\x01\x04\0\x02\x08\x02\x12\x03R\
-    \x10\x11\n#\n\x06\x04\x01\x04\0\x02\t\x12\x03T\x04\x14\x1a\x14\x20Field\
-    \x20type\x20string.\n\n\x0e\n\x07\x04\x01\x04\0\x02\t\x01\x12\x03T\x04\
-    \x0f\n\x0e\n\x07\x04\x01\x04\0\x02\t\x02\x12\x03T\x12\x13\nF\n\x06\x04\
-    \x01\x04\0\x02\n\x12\x03V\x04\x14\x1a7\x20Field\x20type\x20group.\x20Pro\
-    to2\x20syntax\x20only,\x20and\x20deprecated.\n\n\x0e\n\x07\x04\x01\x04\0\
-    \x02\n\x01\x12\x03V\x04\x0e\n\x0e\n\x07\x04\x01\x04\0\x02\n\x02\x12\x03V\
-    \x11\x13\n$\n\x06\x04\x01\x04\0\x02\x0b\x12\x03X\x04\x16\x1a\x15\x20Fiel\
-    d\x20type\x20message.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x0b\x01\x12\x03X\
-    \x04\x10\n\x0e\n\x07\x04\x01\x04\0\x02\x0b\x02\x12\x03X\x13\x15\n\"\n\
-    \x06\x04\x01\x04\0\x02\x0c\x12\x03Z\x04\x14\x1a\x13\x20Field\x20type\x20\
-    bytes.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x0c\x01\x12\x03Z\x04\x0e\n\x0e\n\
-    \x07\x04\x01\x04\0\x02\x0c\x02\x12\x03Z\x11\x13\n#\n\x06\x04\x01\x04\0\
-    \x02\r\x12\x03\\\x04\x15\x1a\x14\x20Field\x20type\x20uint32.\n\n\x0e\n\
-    \x07\x04\x01\x04\0\x02\r\x01\x12\x03\\\x04\x0f\n\x0e\n\x07\x04\x01\x04\0\
-    \x02\r\x02\x12\x03\\\x12\x14\n!\n\x06\x04\x01\x04\0\x02\x0e\x12\x03^\x04\
-    \x13\x1a\x12\x20Field\x20type\x20enum.\n\n\x0e\n\x07\x04\x01\x04\0\x02\
-    \x0e\x01\x12\x03^\x04\r\n\x0e\n\x07\x04\x01\x04\0\x02\x0e\x02\x12\x03^\
-    \x10\x12\n%\n\x06\x04\x01\x04\0\x02\x0f\x12\x03`\x04\x17\x1a\x16\x20Fiel\
-    d\x20type\x20sfixed32.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x0f\x01\x12\x03`\
-    \x04\x11\n\x0e\n\x07\x04\x01\x04\0\x02\x0f\x02\x12\x03`\x14\x16\n%\n\x06\
-    \x04\x01\x04\0\x02\x10\x12\x03b\x04\x17\x1a\x16\x20Field\x20type\x20sfix\
-    ed64.\n\n\x0e\n\x07\x04\x01\x04\0\x02\x10\x01\x12\x03b\x04\x11\n\x0e\n\
-    \x07\x04\x01\x04\0\x02\x10\x02\x12\x03b\x14\x16\n#\n\x06\x04\x01\x04\0\
-    \x02\x11\x12\x03d\x04\x15\x1a\x14\x20Field\x20type\x20sint32.\n\n\x0e\n\
-    \x07\x04\x01\x04\0\x02\x11\x01\x12\x03d\x04\x0f\n\x0e\n\x07\x04\x01\x04\
-    \0\x02\x11\x02\x12\x03d\x12\x14\n#\n\x06\x04\x01\x04\0\x02\x12\x12\x03f\
-    \x04\x15\x1a\x14\x20Field\x20type\x20sint64.\n\n\x0e\n\x07\x04\x01\x04\0\
-    \x02\x12\x01\x12\x03f\x04\x0f\n\x0e\n\x07\x04\x01\x04\0\x02\x12\x02\x12\
-    \x03f\x12\x14\nC\n\x04\x04\x01\x04\x01\x12\x04j\x02s\x03\x1a5\x20Whether\
-    \x20a\x20field\x20is\x20optional,\x20required,\x20or\x20repeated.\n\n\
-    \x0c\n\x05\x04\x01\x04\x01\x01\x12\x03j\x07\x12\n5\n\x06\x04\x01\x04\x01\
-    \x02\0\x12\x03l\x04\x1c\x1a&\x20For\x20fields\x20with\x20unknown\x20card\
-    inality.\n\n\x0e\n\x07\x04\x01\x04\x01\x02\0\x01\x12\x03l\x04\x17\n\x0e\
-    \n\x07\x04\x01\x04\x01\x02\0\x02\x12\x03l\x1a\x1b\n%\n\x06\x04\x01\x04\
-    \x01\x02\x01\x12\x03n\x04\x1d\x1a\x16\x20For\x20optional\x20fields.\n\n\
-    \x0e\n\x07\x04\x01\x04\x01\x02\x01\x01\x12\x03n\x04\x18\n\x0e\n\x07\x04\
-    \x01\x04\x01\x02\x01\x02\x12\x03n\x1b\x1c\n9\n\x06\x04\x01\x04\x01\x02\
-    \x02\x12\x03p\x04\x1d\x1a*\x20For\x20required\x20fields.\x20Proto2\x20sy\
-    ntax\x20only.\n\n\x0e\n\x07\x04\x01\x04\x01\x02\x02\x01\x12\x03p\x04\x18\
-    \n\x0e\n\x07\x04\x01\x04\x01\x02\x02\x02\x12\x03p\x1b\x1c\n%\n\x06\x04\
-    \x01\x04\x01\x02\x03\x12\x03r\x04\x1d\x1a\x16\x20For\x20repeated\x20fiel\
-    ds.\n\n\x0e\n\x07\x04\x01\x04\x01\x02\x03\x01\x12\x03r\x04\x18\n\x0e\n\
-    \x07\x04\x01\x04\x01\x02\x03\x02\x12\x03r\x1b\x1c\n\x1e\n\x04\x04\x01\
-    \x02\0\x12\x03v\x02\x10\x1a\x11\x20The\x20field\x20type.\n\n\x0c\n\x05\
-    \x04\x01\x02\0\x06\x12\x03v\x02\x06\n\x0c\n\x05\x04\x01\x02\0\x01\x12\
-    \x03v\x07\x0b\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03v\x0e\x0f\n%\n\x04\
-    \x04\x01\x02\x01\x12\x03x\x02\x1e\x1a\x18\x20The\x20field\x20cardinality\
-    .\n\n\x0c\n\x05\x04\x01\x02\x01\x06\x12\x03x\x02\r\n\x0c\n\x05\x04\x01\
-    \x02\x01\x01\x12\x03x\x0e\x19\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03x\
-    \x1c\x1d\n\x20\n\x04\x04\x01\x02\x02\x12\x03z\x02\x13\x1a\x13\x20The\x20\
-    field\x20number.\n\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03z\x02\x07\n\
-    \x0c\n\x05\x04\x01\x02\x02\x01\x12\x03z\x08\x0e\n\x0c\n\x05\x04\x01\x02\
-    \x02\x03\x12\x03z\x11\x12\n\x1e\n\x04\x04\x01\x02\x03\x12\x03|\x02\x12\
-    \x1a\x11\x20The\x20field\x20name.\n\n\x0c\n\x05\x04\x01\x02\x03\x05\x12\
-    \x03|\x02\x08\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03|\t\r\n\x0c\n\x05\
-    \x04\x01\x02\x03\x03\x12\x03|\x10\x11\n\x96\x01\n\x04\x04\x01\x02\x04\
-    \x12\x03\x7f\x02\x16\x1a\x88\x01\x20The\x20field\x20type\x20URL,\x20with\
-    out\x20the\x20scheme,\x20for\x20message\x20or\x20enumeration\n\x20types.\
-    \x20Example:\x20`\"type.googleapis.com/google.protobuf.Timestamp\"`.\n\n\
-    \x0c\n\x05\x04\x01\x02\x04\x05\x12\x03\x7f\x02\x08\n\x0c\n\x05\x04\x01\
-    \x02\x04\x01\x12\x03\x7f\t\x11\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x03\
-    \x7f\x14\x15\n\xa5\x01\n\x04\x04\x01\x02\x05\x12\x04\x82\x01\x02\x18\x1a\
-    \x96\x01\x20The\x20index\x20of\x20the\x20field\x20type\x20in\x20`Type.on\
-    eofs`,\x20for\x20message\x20or\x20enumeration\n\x20types.\x20The\x20firs\
-    t\x20type\x20has\x20index\x201;\x20zero\x20means\x20the\x20type\x20is\
-    \x20not\x20in\x20the\x20list.\n\n\r\n\x05\x04\x01\x02\x05\x05\x12\x04\
-    \x82\x01\x02\x07\n\r\n\x05\x04\x01\x02\x05\x01\x12\x04\x82\x01\x08\x13\n\
-    \r\n\x05\x04\x01\x02\x05\x03\x12\x04\x82\x01\x16\x17\nF\n\x04\x04\x01\
-    \x02\x06\x12\x04\x84\x01\x02\x12\x1a8\x20Whether\x20to\x20use\x20alterna\
-    tive\x20packed\x20wire\x20representation.\n\n\r\n\x05\x04\x01\x02\x06\
-    \x05\x12\x04\x84\x01\x02\x06\n\r\n\x05\x04\x01\x02\x06\x01\x12\x04\x84\
-    \x01\x07\r\n\r\n\x05\x04\x01\x02\x06\x03\x12\x04\x84\x01\x10\x11\n,\n\
-    \x04\x04\x01\x02\x07\x12\x04\x86\x01\x02\x1e\x1a\x1e\x20The\x20protocol\
-    \x20buffer\x20options.\n\n\r\n\x05\x04\x01\x02\x07\x04\x12\x04\x86\x01\
-    \x02\n\n\r\n\x05\x04\x01\x02\x07\x06\x12\x04\x86\x01\x0b\x11\n\r\n\x05\
-    \x04\x01\x02\x07\x01\x12\x04\x86\x01\x12\x19\n\r\n\x05\x04\x01\x02\x07\
-    \x03\x12\x04\x86\x01\x1c\x1d\n$\n\x04\x04\x01\x02\x08\x12\x04\x88\x01\
-    \x02\x18\x1a\x16\x20The\x20field\x20JSON\x20name.\n\n\r\n\x05\x04\x01\
-    \x02\x08\x05\x12\x04\x88\x01\x02\x08\n\r\n\x05\x04\x01\x02\x08\x01\x12\
-    \x04\x88\x01\t\x12\n\r\n\x05\x04\x01\x02\x08\x03\x12\x04\x88\x01\x15\x17\
-    \nX\n\x04\x04\x01\x02\t\x12\x04\x8a\x01\x02\x1c\x1aJ\x20The\x20string\
-    \x20value\x20of\x20the\x20default\x20value\x20of\x20this\x20field.\x20Pr\
-    oto2\x20syntax\x20only.\n\n\r\n\x05\x04\x01\x02\t\x05\x12\x04\x8a\x01\
-    \x02\x08\n\r\n\x05\x04\x01\x02\t\x01\x12\x04\x8a\x01\t\x16\n\r\n\x05\x04\
-    \x01\x02\t\x03\x12\x04\x8a\x01\x19\x1b\n%\n\x02\x04\x02\x12\x06\x8e\x01\
-    \0\x99\x01\x01\x1a\x17\x20Enum\x20type\x20definition.\n\n\x0b\n\x03\x04\
-    \x02\x01\x12\x04\x8e\x01\x08\x0c\n\x1f\n\x04\x04\x02\x02\0\x12\x04\x90\
-    \x01\x02\x12\x1a\x11\x20Enum\x20type\x20name.\n\n\r\n\x05\x04\x02\x02\0\
-    \x05\x12\x04\x90\x01\x02\x08\n\r\n\x05\x04\x02\x02\0\x01\x12\x04\x90\x01\
-    \t\r\n\r\n\x05\x04\x02\x02\0\x03\x12\x04\x90\x01\x10\x11\n'\n\x04\x04\
-    \x02\x02\x01\x12\x04\x92\x01\x02#\x1a\x19\x20Enum\x20value\x20definition\
-    s.\n\n\r\n\x05\x04\x02\x02\x01\x04\x12\x04\x92\x01\x02\n\n\r\n\x05\x04\
-    \x02\x02\x01\x06\x12\x04\x92\x01\x0b\x14\n\r\n\x05\x04\x02\x02\x01\x01\
-    \x12\x04\x92\x01\x15\x1e\n\r\n\x05\x04\x02\x02\x01\x03\x12\x04\x92\x01!\
-    \"\n(\n\x04\x04\x02\x02\x02\x12\x04\x94\x01\x02\x1e\x1a\x1a\x20Protocol\
-    \x20buffer\x20options.\n\n\r\n\x05\x04\x02\x02\x02\x04\x12\x04\x94\x01\
-    \x02\n\n\r\n\x05\x04\x02\x02\x02\x06\x12\x04\x94\x01\x0b\x11\n\r\n\x05\
-    \x04\x02\x02\x02\x01\x12\x04\x94\x01\x12\x19\n\r\n\x05\x04\x02\x02\x02\
-    \x03\x12\x04\x94\x01\x1c\x1d\n#\n\x04\x04\x02\x02\x03\x12\x04\x96\x01\
-    \x02#\x1a\x15\x20The\x20source\x20context.\n\n\r\n\x05\x04\x02\x02\x03\
-    \x06\x12\x04\x96\x01\x02\x0f\n\r\n\x05\x04\x02\x02\x03\x01\x12\x04\x96\
-    \x01\x10\x1e\n\r\n\x05\x04\x02\x02\x03\x03\x12\x04\x96\x01!\"\n\"\n\x04\
-    \x04\x02\x02\x04\x12\x04\x98\x01\x02\x14\x1a\x14\x20The\x20source\x20syn\
-    tax.\n\n\r\n\x05\x04\x02\x02\x04\x06\x12\x04\x98\x01\x02\x08\n\r\n\x05\
-    \x04\x02\x02\x04\x01\x12\x04\x98\x01\t\x0f\n\r\n\x05\x04\x02\x02\x04\x03\
-    \x12\x04\x98\x01\x12\x13\n&\n\x02\x04\x03\x12\x06\x9c\x01\0\xa3\x01\x01\
-    \x1a\x18\x20Enum\x20value\x20definition.\n\n\x0b\n\x03\x04\x03\x01\x12\
-    \x04\x9c\x01\x08\x11\n\x20\n\x04\x04\x03\x02\0\x12\x04\x9e\x01\x02\x12\
-    \x1a\x12\x20Enum\x20value\x20name.\n\n\r\n\x05\x04\x03\x02\0\x05\x12\x04\
-    \x9e\x01\x02\x08\n\r\n\x05\x04\x03\x02\0\x01\x12\x04\x9e\x01\t\r\n\r\n\
-    \x05\x04\x03\x02\0\x03\x12\x04\x9e\x01\x10\x11\n\"\n\x04\x04\x03\x02\x01\
-    \x12\x04\xa0\x01\x02\x13\x1a\x14\x20Enum\x20value\x20number.\n\n\r\n\x05\
-    \x04\x03\x02\x01\x05\x12\x04\xa0\x01\x02\x07\n\r\n\x05\x04\x03\x02\x01\
-    \x01\x12\x04\xa0\x01\x08\x0e\n\r\n\x05\x04\x03\x02\x01\x03\x12\x04\xa0\
-    \x01\x11\x12\n(\n\x04\x04\x03\x02\x02\x12\x04\xa2\x01\x02\x1e\x1a\x1a\
-    \x20Protocol\x20buffer\x20options.\n\n\r\n\x05\x04\x03\x02\x02\x04\x12\
-    \x04\xa2\x01\x02\n\n\r\n\x05\x04\x03\x02\x02\x06\x12\x04\xa2\x01\x0b\x11\
-    \n\r\n\x05\x04\x03\x02\x02\x01\x12\x04\xa2\x01\x12\x19\n\r\n\x05\x04\x03\
-    \x02\x02\x03\x12\x04\xa2\x01\x1c\x1d\ng\n\x02\x04\x04\x12\x06\xa7\x01\0\
-    \xb2\x01\x01\x1aY\x20A\x20protocol\x20buffer\x20option,\x20which\x20can\
-    \x20be\x20attached\x20to\x20a\x20message,\x20field,\n\x20enumeration,\
-    \x20etc.\n\n\x0b\n\x03\x04\x04\x01\x12\x04\xa7\x01\x08\x0e\n\xfc\x01\n\
-    \x04\x04\x04\x02\0\x12\x04\xac\x01\x02\x12\x1a\xed\x01\x20The\x20option'\
-    s\x20name.\x20For\x20protobuf\x20built-in\x20options\x20(options\x20defi\
-    ned\x20in\n\x20descriptor.proto),\x20this\x20is\x20the\x20short\x20name.\
-    \x20For\x20example,\x20`\"map_entry\"`.\n\x20For\x20custom\x20options,\
-    \x20it\x20should\x20be\x20the\x20fully-qualified\x20name.\x20For\x20exam\
-    ple,\n\x20`\"google.api.http\"`.\n\n\r\n\x05\x04\x04\x02\0\x05\x12\x04\
-    \xac\x01\x02\x08\n\r\n\x05\x04\x04\x02\0\x01\x12\x04\xac\x01\t\r\n\r\n\
-    \x05\x04\x04\x02\0\x03\x12\x04\xac\x01\x10\x11\n\xa0\x02\n\x04\x04\x04\
-    \x02\x01\x12\x04\xb1\x01\x02\x10\x1a\x91\x02\x20The\x20option's\x20value\
-    \x20packed\x20in\x20an\x20Any\x20message.\x20If\x20the\x20value\x20is\
-    \x20a\x20primitive,\n\x20the\x20corresponding\x20wrapper\x20type\x20defi\
-    ned\x20in\x20google/protobuf/wrappers.proto\n\x20should\x20be\x20used.\
-    \x20If\x20the\x20value\x20is\x20an\x20enum,\x20it\x20should\x20be\x20sto\
-    red\x20as\x20an\x20int32\n\x20value\x20using\x20the\x20google.protobuf.I\
-    nt32Value\x20type.\n\n\r\n\x05\x04\x04\x02\x01\x06\x12\x04\xb1\x01\x02\
-    \x05\n\r\n\x05\x04\x04\x02\x01\x01\x12\x04\xb1\x01\x06\x0b\n\r\n\x05\x04\
-    \x04\x02\x01\x03\x12\x04\xb1\x01\x0e\x0f\nI\n\x02\x05\0\x12\x06\xb5\x01\
-    \0\xba\x01\x01\x1a;\x20The\x20syntax\x20in\x20which\x20a\x20protocol\x20\
-    buffer\x20element\x20is\x20defined.\n\n\x0b\n\x03\x05\0\x01\x12\x04\xb5\
-    \x01\x05\x0b\n\x20\n\x04\x05\0\x02\0\x12\x04\xb7\x01\x02\x14\x1a\x12\x20\
-    Syntax\x20`proto2`.\n\n\r\n\x05\x05\0\x02\0\x01\x12\x04\xb7\x01\x02\x0f\
-    \n\r\n\x05\x05\0\x02\0\x02\x12\x04\xb7\x01\x12\x13\n\x20\n\x04\x05\0\x02\
-    \x01\x12\x04\xb9\x01\x02\x14\x1a\x12\x20Syntax\x20`proto3`.\n\n\r\n\x05\
-    \x05\0\x02\x01\x01\x12\x04\xb9\x01\x02\x0f\n\r\n\x05\x05\0\x02\x01\x02\
-    \x12\x04\xb9\x01\x12\x13b\x06proto3\
-";
-
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
-}
-
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
-    })
-}
diff --git a/src/well_known_types/wrappers.rs b/src/well_known_types/wrappers.rs
index 4e056c7..7e96c21 100644
--- a/src/well_known_types/wrappers.rs
+++ b/src/well_known_types/wrappers.rs
@@ -1,4 +1,5 @@
-// This file is generated by rust-protobuf 2.26.0. Do not edit
+// This file is generated by rust-protobuf 3.0.0-pre. Do not edit
+// .proto file is parsed by protoc --rust-out=...
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -15,20 +16,24 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `google/protobuf/wrappers.proto`
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `double`.
+///
+///  The JSON representation for `DoubleValue` is JSON number.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.DoubleValue)
 pub struct DoubleValue {
     // message fields
+    ///  The double value.
+    // @@protoc_insertion_point(field:google.protobuf.DoubleValue.value)
     pub value: f64,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.DoubleValue.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a DoubleValue {
@@ -42,40 +47,37 @@
         ::std::default::Default::default()
     }
 
-    // double value = 1;
-
-
-    pub fn get_value(&self) -> f64 {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = 0.;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: f64) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &DoubleValue| { &m.value },
+            |m: &mut DoubleValue| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<DoubleValue>(
+            "DoubleValue",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for DoubleValue {
+    const NAME: &'static str = "DoubleValue";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeFixed64 {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_double()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                9 => {
+                    self.value = is.read_double()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -84,106 +86,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != 0. {
-            my_size += 9;
+            my_size += 1 + 8;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != 0. {
             os.write_double(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> DoubleValue {
         DoubleValue::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeDouble>(
-                "value",
-                |m: &DoubleValue| { &m.value },
-                |m: &mut DoubleValue| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<DoubleValue>(
-                "DoubleValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = 0.;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static DoubleValue {
-        static instance: crate::rt::LazyV2<DoubleValue> = crate::rt::LazyV2::INIT;
-        instance.get(DoubleValue::new)
+        static instance: DoubleValue = DoubleValue {
+            value: 0.,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for DoubleValue {
-    fn clear(&mut self) {
-        self.value = 0.;
-        self.unknown_fields.clear();
+impl crate::MessageFull for DoubleValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("DoubleValue").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for DoubleValue {
+impl ::std::fmt::Display for DoubleValue {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for DoubleValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `float`.
+///
+///  The JSON representation for `FloatValue` is JSON number.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.FloatValue)
 pub struct FloatValue {
     // message fields
+    ///  The float value.
+    // @@protoc_insertion_point(field:google.protobuf.FloatValue.value)
     pub value: f32,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.FloatValue.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a FloatValue {
@@ -197,40 +173,37 @@
         ::std::default::Default::default()
     }
 
-    // float value = 1;
-
-
-    pub fn get_value(&self) -> f32 {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = 0.;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: f32) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &FloatValue| { &m.value },
+            |m: &mut FloatValue| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<FloatValue>(
+            "FloatValue",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for FloatValue {
+    const NAME: &'static str = "FloatValue";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeFixed32 {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_float()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                13 => {
+                    self.value = is.read_float()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -239,106 +212,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != 0. {
-            my_size += 5;
+            my_size += 1 + 4;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != 0. {
             os.write_float(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> FloatValue {
         FloatValue::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeFloat>(
-                "value",
-                |m: &FloatValue| { &m.value },
-                |m: &mut FloatValue| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<FloatValue>(
-                "FloatValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = 0.;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static FloatValue {
-        static instance: crate::rt::LazyV2<FloatValue> = crate::rt::LazyV2::INIT;
-        instance.get(FloatValue::new)
+        static instance: FloatValue = FloatValue {
+            value: 0.,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for FloatValue {
-    fn clear(&mut self) {
-        self.value = 0.;
-        self.unknown_fields.clear();
+impl crate::MessageFull for FloatValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("FloatValue").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for FloatValue {
+impl ::std::fmt::Display for FloatValue {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for FloatValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `int64`.
+///
+///  The JSON representation for `Int64Value` is JSON string.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Int64Value)
 pub struct Int64Value {
     // message fields
+    ///  The int64 value.
+    // @@protoc_insertion_point(field:google.protobuf.Int64Value.value)
     pub value: i64,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Int64Value.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Int64Value {
@@ -352,40 +299,37 @@
         ::std::default::Default::default()
     }
 
-    // int64 value = 1;
-
-
-    pub fn get_value(&self) -> i64 {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: i64) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &Int64Value| { &m.value },
+            |m: &mut Int64Value| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Int64Value>(
+            "Int64Value",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Int64Value {
+    const NAME: &'static str = "Int64Value";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.value = is.read_int64()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -394,106 +338,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != 0 {
-            my_size += crate::rt::value_size(1, self.value, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int64_size(1, self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != 0 {
             os.write_int64(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Int64Value {
         Int64Value::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt64>(
-                "value",
-                |m: &Int64Value| { &m.value },
-                |m: &mut Int64Value| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Int64Value>(
-                "Int64Value",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = 0;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static Int64Value {
-        static instance: crate::rt::LazyV2<Int64Value> = crate::rt::LazyV2::INIT;
-        instance.get(Int64Value::new)
+        static instance: Int64Value = Int64Value {
+            value: 0,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for Int64Value {
-    fn clear(&mut self) {
-        self.value = 0;
-        self.unknown_fields.clear();
+impl crate::MessageFull for Int64Value {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Int64Value").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for Int64Value {
+impl ::std::fmt::Display for Int64Value {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Int64Value {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `uint64`.
+///
+///  The JSON representation for `UInt64Value` is JSON string.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.UInt64Value)
 pub struct UInt64Value {
     // message fields
+    ///  The uint64 value.
+    // @@protoc_insertion_point(field:google.protobuf.UInt64Value.value)
     pub value: u64,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.UInt64Value.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a UInt64Value {
@@ -507,40 +425,37 @@
         ::std::default::Default::default()
     }
 
-    // uint64 value = 1;
-
-
-    pub fn get_value(&self) -> u64 {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: u64) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &UInt64Value| { &m.value },
+            |m: &mut UInt64Value| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<UInt64Value>(
+            "UInt64Value",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for UInt64Value {
+    const NAME: &'static str = "UInt64Value";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_uint64()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.value = is.read_uint64()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -549,106 +464,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != 0 {
-            my_size += crate::rt::value_size(1, self.value, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::uint64_size(1, self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != 0 {
             os.write_uint64(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> UInt64Value {
         UInt64Value::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeUint64>(
-                "value",
-                |m: &UInt64Value| { &m.value },
-                |m: &mut UInt64Value| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<UInt64Value>(
-                "UInt64Value",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = 0;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static UInt64Value {
-        static instance: crate::rt::LazyV2<UInt64Value> = crate::rt::LazyV2::INIT;
-        instance.get(UInt64Value::new)
+        static instance: UInt64Value = UInt64Value {
+            value: 0,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for UInt64Value {
-    fn clear(&mut self) {
-        self.value = 0;
-        self.unknown_fields.clear();
+impl crate::MessageFull for UInt64Value {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("UInt64Value").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for UInt64Value {
+impl ::std::fmt::Display for UInt64Value {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for UInt64Value {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `int32`.
+///
+///  The JSON representation for `Int32Value` is JSON number.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.Int32Value)
 pub struct Int32Value {
     // message fields
+    ///  The int32 value.
+    // @@protoc_insertion_point(field:google.protobuf.Int32Value.value)
     pub value: i32,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.Int32Value.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Int32Value {
@@ -662,40 +551,37 @@
         ::std::default::Default::default()
     }
 
-    // int32 value = 1;
-
-
-    pub fn get_value(&self) -> i32 {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: i32) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &Int32Value| { &m.value },
+            |m: &mut Int32Value| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<Int32Value>(
+            "Int32Value",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for Int32Value {
+    const NAME: &'static str = "Int32Value";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.value = is.read_int32()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -704,106 +590,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != 0 {
-            my_size += crate::rt::value_size(1, self.value, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::int32_size(1, self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != 0 {
             os.write_int32(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Int32Value {
         Int32Value::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeInt32>(
-                "value",
-                |m: &Int32Value| { &m.value },
-                |m: &mut Int32Value| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<Int32Value>(
-                "Int32Value",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = 0;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static Int32Value {
-        static instance: crate::rt::LazyV2<Int32Value> = crate::rt::LazyV2::INIT;
-        instance.get(Int32Value::new)
+        static instance: Int32Value = Int32Value {
+            value: 0,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for Int32Value {
-    fn clear(&mut self) {
-        self.value = 0;
-        self.unknown_fields.clear();
+impl crate::MessageFull for Int32Value {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Int32Value").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for Int32Value {
+impl ::std::fmt::Display for Int32Value {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for Int32Value {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `uint32`.
+///
+///  The JSON representation for `UInt32Value` is JSON number.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.UInt32Value)
 pub struct UInt32Value {
     // message fields
+    ///  The uint32 value.
+    // @@protoc_insertion_point(field:google.protobuf.UInt32Value.value)
     pub value: u32,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.UInt32Value.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a UInt32Value {
@@ -817,40 +677,37 @@
         ::std::default::Default::default()
     }
 
-    // uint32 value = 1;
-
-
-    pub fn get_value(&self) -> u32 {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: u32) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &UInt32Value| { &m.value },
+            |m: &mut UInt32Value| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<UInt32Value>(
+            "UInt32Value",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for UInt32Value {
+    const NAME: &'static str = "UInt32Value";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_uint32()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.value = is.read_uint32()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -859,106 +716,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != 0 {
-            my_size += crate::rt::value_size(1, self.value, crate::wire_format::WireTypeVarint);
+            my_size += crate::rt::uint32_size(1, self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != 0 {
             os.write_uint32(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> UInt32Value {
         UInt32Value::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeUint32>(
-                "value",
-                |m: &UInt32Value| { &m.value },
-                |m: &mut UInt32Value| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<UInt32Value>(
-                "UInt32Value",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = 0;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static UInt32Value {
-        static instance: crate::rt::LazyV2<UInt32Value> = crate::rt::LazyV2::INIT;
-        instance.get(UInt32Value::new)
+        static instance: UInt32Value = UInt32Value {
+            value: 0,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for UInt32Value {
-    fn clear(&mut self) {
-        self.value = 0;
-        self.unknown_fields.clear();
+impl crate::MessageFull for UInt32Value {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("UInt32Value").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for UInt32Value {
+impl ::std::fmt::Display for UInt32Value {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for UInt32Value {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `bool`.
+///
+///  The JSON representation for `BoolValue` is JSON `true` and `false`.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.BoolValue)
 pub struct BoolValue {
     // message fields
+    ///  The bool value.
+    // @@protoc_insertion_point(field:google.protobuf.BoolValue.value)
     pub value: bool,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.BoolValue.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a BoolValue {
@@ -972,40 +803,37 @@
         ::std::default::Default::default()
     }
 
-    // bool value = 1;
-
-
-    pub fn get_value(&self) -> bool {
-        self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: bool) {
-        self.value = v;
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &BoolValue| { &m.value },
+            |m: &mut BoolValue| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<BoolValue>(
+            "BoolValue",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for BoolValue {
+    const NAME: &'static str = "BoolValue";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != crate::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(crate::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.value = tmp;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.value = is.read_bool()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1014,106 +842,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if self.value != false {
-            my_size += 2;
+            my_size += 1 + 1;
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if self.value != false {
             os.write_bool(1, self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> BoolValue {
         BoolValue::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeBool>(
-                "value",
-                |m: &BoolValue| { &m.value },
-                |m: &mut BoolValue| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<BoolValue>(
-                "BoolValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value = false;
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static BoolValue {
-        static instance: crate::rt::LazyV2<BoolValue> = crate::rt::LazyV2::INIT;
-        instance.get(BoolValue::new)
+        static instance: BoolValue = BoolValue {
+            value: false,
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for BoolValue {
-    fn clear(&mut self) {
-        self.value = false;
-        self.unknown_fields.clear();
+impl crate::MessageFull for BoolValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("BoolValue").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for BoolValue {
+impl ::std::fmt::Display for BoolValue {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for BoolValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `string`.
+///
+///  The JSON representation for `StringValue` is JSON string.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.StringValue)
 pub struct StringValue {
     // message fields
+    ///  The string value.
+    // @@protoc_insertion_point(field:google.protobuf.StringValue.value)
     pub value: ::std::string::String,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.StringValue.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a StringValue {
@@ -1127,47 +929,37 @@
         ::std::default::Default::default()
     }
 
-    // string value = 1;
-
-
-    pub fn get_value(&self) -> &str {
-        &self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: ::std::string::String) {
-        self.value = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_value(&mut self) -> &mut ::std::string::String {
-        &mut self.value
-    }
-
-    // Take field
-    pub fn take_value(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.value, ::std::string::String::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &StringValue| { &m.value },
+            |m: &mut StringValue| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<StringValue>(
+            "StringValue",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for StringValue {
+    const NAME: &'static str = "StringValue";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_string_into(wire_type, is, &mut self.value)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.value = is.read_string()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1176,106 +968,80 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.value.is_empty() {
             my_size += crate::rt::string_size(1, &self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.value.is_empty() {
             os.write_string(1, &self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> StringValue {
         StringValue::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeString>(
-                "value",
-                |m: &StringValue| { &m.value },
-                |m: &mut StringValue| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<StringValue>(
-                "StringValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static StringValue {
-        static instance: crate::rt::LazyV2<StringValue> = crate::rt::LazyV2::INIT;
-        instance.get(StringValue::new)
+        static instance: StringValue = StringValue {
+            value: ::std::string::String::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for StringValue {
-    fn clear(&mut self) {
-        self.value.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for StringValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("StringValue").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for StringValue {
+impl ::std::fmt::Display for StringValue {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for StringValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
-#[derive(PartialEq,Clone,Default)]
-#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))]
+///  Wrapper message for `bytes`.
+///
+///  The JSON representation for `BytesValue` is JSON string.
+#[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:google.protobuf.BytesValue)
 pub struct BytesValue {
     // message fields
+    ///  The bytes value.
+    // @@protoc_insertion_point(field:google.protobuf.BytesValue.value)
     pub value: ::std::vec::Vec<u8>,
     // special fields
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub unknown_fields: crate::UnknownFields,
-    #[cfg_attr(feature = "with-serde", serde(skip))]
-    pub cached_size: crate::CachedSize,
+    // @@protoc_insertion_point(special_field:google.protobuf.BytesValue.special_fields)
+    pub special_fields: crate::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a BytesValue {
@@ -1289,47 +1055,37 @@
         ::std::default::Default::default()
     }
 
-    // bytes value = 1;
-
-
-    pub fn get_value(&self) -> &[u8] {
-        &self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: ::std::vec::Vec<u8>) {
-        self.value = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_value(&mut self) -> &mut ::std::vec::Vec<u8> {
-        &mut self.value
-    }
-
-    // Take field
-    pub fn take_value(&mut self) -> ::std::vec::Vec<u8> {
-        ::std::mem::replace(&mut self.value, ::std::vec::Vec::new())
+    fn generated_message_descriptor_data() -> crate::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(1);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        fields.push(crate::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
+            "value",
+            |m: &BytesValue| { &m.value },
+            |m: &mut BytesValue| { &mut m.value },
+        ));
+        crate::reflect::GeneratedMessageDescriptorData::new_2::<BytesValue>(
+            "BytesValue",
+            fields,
+            oneofs,
+        )
     }
 }
 
 impl crate::Message for BytesValue {
+    const NAME: &'static str = "BytesValue";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    crate::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.value)?;
+    fn merge_from(&mut self, is: &mut crate::CodedInputStream<'_>) -> crate::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.value = is.read_bytes()?;
                 },
-                _ => {
-                    crate::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    crate::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1338,94 +1094,65 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if !self.value.is_empty() {
             my_size += crate::rt::bytes_size(1, &self.value);
         }
-        my_size += crate::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += crate::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut crate::CodedOutputStream<'_>) -> crate::Result<()> {
         if !self.value.is_empty() {
             os.write_bytes(1, &self.value)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &crate::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &crate::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut crate::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static crate::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut crate::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> BytesValue {
         BytesValue::new()
     }
 
-    fn descriptor_static() -> &'static crate::reflect::MessageDescriptor {
-        static descriptor: crate::rt::LazyV2<crate::reflect::MessageDescriptor> = crate::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(crate::reflect::accessor::make_simple_field_accessor::<_, crate::types::ProtobufTypeBytes>(
-                "value",
-                |m: &BytesValue| { &m.value },
-                |m: &mut BytesValue| { &mut m.value },
-            ));
-            crate::reflect::MessageDescriptor::new_pb_name::<BytesValue>(
-                "BytesValue",
-                fields,
-                file_descriptor_proto()
-            )
-        })
+    fn clear(&mut self) {
+        self.value.clear();
+        self.special_fields.clear();
     }
 
     fn default_instance() -> &'static BytesValue {
-        static instance: crate::rt::LazyV2<BytesValue> = crate::rt::LazyV2::INIT;
-        instance.get(BytesValue::new)
+        static instance: BytesValue = BytesValue {
+            value: ::std::vec::Vec::new(),
+            special_fields: crate::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl crate::Clear for BytesValue {
-    fn clear(&mut self) {
-        self.value.clear();
-        self.unknown_fields.clear();
+impl crate::MessageFull for BytesValue {
+    fn descriptor() -> crate::reflect::MessageDescriptor {
+        static descriptor: crate::rt::Lazy<crate::reflect::MessageDescriptor> = crate::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("BytesValue").unwrap()).clone()
     }
 }
 
-impl ::std::fmt::Debug for BytesValue {
+impl ::std::fmt::Display for BytesValue {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         crate::text_format::fmt(self, f)
     }
 }
 
 impl crate::reflect::ProtobufValue for BytesValue {
-    fn as_ref(&self) -> crate::reflect::ReflectValueRef {
-        crate::reflect::ReflectValueRef::Message(self)
-    }
+    type RuntimeType = crate::reflect::rt::RuntimeTypeMessage<Self>;
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
@@ -1549,14 +1276,39 @@
     b\x06proto3\
 ";
 
-static file_descriptor_proto_lazy: crate::rt::LazyV2<crate::descriptor::FileDescriptorProto> = crate::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> crate::descriptor::FileDescriptorProto {
-    crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: crate::rt::Lazy<crate::descriptor::FileDescriptorProto> = crate::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        crate::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
 }
 
-pub fn file_descriptor_proto() -> &'static crate::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static crate::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: crate::rt::Lazy<crate::reflect::GeneratedFileDescriptor> = crate::rt::Lazy::new();
+    static file_descriptor: crate::rt::Lazy<crate::reflect::FileDescriptor> = crate::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(0);
+            let mut messages = ::std::vec::Vec::with_capacity(9);
+            messages.push(DoubleValue::generated_message_descriptor_data());
+            messages.push(FloatValue::generated_message_descriptor_data());
+            messages.push(Int64Value::generated_message_descriptor_data());
+            messages.push(UInt64Value::generated_message_descriptor_data());
+            messages.push(Int32Value::generated_message_descriptor_data());
+            messages.push(UInt32Value::generated_message_descriptor_data());
+            messages.push(BoolValue::generated_message_descriptor_data());
+            messages.push(StringValue::generated_message_descriptor_data());
+            messages.push(BytesValue::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            crate::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        crate::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
     })
 }
diff --git a/src/well_known_types_util/any.rs b/src/well_known_types_util/any.rs
index 7441e17..3af541a 100644
--- a/src/well_known_types_util/any.rs
+++ b/src/well_known_types_util/any.rs
@@ -1,14 +1,14 @@
+use crate::message_dyn::MessageDyn;
 use crate::reflect::MessageDescriptor;
-use crate::well_known_types::Any;
-use crate::Message;
-use crate::ProtobufResult;
+use crate::well_known_types::any::Any;
+use crate::MessageFull;
 
 impl Any {
     fn type_url(type_url_prefix: &str, descriptor: &MessageDescriptor) -> String {
         format!("{}/{}", type_url_prefix, descriptor.full_name())
     }
 
-    fn get_type_name_from_type_url(type_url: &str) -> Option<&str> {
+    fn type_name_from_type_url(type_url: &str) -> Option<&str> {
         match type_url.rfind('/') {
             Some(i) => Some(&type_url[i + 1..]),
             None => None,
@@ -20,18 +20,17 @@
     /// # Examples
     ///
     /// ```
-    /// # use protobuf::Message;
-    /// # use protobuf::ProtobufResult;
-    /// use protobuf::well_known_types::Any;
+    /// # use protobuf::MessageFull;
+    /// use protobuf::well_known_types::any::Any;
     ///
-    /// # fn the_test<MyMessage: Message>(message: &MyMessage) -> ProtobufResult<()> {
+    /// # fn the_test<MyMessage: MessageFull>(message: &MyMessage) -> protobuf::Result<()> {
     /// let message: &MyMessage = message;
     /// let any = Any::pack(message)?;
     /// assert!(any.is::<MyMessage>());
     /// #   Ok(())
     /// # }
     /// ```
-    pub fn pack<M: Message>(message: &M) -> ProtobufResult<Any> {
+    pub fn pack<M: MessageFull>(message: &M) -> crate::Result<Any> {
         Any::pack_dyn(message)
     }
 
@@ -40,40 +39,39 @@
     /// # Examples
     ///
     /// ```
-    /// use protobuf::Message;
-    /// # use protobuf::ProtobufResult;
-    /// use protobuf::well_known_types::Any;
+    /// use protobuf::{MessageFull, MessageDyn};
+    /// use protobuf::well_known_types::any::Any;
     ///
-    /// # fn the_test(message: &dyn Message) -> ProtobufResult<()> {
-    /// let message: &dyn Message = message;
+    /// # fn the_test(message: &dyn MessageDyn) -> protobuf::Result<()> {
+    /// let message: &dyn MessageDyn = message;
     /// let any = Any::pack_dyn(message)?;
-    /// assert!(any.is_dyn(message.descriptor()));
+    /// assert!(any.is_dyn(&message.descriptor_dyn()));
     /// #   Ok(())
     /// # }
     /// ```
-    pub fn pack_dyn(message: &dyn Message) -> ProtobufResult<Any> {
+    pub fn pack_dyn(message: &dyn MessageDyn) -> crate::Result<Any> {
         Any::pack_with_type_url_prefix(message, "type.googleapis.com")
     }
 
     fn pack_with_type_url_prefix(
-        message: &dyn Message,
+        message: &dyn MessageDyn,
         type_url_prefix: &str,
-    ) -> ProtobufResult<Any> {
+    ) -> crate::Result<Any> {
         Ok(Any {
-            type_url: Any::type_url(type_url_prefix, message.descriptor()),
-            value: message.write_to_bytes()?,
+            type_url: Any::type_url(type_url_prefix, &message.descriptor_dyn()),
+            value: message.write_to_bytes_dyn()?,
             ..Default::default()
         })
     }
 
     /// Check if `Any` contains a message of given type.
-    pub fn is<M: Message>(&self) -> bool {
-        self.is_dyn(M::descriptor_static())
+    pub fn is<M: MessageFull>(&self) -> bool {
+        self.is_dyn(&M::descriptor())
     }
 
     /// Check if `Any` contains a message of given type.
     pub fn is_dyn(&self, descriptor: &MessageDescriptor) -> bool {
-        match Any::get_type_name_from_type_url(&self.type_url) {
+        match Any::type_name_from_type_url(&self.type_url) {
             Some(type_name) => type_name == descriptor.full_name(),
             None => false,
         }
@@ -85,7 +83,7 @@
     ///
     /// * `Ok(None)` when message type mismatch
     /// * `Err` when parse failed
-    pub fn unpack<M: Message>(&self) -> ProtobufResult<Option<M>> {
+    pub fn unpack<M: MessageFull>(&self) -> crate::Result<Option<M>> {
         if !self.is::<M>() {
             return Ok(None);
         }
@@ -101,13 +99,13 @@
     pub fn unpack_dyn(
         &self,
         descriptor: &MessageDescriptor,
-    ) -> ProtobufResult<Option<Box<dyn Message>>> {
+    ) -> crate::Result<Option<Box<dyn MessageDyn>>> {
         if !self.is_dyn(descriptor) {
             return Ok(None);
         }
         let mut message = descriptor.new_instance();
-        message.merge_from_bytes(&self.value)?;
-        message.check_initialized()?;
+        message.merge_from_bytes_dyn(&self.value)?;
+        message.check_initialized_dyn()?;
         Ok(Some(message))
     }
 }
diff --git a/src/well_known_types_util/duration.rs b/src/well_known_types_util/duration.rs
new file mode 100644
index 0000000..eb68e23
--- /dev/null
+++ b/src/well_known_types_util/duration.rs
@@ -0,0 +1,67 @@
+use crate::well_known_types::duration::Duration;
+use crate::SpecialFields;
+
+impl Duration {
+    /// Zero seconds zero nanoseconds.
+    pub const ZERO: Duration = Duration {
+        seconds: 0,
+        nanos: 0,
+        special_fields: SpecialFields::new(),
+    };
+}
+
+/// Convert from `std::time::Duration`.
+///
+/// # Panics
+///
+/// If `std::time::Duration` value is outside of `Duration` supported range.
+impl From<std::time::Duration> for Duration {
+    fn from(duration: std::time::Duration) -> Self {
+        Duration {
+            seconds: duration.as_secs() as i64,
+            nanos: duration.subsec_nanos() as i32,
+            ..Default::default()
+        }
+    }
+}
+
+/// Convert to `std::time::Duration`.
+///
+/// This conversion might be lossy if `std::time::Duration` precision is smaller than nanoseconds.
+///
+/// # Panics
+///
+/// If `Duration` value is outside of `std::time::Duration` supported range.
+impl Into<std::time::Duration> for Duration {
+    fn into(self) -> std::time::Duration {
+        assert!(self.seconds >= 0);
+        std::time::Duration::from_secs(self.seconds as u64)
+            + std::time::Duration::from_nanos(self.nanos as u64)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use crate::well_known_types::duration::Duration;
+
+    #[test]
+    fn to_from_duration() {
+        fn to_from(duration: Duration, std_time_duration: std::time::Duration) {
+            assert_eq!(duration, Duration::from(std_time_duration));
+            assert_eq!(
+                std_time_duration,
+                Into::<std::time::Duration>::into(duration)
+            );
+        }
+
+        to_from(Duration::ZERO, std::time::Duration::from_secs(0));
+        to_from(
+            Duration {
+                seconds: 4,
+                nanos: 123_000_000,
+                ..Default::default()
+            },
+            std::time::Duration::from_millis(4_123),
+        );
+    }
+}
diff --git a/src/well_known_types_util/mod.rs b/src/well_known_types_util/mod.rs
index bd4c243..4c0d47d 100644
--- a/src/well_known_types_util/mod.rs
+++ b/src/well_known_types_util/mod.rs
@@ -1 +1,3 @@
 mod any;
+mod duration;
+mod timestamp;
diff --git a/src/well_known_types_util/timestamp.rs b/src/well_known_types_util/timestamp.rs
new file mode 100644
index 0000000..0429fcf
--- /dev/null
+++ b/src/well_known_types_util/timestamp.rs
@@ -0,0 +1,118 @@
+use std::time::Duration;
+use std::time::SystemTime;
+
+use crate::well_known_types::timestamp::Timestamp;
+use crate::SpecialFields;
+
+impl Timestamp {
+    /// Unix epoch value of timestamp.
+    pub const UNIX_EPOCH: Timestamp = Timestamp {
+        seconds: 0,
+        nanos: 0,
+        special_fields: SpecialFields::new(),
+    };
+
+    /// Return current time as `Timestamp`.
+    pub fn now() -> Timestamp {
+        Timestamp::from(SystemTime::now())
+    }
+}
+
+/// Convert from [`Timestamp`].
+///
+/// # Panics
+///
+/// This function panics if given `SystemTime` is outside of `Timestamp` range.
+impl From<SystemTime> for Timestamp {
+    fn from(time: SystemTime) -> Self {
+        match time.duration_since(SystemTime::UNIX_EPOCH) {
+            Ok(since_epoch) => Timestamp {
+                seconds: since_epoch.as_secs() as i64,
+                nanos: since_epoch.subsec_nanos() as i32,
+                ..Default::default()
+            },
+            Err(e) => {
+                let before_epoch = e.duration();
+                Timestamp {
+                    seconds: -(before_epoch.as_secs() as i64)
+                        - (before_epoch.subsec_nanos() != 0) as i64,
+                    nanos: (1_000_000_000 - before_epoch.subsec_nanos() as i32) % 1_000_000_000,
+                    ..Default::default()
+                }
+            }
+        }
+    }
+}
+
+/// Convert into [`SystemTime`].
+///
+/// The conversion could be lossy if `SystemTime` precision is smaller than nanoseconds.
+///
+/// # Panics
+///
+/// This function panics:
+/// * if given `Timestamp` is outside of `SystemTime` range
+/// * if `Timestamp` is malformed
+impl Into<SystemTime> for Timestamp {
+    fn into(self) -> SystemTime {
+        if self.seconds >= 0 {
+            let duration =
+                Duration::from_secs(self.seconds as u64) + Duration::from_nanos(self.nanos as u64);
+            SystemTime::UNIX_EPOCH + duration
+        } else {
+            let duration =
+                Duration::from_secs(-self.seconds as u64) - Duration::from_nanos(self.nanos as u64);
+            SystemTime::UNIX_EPOCH - duration
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::time::Duration;
+    use std::time::SystemTime;
+
+    use crate::well_known_types::timestamp::Timestamp;
+
+    #[test]
+    fn to_from_system_time() {
+        fn to_from(timestamp: Timestamp, system_time: SystemTime) {
+            assert_eq!(timestamp, Timestamp::from(system_time));
+            assert_eq!(system_time, Into::<SystemTime>::into(timestamp));
+        }
+
+        to_from(Timestamp::UNIX_EPOCH, SystemTime::UNIX_EPOCH);
+        to_from(
+            Timestamp {
+                seconds: 0,
+                nanos: 200_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH + Duration::from_millis(200),
+        );
+        to_from(
+            Timestamp {
+                seconds: 3,
+                nanos: 200_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH + Duration::from_millis(3_200),
+        );
+        to_from(
+            Timestamp {
+                seconds: -1,
+                nanos: 800_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH - Duration::from_millis(200),
+        );
+        to_from(
+            Timestamp {
+                seconds: -4,
+                nanos: 800_000_000,
+                ..Default::default()
+            },
+            SystemTime::UNIX_EPOCH - Duration::from_millis(3_200),
+        );
+    }
+}
diff --git a/src/wire_format.rs b/src/wire_format.rs
index 9f54af3..9e4b703 100644
--- a/src/wire_format.rs
+++ b/src/wire_format.rs
@@ -1,105 +1,142 @@
-//! Serialization constants.
+//! Constants used in serializations.
 
-// TODO: temporary
-pub use self::WireType::*;
+use crate::descriptor::field_descriptor_proto;
+use crate::error::WireError;
 
-/// Tag occupies 3 bits
-pub const TAG_TYPE_BITS: u32 = 3;
-/// Tag mask
-pub const TAG_TYPE_MASK: u32 = (1u32 << TAG_TYPE_BITS) - 1;
+/// Tag occupies three bits.
+pub(crate) const TAG_TYPE_BITS: u32 = 3;
+/// Apply this mask to varint value to obtain a tag.
+pub(crate) const TAG_TYPE_MASK: u32 = (1u32 << TAG_TYPE_BITS as usize) - 1;
 /// Max possible field number
-pub const FIELD_NUMBER_MAX: u32 = 0x1fffffff;
+pub(crate) const FIELD_NUMBER_MAX: u32 = 0x1fffffff;
 
-/// One of six defined protobuf wire types
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub enum WireType {
-    /// Varint (e. g. `int32` or `sint64`)
-    WireTypeVarint = 0,
-    /// Fixed size 64 bit (e. g. `fixed64` or `double`)
-    WireTypeFixed64 = 1,
-    /// Length-delimited (e. g. `message` or `string`)
-    WireTypeLengthDelimited = 2,
-    /// Groups are not supported by rust-protobuf
-    WireTypeStartGroup = 3,
-    /// Groups are not supported by rust-protobuf
-    WireTypeEndGroup = 4,
-    /// Fixed size 64 bit (e. g. `fixed32` or `float`)
-    WireTypeFixed32 = 5,
+pub(crate) const MAX_MESSAGE_SIZE: u64 = i32::MAX as u64;
+
+#[inline]
+pub(crate) fn check_message_size(size: u64) -> crate::Result<u32> {
+    if size <= MAX_MESSAGE_SIZE {
+        Ok(size as u32)
+    } else {
+        #[cold]
+        fn message_too_large(size: u64) -> crate::Error {
+            WireError::MessageTooLarge(size).into()
+        }
+
+        Err(message_too_large(size))
+    }
 }
 
-impl Copy for WireType {}
+/// All supported "wire types" are listed in this enum.
+#[derive(PartialEq, Eq, Clone, Copy, Debug)]
+pub enum WireType {
+    /// Variable-length integer
+    Varint = 0,
+    /// 32-bit field (e. g. `fixed64` or `double`)
+    Fixed64 = 1,
+    /// Length-delimited field
+    LengthDelimited = 2,
+    /// Groups are not supported in rust-protobuf
+    StartGroup = 3,
+    /// Groups are not supported in rust-protobuf
+    EndGroup = 4,
+    /// 32-bit field (e. g. `fixed32` or `float`)
+    Fixed32 = 5,
+}
 
 impl WireType {
-    /// Parse wire type
+    /// Construct `WireType` from number, or return `None` if type is unknown.
     pub fn new(n: u32) -> Option<WireType> {
         match n {
-            0 => Some(WireTypeVarint),
-            1 => Some(WireTypeFixed64),
-            2 => Some(WireTypeLengthDelimited),
-            3 => Some(WireTypeStartGroup),
-            4 => Some(WireTypeEndGroup),
-            5 => Some(WireTypeFixed32),
+            0 => Some(WireType::Varint),
+            1 => Some(WireType::Fixed64),
+            2 => Some(WireType::LengthDelimited),
+            3 => Some(WireType::StartGroup),
+            4 => Some(WireType::EndGroup),
+            5 => Some(WireType::Fixed32),
             _ => None,
         }
     }
+
+    #[doc(hidden)]
+    pub fn for_type(field_type: field_descriptor_proto::Type) -> WireType {
+        use field_descriptor_proto::Type;
+        match field_type {
+            Type::TYPE_INT32 => WireType::Varint,
+            Type::TYPE_INT64 => WireType::Varint,
+            Type::TYPE_UINT32 => WireType::Varint,
+            Type::TYPE_UINT64 => WireType::Varint,
+            Type::TYPE_SINT32 => WireType::Varint,
+            Type::TYPE_SINT64 => WireType::Varint,
+            Type::TYPE_BOOL => WireType::Varint,
+            Type::TYPE_ENUM => WireType::Varint,
+            Type::TYPE_FIXED32 => WireType::Fixed32,
+            Type::TYPE_FIXED64 => WireType::Fixed64,
+            Type::TYPE_SFIXED32 => WireType::Fixed32,
+            Type::TYPE_SFIXED64 => WireType::Fixed64,
+            Type::TYPE_FLOAT => WireType::Fixed32,
+            Type::TYPE_DOUBLE => WireType::Fixed64,
+            Type::TYPE_STRING => WireType::LengthDelimited,
+            Type::TYPE_BYTES => WireType::LengthDelimited,
+            Type::TYPE_MESSAGE => WireType::LengthDelimited,
+            Type::TYPE_GROUP => WireType::LengthDelimited, // not true
+        }
+    }
 }
 
-/// Parsed protobuf tag, which is a pair of field number and wire type
-#[derive(Clone)]
-pub struct Tag {
+/// Parsed field tag (a pair of field number and wire type)
+#[derive(Clone, Copy, PartialEq, Eq, Debug)]
+pub(crate) struct Tag {
     field_number: u32,
     wire_type: WireType,
 }
 
-impl Copy for Tag {}
-
 impl Tag {
-    /// Pack a tag to integer
-    pub fn value(self) -> u32 {
+    /// Fold tag to a number to be serialized.
+    pub(crate) fn value(self) -> u32 {
         (self.field_number << TAG_TYPE_BITS) | (self.wire_type as u32)
     }
 
-    /// Parse integer into `Tag` object
-    // TODO: should return Result instead of Option
-    pub fn new(value: u32) -> Option<Tag> {
+    /// Extract wire type and field number from integer tag
+    pub(crate) fn new(value: u32) -> crate::Result<Tag> {
         let wire_type = WireType::new(value & TAG_TYPE_MASK);
         if wire_type.is_none() {
-            return None;
+            return Err(WireError::IncorrectTag(value).into());
         }
         let field_number = value >> TAG_TYPE_BITS;
         if field_number == 0 {
-            return None;
+            return Err(WireError::IncorrectTag(value).into());
         }
-        Some(Tag {
-            field_number: field_number,
+        Ok(Tag {
+            field_number,
             wire_type: wire_type.unwrap(),
         })
     }
 
-    /// Create a tag from a field number and wire type.
+    /// Construct a tag from a field number and wire type.
     ///
     /// # Panics
     ///
-    /// If field number is outside of allowed range.
-    pub fn make(field_number: u32, wire_type: WireType) -> Tag {
+    /// If field number is outside of valid range.
+    pub(crate) fn make(field_number: u32, wire_type: WireType) -> Tag {
         assert!(field_number > 0 && field_number <= FIELD_NUMBER_MAX);
         Tag {
-            field_number: field_number,
-            wire_type: wire_type,
+            field_number,
+            wire_type,
         }
     }
 
-    /// Tag as pair of (field number, wire type)
-    pub fn unpack(self) -> (u32, WireType) {
+    /// Get field number and wire type
+    pub(crate) fn unpack(self) -> (u32, WireType) {
         (self.field_number(), self.wire_type())
     }
 
+    /// Get wire type
     fn wire_type(self) -> WireType {
         self.wire_type
     }
 
-    /// Protobuf field number
-    pub fn field_number(self) -> u32 {
+    /// Get field number
+    pub(crate) fn field_number(self) -> u32 {
         self.field_number
     }
 }
diff --git a/src/zigzag.rs b/src/zigzag.rs
index 4c7d27d..f4d00b3 100644
--- a/src/zigzag.rs
+++ b/src/zigzag.rs
@@ -1,22 +1,43 @@
 // ZigZag endoging used for efficient transfer of signed integers
 // https://developers.google.com/protocol-buffers/docs/encoding#types
 
-pub fn decode_zig_zag_32(n: u32) -> i32 {
+use crate::rt::compute_raw_varint32_size;
+use crate::rt::compute_raw_varint64_size;
+
+pub(crate) fn decode_zig_zag_32(n: u32) -> i32 {
     ((n >> 1) as i32) ^ (-((n & 1) as i32))
 }
 
-pub fn decode_zig_zag_64(n: u64) -> i64 {
+pub(crate) fn decode_zig_zag_64(n: u64) -> i64 {
     ((n >> 1) as i64) ^ (-((n & 1) as i64))
 }
 
-pub fn encode_zig_zag_32(n: i32) -> u32 {
+pub(crate) fn encode_zig_zag_32(n: i32) -> u32 {
     ((n << 1) ^ (n >> 31)) as u32
 }
 
-pub fn encode_zig_zag_64(n: i64) -> u64 {
+pub(crate) fn encode_zig_zag_64(n: i64) -> u64 {
     ((n << 1) ^ (n >> 63)) as u64
 }
 
+/// Helper trait implemented by integer types which could be encoded as zigzag varint.
+pub(crate) trait ProtobufVarintZigzag {
+    /// Size of self when encoded as zigzag varint.
+    fn len_varint_zigzag(&self) -> u64;
+}
+
+impl ProtobufVarintZigzag for i64 {
+    fn len_varint_zigzag(&self) -> u64 {
+        compute_raw_varint64_size(encode_zig_zag_64(*self))
+    }
+}
+
+impl ProtobufVarintZigzag for i32 {
+    fn len_varint_zigzag(&self) -> u64 {
+        compute_raw_varint32_size(encode_zig_zag_32(*self))
+    }
+}
+
 #[cfg(test)]
 mod test {