Upgrade rust/crates/protobuf to 2.16.2

* Update local file out/version.rs to new cargo output.
* Keep local change of src/lib.rs that includes out/version.rs.

Test: make
Change-Id: I535c121ed1bd49d638e70ee88d12661e0b918eaa
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index d6337d5..f32bb3e 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "09cb48471825c36fc5c8205f197eefbf664a10f7"
+    "sha1": "ea76606acceb1aced6d4bc804d32360f3065e81b"
   }
 }
diff --git a/Cargo.toml b/Cargo.toml
index 99a7f79..d810341 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "protobuf"
-version = "2.14.0"
+version = "2.16.2"
 authors = ["Stepan Koltsov <stepan.koltsov@gmail.com>"]
 description = "Rust implementation of Google protocol buffers\n"
 homepage = "https://github.com/stepancheg/rust-protobuf/"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 8f3b2b8..eaf5a7b 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,7 +1,7 @@
 [package]
 
 name = "protobuf"
-version = "2.14.0"
+version = "2.16.2"
 authors = ["Stepan Koltsov <stepan.koltsov@gmail.com>"]
 license = "MIT"
 homepage = "https://github.com/stepancheg/rust-protobuf/"
diff --git a/METADATA b/METADATA
index 50ef5ab..ab3c29a 100644
--- a/METADATA
+++ b/METADATA
@@ -9,11 +9,11 @@
     type: GIT
     value: "https://github.com/stepancheg/rust-protobuf"
   }
-  version: "2.14.0"
+  version: "2.16.2"
   license_type: NOTICE
   last_upgrade_date {
     year: 2020
-    month: 6
-    day: 3
+    month: 7
+    day: 10
   }
 }
diff --git a/out/version.rs b/out/version.rs
index 664b318..47f5784 100644
--- a/out/version.rs
+++ b/out/version.rs
@@ -1,7 +1,7 @@
 /// protobuf crate version
-pub const VERSION: &'static str = "2.14.0";
+pub const VERSION: &'static str = "2.16.2";
 /// This symbol is used by codegen
 #[doc(hidden)]
-pub const VERSION_IDENT: &'static str = "VERSION_2_14_0";
+pub const VERSION_IDENT: &'static str = "VERSION_2_16_2";
 /// This symbol can be referenced to assert that proper version of crate is used
-pub const VERSION_2_14_0: () = ();
+pub const VERSION_2_16_2: () = ();
diff --git a/src/chars.rs b/src/chars.rs
index bb5a025..49c02d7 100644
--- a/src/chars.rs
+++ b/src/chars.rs
@@ -1,12 +1,15 @@
+#![cfg(feature = "bytes")]
+
 use std::fmt;
 use std::ops::Deref;
 use std::str;
 
 use bytes::Bytes;
 
-use clear::Clear;
+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)]
 pub struct Chars(Bytes);
 
@@ -46,6 +49,13 @@
     }
 }
 
+impl Into<String> for Chars {
+    fn into(self) -> String {
+        // This is safe because `Chars` is guaranteed to store a valid UTF-8 string
+        unsafe { String::from_utf8_unchecked(self.0.as_ref().to_owned()) }
+    }
+}
+
 impl Default for Chars {
     fn default() -> Self {
         Chars::new()
@@ -56,6 +66,7 @@
     type Target = str;
 
     fn deref(&self) -> &str {
+        // This is safe because `Chars` is guaranteed to store a valid UTF-8 string
         unsafe { str::from_utf8_unchecked(&self.0) }
     }
 }
diff --git a/src/descriptor.rs b/src/descriptor.rs
index 92ca34e..4a0ec17 100644
--- a/src/descriptor.rs
+++ b/src/descriptor.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,19 +15,15 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/descriptor.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct FileDescriptorSet {
     // message fields
-    file: ::protobuf::RepeatedField<FileDescriptorProto>,
+    pub file: ::protobuf::RepeatedField<FileDescriptorProto>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -137,7 +134,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -150,29 +147,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FileDescriptorProto>>(
-                    "file",
-                    |m: &FileDescriptorSet| { &m.file },
-                    |m: &mut FileDescriptorSet| { &mut m.file },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FileDescriptorSet>(
-                    "FileDescriptorSet",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FileDescriptorProto>>(
+                "file",
+                |m: &FileDescriptorSet| { &m.file },
+                |m: &mut FileDescriptorSet| { &mut m.file },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FileDescriptorSet>(
+                "FileDescriptorSet",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FileDescriptorSet {
-        static mut instance: ::protobuf::lazy::Lazy<FileDescriptorSet> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FileDescriptorSet::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FileDescriptorSet> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FileDescriptorSet::new)
     }
 }
 
@@ -201,15 +194,15 @@
     // message fields
     name: ::protobuf::SingularField<::std::string::String>,
     package: ::protobuf::SingularField<::std::string::String>,
-    dependency: ::protobuf::RepeatedField<::std::string::String>,
-    public_dependency: ::std::vec::Vec<i32>,
-    weak_dependency: ::std::vec::Vec<i32>,
-    message_type: ::protobuf::RepeatedField<DescriptorProto>,
-    enum_type: ::protobuf::RepeatedField<EnumDescriptorProto>,
-    service: ::protobuf::RepeatedField<ServiceDescriptorProto>,
-    extension: ::protobuf::RepeatedField<FieldDescriptorProto>,
-    options: ::protobuf::SingularPtrField<FileOptions>,
-    source_code_info: ::protobuf::SingularPtrField<SourceCodeInfo>,
+    pub dependency: ::protobuf::RepeatedField<::std::string::String>,
+    pub public_dependency: ::std::vec::Vec<i32>,
+    pub weak_dependency: ::std::vec::Vec<i32>,
+    pub message_type: ::protobuf::RepeatedField<DescriptorProto>,
+    pub enum_type: ::protobuf::RepeatedField<EnumDescriptorProto>,
+    pub service: ::protobuf::RepeatedField<ServiceDescriptorProto>,
+    pub extension: ::protobuf::RepeatedField<FieldDescriptorProto>,
+    pub options: ::protobuf::SingularPtrField<FileOptions>,
+    pub source_code_info: ::protobuf::SingularPtrField<SourceCodeInfo>,
     syntax: ::protobuf::SingularField<::std::string::String>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
@@ -480,7 +473,7 @@
 
 
     pub fn get_options(&self) -> &FileOptions {
-        self.options.as_ref().unwrap_or_else(|| FileOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <FileOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -513,7 +506,7 @@
 
 
     pub fn get_source_code_info(&self) -> &SourceCodeInfo {
-        self.source_code_info.as_ref().unwrap_or_else(|| SourceCodeInfo::default_instance())
+        self.source_code_info.as_ref().unwrap_or_else(|| <SourceCodeInfo as ::protobuf::Message>::default_instance())
     }
     pub fn clear_source_code_info(&mut self) {
         self.source_code_info.clear();
@@ -784,7 +777,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -797,84 +790,80 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &FileDescriptorProto| { &m.name },
-                    |m: &mut FileDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "package",
-                    |m: &FileDescriptorProto| { &m.package },
-                    |m: &mut FileDescriptorProto| { &mut m.package },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "dependency",
-                    |m: &FileDescriptorProto| { &m.dependency },
-                    |m: &mut FileDescriptorProto| { &mut m.dependency },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "public_dependency",
-                    |m: &FileDescriptorProto| { &m.public_dependency },
-                    |m: &mut FileDescriptorProto| { &mut m.public_dependency },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "weak_dependency",
-                    |m: &FileDescriptorProto| { &m.weak_dependency },
-                    |m: &mut FileDescriptorProto| { &mut m.weak_dependency },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto>>(
-                    "message_type",
-                    |m: &FileDescriptorProto| { &m.message_type },
-                    |m: &mut FileDescriptorProto| { &mut m.message_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumDescriptorProto>>(
-                    "enum_type",
-                    |m: &FileDescriptorProto| { &m.enum_type },
-                    |m: &mut FileDescriptorProto| { &mut m.enum_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<ServiceDescriptorProto>>(
-                    "service",
-                    |m: &FileDescriptorProto| { &m.service },
-                    |m: &mut FileDescriptorProto| { &mut m.service },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldDescriptorProto>>(
-                    "extension",
-                    |m: &FileDescriptorProto| { &m.extension },
-                    |m: &mut FileDescriptorProto| { &mut m.extension },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FileOptions>>(
-                    "options",
-                    |m: &FileDescriptorProto| { &m.options },
-                    |m: &mut FileDescriptorProto| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<SourceCodeInfo>>(
-                    "source_code_info",
-                    |m: &FileDescriptorProto| { &m.source_code_info },
-                    |m: &mut FileDescriptorProto| { &mut m.source_code_info },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "syntax",
-                    |m: &FileDescriptorProto| { &m.syntax },
-                    |m: &mut FileDescriptorProto| { &mut m.syntax },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FileDescriptorProto>(
-                    "FileDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &FileDescriptorProto| { &m.name },
+                |m: &mut FileDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "package",
+                |m: &FileDescriptorProto| { &m.package },
+                |m: &mut FileDescriptorProto| { &mut m.package },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "dependency",
+                |m: &FileDescriptorProto| { &m.dependency },
+                |m: &mut FileDescriptorProto| { &mut m.dependency },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "public_dependency",
+                |m: &FileDescriptorProto| { &m.public_dependency },
+                |m: &mut FileDescriptorProto| { &mut m.public_dependency },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "weak_dependency",
+                |m: &FileDescriptorProto| { &m.weak_dependency },
+                |m: &mut FileDescriptorProto| { &mut m.weak_dependency },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto>>(
+                "message_type",
+                |m: &FileDescriptorProto| { &m.message_type },
+                |m: &mut FileDescriptorProto| { &mut m.message_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumDescriptorProto>>(
+                "enum_type",
+                |m: &FileDescriptorProto| { &m.enum_type },
+                |m: &mut FileDescriptorProto| { &mut m.enum_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<ServiceDescriptorProto>>(
+                "service",
+                |m: &FileDescriptorProto| { &m.service },
+                |m: &mut FileDescriptorProto| { &mut m.service },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldDescriptorProto>>(
+                "extension",
+                |m: &FileDescriptorProto| { &m.extension },
+                |m: &mut FileDescriptorProto| { &mut m.extension },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FileOptions>>(
+                "options",
+                |m: &FileDescriptorProto| { &m.options },
+                |m: &mut FileDescriptorProto| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<SourceCodeInfo>>(
+                "source_code_info",
+                |m: &FileDescriptorProto| { &m.source_code_info },
+                |m: &mut FileDescriptorProto| { &mut m.source_code_info },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "syntax",
+                |m: &FileDescriptorProto| { &m.syntax },
+                |m: &mut FileDescriptorProto| { &mut m.syntax },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FileDescriptorProto>(
+                "FileDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FileDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FileDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FileDescriptorProto::new)
     }
 }
 
@@ -913,15 +902,15 @@
 pub struct DescriptorProto {
     // message fields
     name: ::protobuf::SingularField<::std::string::String>,
-    field: ::protobuf::RepeatedField<FieldDescriptorProto>,
-    extension: ::protobuf::RepeatedField<FieldDescriptorProto>,
-    nested_type: ::protobuf::RepeatedField<DescriptorProto>,
-    enum_type: ::protobuf::RepeatedField<EnumDescriptorProto>,
-    extension_range: ::protobuf::RepeatedField<DescriptorProto_ExtensionRange>,
-    oneof_decl: ::protobuf::RepeatedField<OneofDescriptorProto>,
-    options: ::protobuf::SingularPtrField<MessageOptions>,
-    reserved_range: ::protobuf::RepeatedField<DescriptorProto_ReservedRange>,
-    reserved_name: ::protobuf::RepeatedField<::std::string::String>,
+    pub field: ::protobuf::RepeatedField<FieldDescriptorProto>,
+    pub extension: ::protobuf::RepeatedField<FieldDescriptorProto>,
+    pub nested_type: ::protobuf::RepeatedField<DescriptorProto>,
+    pub enum_type: ::protobuf::RepeatedField<EnumDescriptorProto>,
+    pub extension_range: ::protobuf::RepeatedField<DescriptorProto_ExtensionRange>,
+    pub oneof_decl: ::protobuf::RepeatedField<OneofDescriptorProto>,
+    pub options: ::protobuf::SingularPtrField<MessageOptions>,
+    pub reserved_range: ::protobuf::RepeatedField<DescriptorProto_ReservedRange>,
+    pub reserved_name: ::protobuf::RepeatedField<::std::string::String>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -1130,7 +1119,7 @@
 
 
     pub fn get_options(&self) -> &MessageOptions {
-        self.options.as_ref().unwrap_or_else(|| MessageOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <MessageOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -1413,7 +1402,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1426,74 +1415,70 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &DescriptorProto| { &m.name },
-                    |m: &mut DescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldDescriptorProto>>(
-                    "field",
-                    |m: &DescriptorProto| { &m.field },
-                    |m: &mut DescriptorProto| { &mut m.field },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldDescriptorProto>>(
-                    "extension",
-                    |m: &DescriptorProto| { &m.extension },
-                    |m: &mut DescriptorProto| { &mut m.extension },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto>>(
-                    "nested_type",
-                    |m: &DescriptorProto| { &m.nested_type },
-                    |m: &mut DescriptorProto| { &mut m.nested_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumDescriptorProto>>(
-                    "enum_type",
-                    |m: &DescriptorProto| { &m.enum_type },
-                    |m: &mut DescriptorProto| { &mut m.enum_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto_ExtensionRange>>(
-                    "extension_range",
-                    |m: &DescriptorProto| { &m.extension_range },
-                    |m: &mut DescriptorProto| { &mut m.extension_range },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<OneofDescriptorProto>>(
-                    "oneof_decl",
-                    |m: &DescriptorProto| { &m.oneof_decl },
-                    |m: &mut DescriptorProto| { &mut m.oneof_decl },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<MessageOptions>>(
-                    "options",
-                    |m: &DescriptorProto| { &m.options },
-                    |m: &mut DescriptorProto| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto_ReservedRange>>(
-                    "reserved_range",
-                    |m: &DescriptorProto| { &m.reserved_range },
-                    |m: &mut DescriptorProto| { &mut m.reserved_range },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "reserved_name",
-                    |m: &DescriptorProto| { &m.reserved_name },
-                    |m: &mut DescriptorProto| { &mut m.reserved_name },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<DescriptorProto>(
-                    "DescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &DescriptorProto| { &m.name },
+                |m: &mut DescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldDescriptorProto>>(
+                "field",
+                |m: &DescriptorProto| { &m.field },
+                |m: &mut DescriptorProto| { &mut m.field },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldDescriptorProto>>(
+                "extension",
+                |m: &DescriptorProto| { &m.extension },
+                |m: &mut DescriptorProto| { &mut m.extension },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto>>(
+                "nested_type",
+                |m: &DescriptorProto| { &m.nested_type },
+                |m: &mut DescriptorProto| { &mut m.nested_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumDescriptorProto>>(
+                "enum_type",
+                |m: &DescriptorProto| { &m.enum_type },
+                |m: &mut DescriptorProto| { &mut m.enum_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto_ExtensionRange>>(
+                "extension_range",
+                |m: &DescriptorProto| { &m.extension_range },
+                |m: &mut DescriptorProto| { &mut m.extension_range },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<OneofDescriptorProto>>(
+                "oneof_decl",
+                |m: &DescriptorProto| { &m.oneof_decl },
+                |m: &mut DescriptorProto| { &mut m.oneof_decl },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<MessageOptions>>(
+                "options",
+                |m: &DescriptorProto| { &m.options },
+                |m: &mut DescriptorProto| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<DescriptorProto_ReservedRange>>(
+                "reserved_range",
+                |m: &DescriptorProto| { &m.reserved_range },
+                |m: &mut DescriptorProto| { &mut m.reserved_range },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "reserved_name",
+                |m: &DescriptorProto| { &m.reserved_name },
+                |m: &mut DescriptorProto| { &mut m.reserved_name },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<DescriptorProto>(
+                "DescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static DescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<DescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(DescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<DescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(DescriptorProto::new)
     }
 }
 
@@ -1663,7 +1648,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1676,34 +1661,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "start",
-                    |m: &DescriptorProto_ExtensionRange| { &m.start },
-                    |m: &mut DescriptorProto_ExtensionRange| { &mut m.start },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "end",
-                    |m: &DescriptorProto_ExtensionRange| { &m.end },
-                    |m: &mut DescriptorProto_ExtensionRange| { &mut m.end },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<DescriptorProto_ExtensionRange>(
-                    "DescriptorProto.ExtensionRange",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "start",
+                |m: &DescriptorProto_ExtensionRange| { &m.start },
+                |m: &mut DescriptorProto_ExtensionRange| { &mut m.start },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "end",
+                |m: &DescriptorProto_ExtensionRange| { &m.end },
+                |m: &mut DescriptorProto_ExtensionRange| { &mut m.end },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<DescriptorProto_ExtensionRange>(
+                "DescriptorProto.ExtensionRange",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static DescriptorProto_ExtensionRange {
-        static mut instance: ::protobuf::lazy::Lazy<DescriptorProto_ExtensionRange> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(DescriptorProto_ExtensionRange::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<DescriptorProto_ExtensionRange> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(DescriptorProto_ExtensionRange::new)
     }
 }
 
@@ -1865,7 +1846,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1878,34 +1859,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "start",
-                    |m: &DescriptorProto_ReservedRange| { &m.start },
-                    |m: &mut DescriptorProto_ReservedRange| { &mut m.start },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "end",
-                    |m: &DescriptorProto_ReservedRange| { &m.end },
-                    |m: &mut DescriptorProto_ReservedRange| { &mut m.end },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<DescriptorProto_ReservedRange>(
-                    "DescriptorProto.ReservedRange",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "start",
+                |m: &DescriptorProto_ReservedRange| { &m.start },
+                |m: &mut DescriptorProto_ReservedRange| { &mut m.start },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "end",
+                |m: &DescriptorProto_ReservedRange| { &m.end },
+                |m: &mut DescriptorProto_ReservedRange| { &mut m.end },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<DescriptorProto_ReservedRange>(
+                "DescriptorProto.ReservedRange",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static DescriptorProto_ReservedRange {
-        static mut instance: ::protobuf::lazy::Lazy<DescriptorProto_ReservedRange> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(DescriptorProto_ReservedRange::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<DescriptorProto_ReservedRange> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(DescriptorProto_ReservedRange::new)
     }
 }
 
@@ -1942,7 +1919,7 @@
     default_value: ::protobuf::SingularField<::std::string::String>,
     oneof_index: ::std::option::Option<i32>,
     json_name: ::protobuf::SingularField<::std::string::String>,
-    options: ::protobuf::SingularPtrField<FieldOptions>,
+    pub options: ::protobuf::SingularPtrField<FieldOptions>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -2221,7 +2198,7 @@
 
 
     pub fn get_options(&self) -> &FieldOptions {
-        self.options.as_ref().unwrap_or_else(|| FieldOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <FieldOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -2359,10 +2336,10 @@
             os.write_int32(3, v)?;
         }
         if let Some(v) = self.label {
-            os.write_enum(4, v.value())?;
+            os.write_enum(4, ::protobuf::ProtobufEnum::value(&v))?;
         }
         if let Some(v) = self.field_type {
-            os.write_enum(5, v.value())?;
+            os.write_enum(5, ::protobuf::ProtobufEnum::value(&v))?;
         }
         if let Some(ref v) = self.type_name.as_ref() {
             os.write_string(6, &v)?;
@@ -2406,7 +2383,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -2419,74 +2396,70 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &FieldDescriptorProto| { &m.name },
-                    |m: &mut FieldDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "number",
-                    |m: &FieldDescriptorProto| { &m.number },
-                    |m: &mut FieldDescriptorProto| { &mut m.number },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldDescriptorProto_Label>>(
-                    "label",
-                    |m: &FieldDescriptorProto| { &m.label },
-                    |m: &mut FieldDescriptorProto| { &mut m.label },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldDescriptorProto_Type>>(
-                    "type",
-                    |m: &FieldDescriptorProto| { &m.field_type },
-                    |m: &mut FieldDescriptorProto| { &mut m.field_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "type_name",
-                    |m: &FieldDescriptorProto| { &m.type_name },
-                    |m: &mut FieldDescriptorProto| { &mut m.type_name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "extendee",
-                    |m: &FieldDescriptorProto| { &m.extendee },
-                    |m: &mut FieldDescriptorProto| { &mut m.extendee },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "default_value",
-                    |m: &FieldDescriptorProto| { &m.default_value },
-                    |m: &mut FieldDescriptorProto| { &mut m.default_value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "oneof_index",
-                    |m: &FieldDescriptorProto| { &m.oneof_index },
-                    |m: &mut FieldDescriptorProto| { &mut m.oneof_index },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "json_name",
-                    |m: &FieldDescriptorProto| { &m.json_name },
-                    |m: &mut FieldDescriptorProto| { &mut m.json_name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldOptions>>(
-                    "options",
-                    |m: &FieldDescriptorProto| { &m.options },
-                    |m: &mut FieldDescriptorProto| { &mut m.options },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldDescriptorProto>(
-                    "FieldDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &FieldDescriptorProto| { &m.name },
+                |m: &mut FieldDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "number",
+                |m: &FieldDescriptorProto| { &m.number },
+                |m: &mut FieldDescriptorProto| { &mut m.number },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldDescriptorProto_Label>>(
+                "label",
+                |m: &FieldDescriptorProto| { &m.label },
+                |m: &mut FieldDescriptorProto| { &mut m.label },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldDescriptorProto_Type>>(
+                "type",
+                |m: &FieldDescriptorProto| { &m.field_type },
+                |m: &mut FieldDescriptorProto| { &mut m.field_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "type_name",
+                |m: &FieldDescriptorProto| { &m.type_name },
+                |m: &mut FieldDescriptorProto| { &mut m.type_name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "extendee",
+                |m: &FieldDescriptorProto| { &m.extendee },
+                |m: &mut FieldDescriptorProto| { &mut m.extendee },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "default_value",
+                |m: &FieldDescriptorProto| { &m.default_value },
+                |m: &mut FieldDescriptorProto| { &mut m.default_value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "oneof_index",
+                |m: &FieldDescriptorProto| { &m.oneof_index },
+                |m: &mut FieldDescriptorProto| { &mut m.oneof_index },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "json_name",
+                |m: &FieldDescriptorProto| { &m.json_name },
+                |m: &mut FieldDescriptorProto| { &mut m.json_name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldOptions>>(
+                "options",
+                |m: &FieldDescriptorProto| { &m.options },
+                |m: &mut FieldDescriptorProto| { &mut m.options },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldDescriptorProto>(
+                "FieldDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FieldDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<FieldDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FieldDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FieldDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FieldDescriptorProto::new)
     }
 }
 
@@ -2595,12 +2568,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldDescriptorProto_Type>("FieldDescriptorProto.Type", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldDescriptorProto_Type>("FieldDescriptorProto.Type", file_descriptor_proto())
+        })
     }
 }
 
@@ -2616,7 +2587,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for FieldDescriptorProto_Type {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -2652,12 +2623,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldDescriptorProto_Label>("FieldDescriptorProto.Label", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldDescriptorProto_Label>("FieldDescriptorProto.Label", file_descriptor_proto())
+        })
     }
 }
 
@@ -2673,7 +2642,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for FieldDescriptorProto_Label {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -2682,7 +2651,7 @@
 pub struct OneofDescriptorProto {
     // message fields
     name: ::protobuf::SingularField<::std::string::String>,
-    options: ::protobuf::SingularPtrField<OneofOptions>,
+    pub options: ::protobuf::SingularPtrField<OneofOptions>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -2741,7 +2710,7 @@
 
 
     pub fn get_options(&self) -> &OneofOptions {
-        self.options.as_ref().unwrap_or_else(|| OneofOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <OneofOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -2846,7 +2815,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -2859,34 +2828,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &OneofDescriptorProto| { &m.name },
-                    |m: &mut OneofDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<OneofOptions>>(
-                    "options",
-                    |m: &OneofDescriptorProto| { &m.options },
-                    |m: &mut OneofDescriptorProto| { &mut m.options },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<OneofDescriptorProto>(
-                    "OneofDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &OneofDescriptorProto| { &m.name },
+                |m: &mut OneofDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<OneofOptions>>(
+                "options",
+                |m: &OneofDescriptorProto| { &m.options },
+                |m: &mut OneofDescriptorProto| { &mut m.options },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<OneofDescriptorProto>(
+                "OneofDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static OneofDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<OneofDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(OneofDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<OneofDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(OneofDescriptorProto::new)
     }
 }
 
@@ -2915,8 +2880,8 @@
 pub struct EnumDescriptorProto {
     // message fields
     name: ::protobuf::SingularField<::std::string::String>,
-    value: ::protobuf::RepeatedField<EnumValueDescriptorProto>,
-    options: ::protobuf::SingularPtrField<EnumOptions>,
+    pub value: ::protobuf::RepeatedField<EnumValueDescriptorProto>,
+    pub options: ::protobuf::SingularPtrField<EnumOptions>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -3000,7 +2965,7 @@
 
 
     pub fn get_options(&self) -> &EnumOptions {
-        self.options.as_ref().unwrap_or_else(|| EnumOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <EnumOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -3122,7 +3087,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -3135,39 +3100,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &EnumDescriptorProto| { &m.name },
-                    |m: &mut EnumDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumValueDescriptorProto>>(
-                    "value",
-                    |m: &EnumDescriptorProto| { &m.value },
-                    |m: &mut EnumDescriptorProto| { &mut m.value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumOptions>>(
-                    "options",
-                    |m: &EnumDescriptorProto| { &m.options },
-                    |m: &mut EnumDescriptorProto| { &mut m.options },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumDescriptorProto>(
-                    "EnumDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &EnumDescriptorProto| { &m.name },
+                |m: &mut EnumDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumValueDescriptorProto>>(
+                "value",
+                |m: &EnumDescriptorProto| { &m.value },
+                |m: &mut EnumDescriptorProto| { &mut m.value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumOptions>>(
+                "options",
+                |m: &EnumDescriptorProto| { &m.options },
+                |m: &mut EnumDescriptorProto| { &mut m.options },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumDescriptorProto>(
+                "EnumDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static EnumDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<EnumDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(EnumDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<EnumDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(EnumDescriptorProto::new)
     }
 }
 
@@ -3198,7 +3159,7 @@
     // message fields
     name: ::protobuf::SingularField<::std::string::String>,
     number: ::std::option::Option<i32>,
-    options: ::protobuf::SingularPtrField<EnumValueOptions>,
+    pub options: ::protobuf::SingularPtrField<EnumValueOptions>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -3276,7 +3237,7 @@
 
 
     pub fn get_options(&self) -> &EnumValueOptions {
-        self.options.as_ref().unwrap_or_else(|| EnumValueOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <EnumValueOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -3394,7 +3355,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -3407,39 +3368,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &EnumValueDescriptorProto| { &m.name },
-                    |m: &mut EnumValueDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "number",
-                    |m: &EnumValueDescriptorProto| { &m.number },
-                    |m: &mut EnumValueDescriptorProto| { &mut m.number },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumValueOptions>>(
-                    "options",
-                    |m: &EnumValueDescriptorProto| { &m.options },
-                    |m: &mut EnumValueDescriptorProto| { &mut m.options },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumValueDescriptorProto>(
-                    "EnumValueDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &EnumValueDescriptorProto| { &m.name },
+                |m: &mut EnumValueDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "number",
+                |m: &EnumValueDescriptorProto| { &m.number },
+                |m: &mut EnumValueDescriptorProto| { &mut m.number },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumValueOptions>>(
+                "options",
+                |m: &EnumValueDescriptorProto| { &m.options },
+                |m: &mut EnumValueDescriptorProto| { &mut m.options },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumValueDescriptorProto>(
+                "EnumValueDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static EnumValueDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<EnumValueDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(EnumValueDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<EnumValueDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(EnumValueDescriptorProto::new)
     }
 }
 
@@ -3469,8 +3426,8 @@
 pub struct ServiceDescriptorProto {
     // message fields
     name: ::protobuf::SingularField<::std::string::String>,
-    method: ::protobuf::RepeatedField<MethodDescriptorProto>,
-    options: ::protobuf::SingularPtrField<ServiceOptions>,
+    pub method: ::protobuf::RepeatedField<MethodDescriptorProto>,
+    pub options: ::protobuf::SingularPtrField<ServiceOptions>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -3554,7 +3511,7 @@
 
 
     pub fn get_options(&self) -> &ServiceOptions {
-        self.options.as_ref().unwrap_or_else(|| ServiceOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <ServiceOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -3676,7 +3633,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -3689,39 +3646,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &ServiceDescriptorProto| { &m.name },
-                    |m: &mut ServiceDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<MethodDescriptorProto>>(
-                    "method",
-                    |m: &ServiceDescriptorProto| { &m.method },
-                    |m: &mut ServiceDescriptorProto| { &mut m.method },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<ServiceOptions>>(
-                    "options",
-                    |m: &ServiceDescriptorProto| { &m.options },
-                    |m: &mut ServiceDescriptorProto| { &mut m.options },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<ServiceDescriptorProto>(
-                    "ServiceDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &ServiceDescriptorProto| { &m.name },
+                |m: &mut ServiceDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<MethodDescriptorProto>>(
+                "method",
+                |m: &ServiceDescriptorProto| { &m.method },
+                |m: &mut ServiceDescriptorProto| { &mut m.method },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<ServiceOptions>>(
+                "options",
+                |m: &ServiceDescriptorProto| { &m.options },
+                |m: &mut ServiceDescriptorProto| { &mut m.options },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<ServiceDescriptorProto>(
+                "ServiceDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static ServiceDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<ServiceDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(ServiceDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<ServiceDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(ServiceDescriptorProto::new)
     }
 }
 
@@ -3753,7 +3706,7 @@
     name: ::protobuf::SingularField<::std::string::String>,
     input_type: ::protobuf::SingularField<::std::string::String>,
     output_type: ::protobuf::SingularField<::std::string::String>,
-    options: ::protobuf::SingularPtrField<MethodOptions>,
+    pub options: ::protobuf::SingularPtrField<MethodOptions>,
     client_streaming: ::std::option::Option<bool>,
     server_streaming: ::std::option::Option<bool>,
     // special fields
@@ -3886,7 +3839,7 @@
 
 
     pub fn get_options(&self) -> &MethodOptions {
-        self.options.as_ref().unwrap_or_else(|| MethodOptions::default_instance())
+        self.options.as_ref().unwrap_or_else(|| <MethodOptions as ::protobuf::Message>::default_instance())
     }
     pub fn clear_options(&mut self) {
         self.options.clear();
@@ -4073,7 +4026,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -4086,54 +4039,50 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &MethodDescriptorProto| { &m.name },
-                    |m: &mut MethodDescriptorProto| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "input_type",
-                    |m: &MethodDescriptorProto| { &m.input_type },
-                    |m: &mut MethodDescriptorProto| { &mut m.input_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "output_type",
-                    |m: &MethodDescriptorProto| { &m.output_type },
-                    |m: &mut MethodDescriptorProto| { &mut m.output_type },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<MethodOptions>>(
-                    "options",
-                    |m: &MethodDescriptorProto| { &m.options },
-                    |m: &mut MethodDescriptorProto| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "client_streaming",
-                    |m: &MethodDescriptorProto| { &m.client_streaming },
-                    |m: &mut MethodDescriptorProto| { &mut m.client_streaming },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "server_streaming",
-                    |m: &MethodDescriptorProto| { &m.server_streaming },
-                    |m: &mut MethodDescriptorProto| { &mut m.server_streaming },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<MethodDescriptorProto>(
-                    "MethodDescriptorProto",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &MethodDescriptorProto| { &m.name },
+                |m: &mut MethodDescriptorProto| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "input_type",
+                |m: &MethodDescriptorProto| { &m.input_type },
+                |m: &mut MethodDescriptorProto| { &mut m.input_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "output_type",
+                |m: &MethodDescriptorProto| { &m.output_type },
+                |m: &mut MethodDescriptorProto| { &mut m.output_type },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<MethodOptions>>(
+                "options",
+                |m: &MethodDescriptorProto| { &m.options },
+                |m: &mut MethodDescriptorProto| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "client_streaming",
+                |m: &MethodDescriptorProto| { &m.client_streaming },
+                |m: &mut MethodDescriptorProto| { &mut m.client_streaming },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "server_streaming",
+                |m: &MethodDescriptorProto| { &m.server_streaming },
+                |m: &mut MethodDescriptorProto| { &mut m.server_streaming },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<MethodDescriptorProto>(
+                "MethodDescriptorProto",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static MethodDescriptorProto {
-        static mut instance: ::protobuf::lazy::Lazy<MethodDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(MethodDescriptorProto::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<MethodDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(MethodDescriptorProto::new)
     }
 }
 
@@ -4179,7 +4128,7 @@
     cc_enable_arenas: ::std::option::Option<bool>,
     objc_class_prefix: ::protobuf::SingularField<::std::string::String>,
     csharp_namespace: ::protobuf::SingularField<::std::string::String>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -4746,7 +4695,7 @@
             os.write_bool(27, v)?;
         }
         if let Some(v) = self.optimize_for {
-            os.write_enum(9, v.value())?;
+            os.write_enum(9, ::protobuf::ProtobufEnum::value(&v))?;
         }
         if let Some(ref v) = self.go_package.as_ref() {
             os.write_string(11, &v)?;
@@ -4799,7 +4748,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -4812,99 +4761,95 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "java_package",
-                    |m: &FileOptions| { &m.java_package },
-                    |m: &mut FileOptions| { &mut m.java_package },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "java_outer_classname",
-                    |m: &FileOptions| { &m.java_outer_classname },
-                    |m: &mut FileOptions| { &mut m.java_outer_classname },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "java_multiple_files",
-                    |m: &FileOptions| { &m.java_multiple_files },
-                    |m: &mut FileOptions| { &mut m.java_multiple_files },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::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(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "java_string_check_utf8",
-                    |m: &FileOptions| { &m.java_string_check_utf8 },
-                    |m: &mut FileOptions| { &mut m.java_string_check_utf8 },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FileOptions_OptimizeMode>>(
-                    "optimize_for",
-                    |m: &FileOptions| { &m.optimize_for },
-                    |m: &mut FileOptions| { &mut m.optimize_for },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "go_package",
-                    |m: &FileOptions| { &m.go_package },
-                    |m: &mut FileOptions| { &mut m.go_package },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "cc_generic_services",
-                    |m: &FileOptions| { &m.cc_generic_services },
-                    |m: &mut FileOptions| { &mut m.cc_generic_services },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "java_generic_services",
-                    |m: &FileOptions| { &m.java_generic_services },
-                    |m: &mut FileOptions| { &mut m.java_generic_services },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "py_generic_services",
-                    |m: &FileOptions| { &m.py_generic_services },
-                    |m: &mut FileOptions| { &mut m.py_generic_services },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &FileOptions| { &m.deprecated },
-                    |m: &mut FileOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "cc_enable_arenas",
-                    |m: &FileOptions| { &m.cc_enable_arenas },
-                    |m: &mut FileOptions| { &mut m.cc_enable_arenas },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "objc_class_prefix",
-                    |m: &FileOptions| { &m.objc_class_prefix },
-                    |m: &mut FileOptions| { &mut m.objc_class_prefix },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "csharp_namespace",
-                    |m: &FileOptions| { &m.csharp_namespace },
-                    |m: &mut FileOptions| { &mut m.csharp_namespace },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &FileOptions| { &m.uninterpreted_option },
-                    |m: &mut FileOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FileOptions>(
-                    "FileOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "java_package",
+                |m: &FileOptions| { &m.java_package },
+                |m: &mut FileOptions| { &mut m.java_package },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "java_outer_classname",
+                |m: &FileOptions| { &m.java_outer_classname },
+                |m: &mut FileOptions| { &mut m.java_outer_classname },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "java_multiple_files",
+                |m: &FileOptions| { &m.java_multiple_files },
+                |m: &mut FileOptions| { &mut m.java_multiple_files },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::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(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "java_string_check_utf8",
+                |m: &FileOptions| { &m.java_string_check_utf8 },
+                |m: &mut FileOptions| { &mut m.java_string_check_utf8 },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FileOptions_OptimizeMode>>(
+                "optimize_for",
+                |m: &FileOptions| { &m.optimize_for },
+                |m: &mut FileOptions| { &mut m.optimize_for },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "go_package",
+                |m: &FileOptions| { &m.go_package },
+                |m: &mut FileOptions| { &mut m.go_package },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "cc_generic_services",
+                |m: &FileOptions| { &m.cc_generic_services },
+                |m: &mut FileOptions| { &mut m.cc_generic_services },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "java_generic_services",
+                |m: &FileOptions| { &m.java_generic_services },
+                |m: &mut FileOptions| { &mut m.java_generic_services },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "py_generic_services",
+                |m: &FileOptions| { &m.py_generic_services },
+                |m: &mut FileOptions| { &mut m.py_generic_services },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &FileOptions| { &m.deprecated },
+                |m: &mut FileOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "cc_enable_arenas",
+                |m: &FileOptions| { &m.cc_enable_arenas },
+                |m: &mut FileOptions| { &mut m.cc_enable_arenas },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "objc_class_prefix",
+                |m: &FileOptions| { &m.objc_class_prefix },
+                |m: &mut FileOptions| { &mut m.objc_class_prefix },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "csharp_namespace",
+                |m: &FileOptions| { &m.csharp_namespace },
+                |m: &mut FileOptions| { &mut m.csharp_namespace },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &FileOptions| { &m.uninterpreted_option },
+                |m: &mut FileOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FileOptions>(
+                "FileOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FileOptions {
-        static mut instance: ::protobuf::lazy::Lazy<FileOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FileOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FileOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FileOptions::new)
     }
 }
 
@@ -4973,12 +4918,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<FileOptions_OptimizeMode>("FileOptions.OptimizeMode", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FileOptions_OptimizeMode>("FileOptions.OptimizeMode", file_descriptor_proto())
+        })
     }
 }
 
@@ -4994,7 +4937,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for FileOptions_OptimizeMode {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -5006,7 +4949,7 @@
     no_standard_descriptor_accessor: ::std::option::Option<bool>,
     deprecated: ::std::option::Option<bool>,
     map_entry: ::std::option::Option<bool>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -5245,7 +5188,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -5258,49 +5201,45 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "message_set_wire_format",
-                    |m: &MessageOptions| { &m.message_set_wire_format },
-                    |m: &mut MessageOptions| { &mut m.message_set_wire_format },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "no_standard_descriptor_accessor",
-                    |m: &MessageOptions| { &m.no_standard_descriptor_accessor },
-                    |m: &mut MessageOptions| { &mut m.no_standard_descriptor_accessor },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &MessageOptions| { &m.deprecated },
-                    |m: &mut MessageOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "map_entry",
-                    |m: &MessageOptions| { &m.map_entry },
-                    |m: &mut MessageOptions| { &mut m.map_entry },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &MessageOptions| { &m.uninterpreted_option },
-                    |m: &mut MessageOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<MessageOptions>(
-                    "MessageOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "message_set_wire_format",
+                |m: &MessageOptions| { &m.message_set_wire_format },
+                |m: &mut MessageOptions| { &mut m.message_set_wire_format },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "no_standard_descriptor_accessor",
+                |m: &MessageOptions| { &m.no_standard_descriptor_accessor },
+                |m: &mut MessageOptions| { &mut m.no_standard_descriptor_accessor },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &MessageOptions| { &m.deprecated },
+                |m: &mut MessageOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "map_entry",
+                |m: &MessageOptions| { &m.map_entry },
+                |m: &mut MessageOptions| { &mut m.map_entry },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &MessageOptions| { &m.uninterpreted_option },
+                |m: &mut MessageOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<MessageOptions>(
+                "MessageOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static MessageOptions {
-        static mut instance: ::protobuf::lazy::Lazy<MessageOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(MessageOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<MessageOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(MessageOptions::new)
     }
 }
 
@@ -5337,7 +5276,7 @@
     lazy: ::std::option::Option<bool>,
     deprecated: ::std::option::Option<bool>,
     weak: ::std::option::Option<bool>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -5588,13 +5527,13 @@
 
     fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
         if let Some(v) = self.ctype {
-            os.write_enum(1, v.value())?;
+            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
         }
         if let Some(v) = self.packed {
             os.write_bool(2, v)?;
         }
         if let Some(v) = self.jstype {
-            os.write_enum(6, v.value())?;
+            os.write_enum(6, ::protobuf::ProtobufEnum::value(&v))?;
         }
         if let Some(v) = self.lazy {
             os.write_bool(5, v)?;
@@ -5632,7 +5571,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -5645,59 +5584,55 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldOptions_CType>>(
-                    "ctype",
-                    |m: &FieldOptions| { &m.ctype },
-                    |m: &mut FieldOptions| { &mut m.ctype },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "packed",
-                    |m: &FieldOptions| { &m.packed },
-                    |m: &mut FieldOptions| { &mut m.packed },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldOptions_JSType>>(
-                    "jstype",
-                    |m: &FieldOptions| { &m.jstype },
-                    |m: &mut FieldOptions| { &mut m.jstype },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "lazy",
-                    |m: &FieldOptions| { &m.lazy },
-                    |m: &mut FieldOptions| { &mut m.lazy },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &FieldOptions| { &m.deprecated },
-                    |m: &mut FieldOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "weak",
-                    |m: &FieldOptions| { &m.weak },
-                    |m: &mut FieldOptions| { &mut m.weak },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &FieldOptions| { &m.uninterpreted_option },
-                    |m: &mut FieldOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldOptions>(
-                    "FieldOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldOptions_CType>>(
+                "ctype",
+                |m: &FieldOptions| { &m.ctype },
+                |m: &mut FieldOptions| { &mut m.ctype },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "packed",
+                |m: &FieldOptions| { &m.packed },
+                |m: &mut FieldOptions| { &mut m.packed },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldOptions_JSType>>(
+                "jstype",
+                |m: &FieldOptions| { &m.jstype },
+                |m: &mut FieldOptions| { &mut m.jstype },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "lazy",
+                |m: &FieldOptions| { &m.lazy },
+                |m: &mut FieldOptions| { &mut m.lazy },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &FieldOptions| { &m.deprecated },
+                |m: &mut FieldOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "weak",
+                |m: &FieldOptions| { &m.weak },
+                |m: &mut FieldOptions| { &mut m.weak },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &FieldOptions| { &m.uninterpreted_option },
+                |m: &mut FieldOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldOptions>(
+                "FieldOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FieldOptions {
-        static mut instance: ::protobuf::lazy::Lazy<FieldOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FieldOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FieldOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FieldOptions::new)
     }
 }
 
@@ -5758,12 +5693,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldOptions_CType>("FieldOptions.CType", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldOptions_CType>("FieldOptions.CType", file_descriptor_proto())
+        })
     }
 }
 
@@ -5778,7 +5711,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for FieldOptions_CType {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -5814,12 +5747,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldOptions_JSType>("FieldOptions.JSType", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldOptions_JSType>("FieldOptions.JSType", file_descriptor_proto())
+        })
     }
 }
 
@@ -5834,7 +5765,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for FieldOptions_JSType {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -5842,7 +5773,7 @@
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct OneofOptions {
     // message fields
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -5953,7 +5884,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -5966,29 +5897,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &OneofOptions| { &m.uninterpreted_option },
-                    |m: &mut OneofOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<OneofOptions>(
-                    "OneofOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &OneofOptions| { &m.uninterpreted_option },
+                |m: &mut OneofOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<OneofOptions>(
+                "OneofOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static OneofOptions {
-        static mut instance: ::protobuf::lazy::Lazy<OneofOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(OneofOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<OneofOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(OneofOptions::new)
     }
 }
 
@@ -6017,7 +5944,7 @@
     // message fields
     allow_alias: ::std::option::Option<bool>,
     deprecated: ::std::option::Option<bool>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -6192,7 +6119,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -6205,39 +6132,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "allow_alias",
-                    |m: &EnumOptions| { &m.allow_alias },
-                    |m: &mut EnumOptions| { &mut m.allow_alias },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &EnumOptions| { &m.deprecated },
-                    |m: &mut EnumOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &EnumOptions| { &m.uninterpreted_option },
-                    |m: &mut EnumOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumOptions>(
-                    "EnumOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "allow_alias",
+                |m: &EnumOptions| { &m.allow_alias },
+                |m: &mut EnumOptions| { &mut m.allow_alias },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &EnumOptions| { &m.deprecated },
+                |m: &mut EnumOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &EnumOptions| { &m.uninterpreted_option },
+                |m: &mut EnumOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumOptions>(
+                "EnumOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static EnumOptions {
-        static mut instance: ::protobuf::lazy::Lazy<EnumOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(EnumOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<EnumOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(EnumOptions::new)
     }
 }
 
@@ -6267,7 +6190,7 @@
 pub struct EnumValueOptions {
     // message fields
     deprecated: ::std::option::Option<bool>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -6410,7 +6333,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -6423,34 +6346,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &EnumValueOptions| { &m.deprecated },
-                    |m: &mut EnumValueOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &EnumValueOptions| { &m.uninterpreted_option },
-                    |m: &mut EnumValueOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumValueOptions>(
-                    "EnumValueOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &EnumValueOptions| { &m.deprecated },
+                |m: &mut EnumValueOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &EnumValueOptions| { &m.uninterpreted_option },
+                |m: &mut EnumValueOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumValueOptions>(
+                "EnumValueOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static EnumValueOptions {
-        static mut instance: ::protobuf::lazy::Lazy<EnumValueOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(EnumValueOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<EnumValueOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(EnumValueOptions::new)
     }
 }
 
@@ -6479,7 +6398,7 @@
 pub struct ServiceOptions {
     // message fields
     deprecated: ::std::option::Option<bool>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -6622,7 +6541,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -6635,34 +6554,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &ServiceOptions| { &m.deprecated },
-                    |m: &mut ServiceOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &ServiceOptions| { &m.uninterpreted_option },
-                    |m: &mut ServiceOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<ServiceOptions>(
-                    "ServiceOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &ServiceOptions| { &m.deprecated },
+                |m: &mut ServiceOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &ServiceOptions| { &m.uninterpreted_option },
+                |m: &mut ServiceOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<ServiceOptions>(
+                "ServiceOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static ServiceOptions {
-        static mut instance: ::protobuf::lazy::Lazy<ServiceOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(ServiceOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<ServiceOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(ServiceOptions::new)
     }
 }
 
@@ -6691,7 +6606,7 @@
 pub struct MethodOptions {
     // message fields
     deprecated: ::std::option::Option<bool>,
-    uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
+    pub uninterpreted_option: ::protobuf::RepeatedField<UninterpretedOption>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -6834,7 +6749,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -6847,34 +6762,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "deprecated",
-                    |m: &MethodOptions| { &m.deprecated },
-                    |m: &mut MethodOptions| { &mut m.deprecated },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
-                    "uninterpreted_option",
-                    |m: &MethodOptions| { &m.uninterpreted_option },
-                    |m: &mut MethodOptions| { &mut m.uninterpreted_option },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<MethodOptions>(
-                    "MethodOptions",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "deprecated",
+                |m: &MethodOptions| { &m.deprecated },
+                |m: &mut MethodOptions| { &mut m.deprecated },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption>>(
+                "uninterpreted_option",
+                |m: &MethodOptions| { &m.uninterpreted_option },
+                |m: &mut MethodOptions| { &mut m.uninterpreted_option },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<MethodOptions>(
+                "MethodOptions",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static MethodOptions {
-        static mut instance: ::protobuf::lazy::Lazy<MethodOptions> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(MethodOptions::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<MethodOptions> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(MethodOptions::new)
     }
 }
 
@@ -6902,7 +6813,7 @@
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct UninterpretedOption {
     // message fields
-    name: ::protobuf::RepeatedField<UninterpretedOption_NamePart>,
+    pub name: ::protobuf::RepeatedField<UninterpretedOption_NamePart>,
     identifier_value: ::protobuf::SingularField<::std::string::String>,
     positive_int_value: ::std::option::Option<u64>,
     negative_int_value: ::std::option::Option<i64>,
@@ -7250,7 +7161,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -7263,59 +7174,55 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption_NamePart>>(
-                    "name",
-                    |m: &UninterpretedOption| { &m.name },
-                    |m: &mut UninterpretedOption| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "identifier_value",
-                    |m: &UninterpretedOption| { &m.identifier_value },
-                    |m: &mut UninterpretedOption| { &mut m.identifier_value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeUint64>(
-                    "positive_int_value",
-                    |m: &UninterpretedOption| { &m.positive_int_value },
-                    |m: &mut UninterpretedOption| { &mut m.positive_int_value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "negative_int_value",
-                    |m: &UninterpretedOption| { &m.negative_int_value },
-                    |m: &mut UninterpretedOption| { &mut m.negative_int_value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeDouble>(
-                    "double_value",
-                    |m: &UninterpretedOption| { &m.double_value },
-                    |m: &mut UninterpretedOption| { &mut m.double_value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
-                    "string_value",
-                    |m: &UninterpretedOption| { &m.string_value },
-                    |m: &mut UninterpretedOption| { &mut m.string_value },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "aggregate_value",
-                    |m: &UninterpretedOption| { &m.aggregate_value },
-                    |m: &mut UninterpretedOption| { &mut m.aggregate_value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<UninterpretedOption>(
-                    "UninterpretedOption",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<UninterpretedOption_NamePart>>(
+                "name",
+                |m: &UninterpretedOption| { &m.name },
+                |m: &mut UninterpretedOption| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "identifier_value",
+                |m: &UninterpretedOption| { &m.identifier_value },
+                |m: &mut UninterpretedOption| { &mut m.identifier_value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeUint64>(
+                "positive_int_value",
+                |m: &UninterpretedOption| { &m.positive_int_value },
+                |m: &mut UninterpretedOption| { &mut m.positive_int_value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
+                "negative_int_value",
+                |m: &UninterpretedOption| { &m.negative_int_value },
+                |m: &mut UninterpretedOption| { &mut m.negative_int_value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeDouble>(
+                "double_value",
+                |m: &UninterpretedOption| { &m.double_value },
+                |m: &mut UninterpretedOption| { &mut m.double_value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
+                "string_value",
+                |m: &UninterpretedOption| { &m.string_value },
+                |m: &mut UninterpretedOption| { &mut m.string_value },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "aggregate_value",
+                |m: &UninterpretedOption| { &m.aggregate_value },
+                |m: &mut UninterpretedOption| { &mut m.aggregate_value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<UninterpretedOption>(
+                "UninterpretedOption",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static UninterpretedOption {
-        static mut instance: ::protobuf::lazy::Lazy<UninterpretedOption> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(UninterpretedOption::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<UninterpretedOption> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(UninterpretedOption::new)
     }
 }
 
@@ -7501,7 +7408,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -7514,34 +7421,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name_part",
-                    |m: &UninterpretedOption_NamePart| { &m.name_part },
-                    |m: &mut UninterpretedOption_NamePart| { &mut m.name_part },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "is_extension",
-                    |m: &UninterpretedOption_NamePart| { &m.is_extension },
-                    |m: &mut UninterpretedOption_NamePart| { &mut m.is_extension },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<UninterpretedOption_NamePart>(
-                    "UninterpretedOption.NamePart",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name_part",
+                |m: &UninterpretedOption_NamePart| { &m.name_part },
+                |m: &mut UninterpretedOption_NamePart| { &mut m.name_part },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "is_extension",
+                |m: &UninterpretedOption_NamePart| { &m.is_extension },
+                |m: &mut UninterpretedOption_NamePart| { &mut m.is_extension },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<UninterpretedOption_NamePart>(
+                "UninterpretedOption.NamePart",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static UninterpretedOption_NamePart {
-        static mut instance: ::protobuf::lazy::Lazy<UninterpretedOption_NamePart> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(UninterpretedOption_NamePart::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<UninterpretedOption_NamePart> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(UninterpretedOption_NamePart::new)
     }
 }
 
@@ -7569,7 +7472,7 @@
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct SourceCodeInfo {
     // message fields
-    location: ::protobuf::RepeatedField<SourceCodeInfo_Location>,
+    pub location: ::protobuf::RepeatedField<SourceCodeInfo_Location>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -7680,7 +7583,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -7693,29 +7596,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<SourceCodeInfo_Location>>(
-                    "location",
-                    |m: &SourceCodeInfo| { &m.location },
-                    |m: &mut SourceCodeInfo| { &mut m.location },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<SourceCodeInfo>(
-                    "SourceCodeInfo",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<SourceCodeInfo_Location>>(
+                "location",
+                |m: &SourceCodeInfo| { &m.location },
+                |m: &mut SourceCodeInfo| { &mut m.location },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<SourceCodeInfo>(
+                "SourceCodeInfo",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static SourceCodeInfo {
-        static mut instance: ::protobuf::lazy::Lazy<SourceCodeInfo> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(SourceCodeInfo::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<SourceCodeInfo> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(SourceCodeInfo::new)
     }
 }
 
@@ -7742,11 +7641,11 @@
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct SourceCodeInfo_Location {
     // message fields
-    path: ::std::vec::Vec<i32>,
-    span: ::std::vec::Vec<i32>,
+    pub path: ::std::vec::Vec<i32>,
+    pub span: ::std::vec::Vec<i32>,
     leading_comments: ::protobuf::SingularField<::std::string::String>,
     trailing_comments: ::protobuf::SingularField<::std::string::String>,
-    leading_detached_comments: ::protobuf::RepeatedField<::std::string::String>,
+    pub leading_detached_comments: ::protobuf::RepeatedField<::std::string::String>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -8017,7 +7916,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -8030,49 +7929,45 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "path",
-                    |m: &SourceCodeInfo_Location| { &m.path },
-                    |m: &mut SourceCodeInfo_Location| { &mut m.path },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "span",
-                    |m: &SourceCodeInfo_Location| { &m.span },
-                    |m: &mut SourceCodeInfo_Location| { &mut m.span },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "leading_comments",
-                    |m: &SourceCodeInfo_Location| { &m.leading_comments },
-                    |m: &mut SourceCodeInfo_Location| { &mut m.leading_comments },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "trailing_comments",
-                    |m: &SourceCodeInfo_Location| { &m.trailing_comments },
-                    |m: &mut SourceCodeInfo_Location| { &mut m.trailing_comments },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "leading_detached_comments",
-                    |m: &SourceCodeInfo_Location| { &m.leading_detached_comments },
-                    |m: &mut SourceCodeInfo_Location| { &mut m.leading_detached_comments },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<SourceCodeInfo_Location>(
-                    "SourceCodeInfo.Location",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "path",
+                |m: &SourceCodeInfo_Location| { &m.path },
+                |m: &mut SourceCodeInfo_Location| { &mut m.path },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "span",
+                |m: &SourceCodeInfo_Location| { &m.span },
+                |m: &mut SourceCodeInfo_Location| { &mut m.span },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "leading_comments",
+                |m: &SourceCodeInfo_Location| { &m.leading_comments },
+                |m: &mut SourceCodeInfo_Location| { &mut m.leading_comments },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "trailing_comments",
+                |m: &SourceCodeInfo_Location| { &m.trailing_comments },
+                |m: &mut SourceCodeInfo_Location| { &mut m.trailing_comments },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "leading_detached_comments",
+                |m: &SourceCodeInfo_Location| { &m.leading_detached_comments },
+                |m: &mut SourceCodeInfo_Location| { &mut m.leading_detached_comments },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<SourceCodeInfo_Location>(
+                "SourceCodeInfo.Location",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static SourceCodeInfo_Location {
-        static mut instance: ::protobuf::lazy::Lazy<SourceCodeInfo_Location> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(SourceCodeInfo_Location::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<SourceCodeInfo_Location> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(SourceCodeInfo_Location::new)
     }
 }
 
@@ -8103,7 +7998,7 @@
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct GeneratedCodeInfo {
     // message fields
-    annotation: ::protobuf::RepeatedField<GeneratedCodeInfo_Annotation>,
+    pub annotation: ::protobuf::RepeatedField<GeneratedCodeInfo_Annotation>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -8214,7 +8109,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -8227,29 +8122,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<GeneratedCodeInfo_Annotation>>(
-                    "annotation",
-                    |m: &GeneratedCodeInfo| { &m.annotation },
-                    |m: &mut GeneratedCodeInfo| { &mut m.annotation },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<GeneratedCodeInfo>(
-                    "GeneratedCodeInfo",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<GeneratedCodeInfo_Annotation>>(
+                "annotation",
+                |m: &GeneratedCodeInfo| { &m.annotation },
+                |m: &mut GeneratedCodeInfo| { &mut m.annotation },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<GeneratedCodeInfo>(
+                "GeneratedCodeInfo",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static GeneratedCodeInfo {
-        static mut instance: ::protobuf::lazy::Lazy<GeneratedCodeInfo> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(GeneratedCodeInfo::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<GeneratedCodeInfo> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(GeneratedCodeInfo::new)
     }
 }
 
@@ -8276,7 +8167,7 @@
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct GeneratedCodeInfo_Annotation {
     // message fields
-    path: ::std::vec::Vec<i32>,
+    pub path: ::std::vec::Vec<i32>,
     source_file: ::protobuf::SingularField<::std::string::String>,
     begin: ::std::option::Option<i32>,
     end: ::std::option::Option<i32>,
@@ -8496,7 +8387,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -8509,44 +8400,40 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "path",
-                    |m: &GeneratedCodeInfo_Annotation| { &m.path },
-                    |m: &mut GeneratedCodeInfo_Annotation| { &mut m.path },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "source_file",
-                    |m: &GeneratedCodeInfo_Annotation| { &m.source_file },
-                    |m: &mut GeneratedCodeInfo_Annotation| { &mut m.source_file },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "begin",
-                    |m: &GeneratedCodeInfo_Annotation| { &m.begin },
-                    |m: &mut GeneratedCodeInfo_Annotation| { &mut m.begin },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "end",
-                    |m: &GeneratedCodeInfo_Annotation| { &m.end },
-                    |m: &mut GeneratedCodeInfo_Annotation| { &mut m.end },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<GeneratedCodeInfo_Annotation>(
-                    "GeneratedCodeInfo.Annotation",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "path",
+                |m: &GeneratedCodeInfo_Annotation| { &m.path },
+                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.path },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "source_file",
+                |m: &GeneratedCodeInfo_Annotation| { &m.source_file },
+                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.source_file },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "begin",
+                |m: &GeneratedCodeInfo_Annotation| { &m.begin },
+                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.begin },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_option_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "end",
+                |m: &GeneratedCodeInfo_Annotation| { &m.end },
+                |m: &mut GeneratedCodeInfo_Annotation| { &mut m.end },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<GeneratedCodeInfo_Annotation>(
+                "GeneratedCodeInfo.Annotation",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static GeneratedCodeInfo_Annotation {
-        static mut instance: ::protobuf::lazy::Lazy<GeneratedCodeInfo_Annotation> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(GeneratedCodeInfo_Annotation::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<GeneratedCodeInfo_Annotation> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(GeneratedCodeInfo_Annotation::new)
     }
 }
 
@@ -9837,16 +9724,14 @@
     \x03\x12\x04\xa1\x06\x19\x1a\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/lazy.rs b/src/lazy.rs
index b57d9f9..5b01502 100644
--- a/src/lazy.rs
+++ b/src/lazy.rs
@@ -1,10 +1,17 @@
 //! Lazily initialized data.
 //! Used in generated code.
 
+// 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"
+)]
 pub struct Lazy<T> {
     #[doc(hidden)]
     pub lock: sync::Once,
diff --git a/src/lazy_v2.rs b/src/lazy_v2.rs
new file mode 100644
index 0000000..4ba10a5
--- /dev/null
+++ b/src/lazy_v2.rs
@@ -0,0 +1,89 @@
+//! 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 super::LazyV2;
+    use std::sync::atomic::AtomicIsize;
+    use std::sync::atomic::Ordering;
+    use std::sync::Arc;
+    use std::sync::Barrier;
+    use std::thread;
+
+    #[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 515bba8..6f5068c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -48,8 +48,6 @@
 pub mod plugin;
 pub mod rustproto;
 
-mod any;
-
 mod clear;
 pub mod compiler_plugin;
 mod core;
@@ -57,6 +55,7 @@
 pub mod error;
 pub mod ext;
 pub mod lazy;
+mod lazy_v2;
 pub mod reflect;
 mod repeated;
 pub mod rt;
@@ -65,6 +64,7 @@
 pub mod text_format;
 pub mod types;
 pub mod well_known_types;
+mod well_known_types_util;
 
 // used by test
 #[cfg(test)]
@@ -75,7 +75,6 @@
 pub mod descriptorx;
 
 mod cached_size;
-#[cfg(feature = "bytes")]
 mod chars;
 #[doc(hidden)] // used by codegen
 pub mod rust;
diff --git a/src/plugin.rs b/src/plugin.rs
index ec24a8f..2cceeb9 100644
--- a/src/plugin.rs
+++ b/src/plugin.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,21 +15,17 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/compiler/plugin.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct CodeGeneratorRequest {
     // message fields
-    file_to_generate: ::protobuf::RepeatedField<::std::string::String>,
+    pub file_to_generate: ::protobuf::RepeatedField<::std::string::String>,
     parameter: ::protobuf::SingularField<::std::string::String>,
-    proto_file: ::protobuf::RepeatedField<::protobuf::descriptor::FileDescriptorProto>,
+    pub proto_file: ::protobuf::RepeatedField<::protobuf::descriptor::FileDescriptorProto>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -218,7 +215,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -231,39 +228,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "file_to_generate",
-                    |m: &CodeGeneratorRequest| { &m.file_to_generate },
-                    |m: &mut CodeGeneratorRequest| { &mut m.file_to_generate },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "parameter",
-                    |m: &CodeGeneratorRequest| { &m.parameter },
-                    |m: &mut CodeGeneratorRequest| { &mut m.parameter },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::descriptor::FileDescriptorProto>>(
-                    "proto_file",
-                    |m: &CodeGeneratorRequest| { &m.proto_file },
-                    |m: &mut CodeGeneratorRequest| { &mut m.proto_file },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorRequest>(
-                    "CodeGeneratorRequest",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "file_to_generate",
+                |m: &CodeGeneratorRequest| { &m.file_to_generate },
+                |m: &mut CodeGeneratorRequest| { &mut m.file_to_generate },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "parameter",
+                |m: &CodeGeneratorRequest| { &m.parameter },
+                |m: &mut CodeGeneratorRequest| { &mut m.parameter },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::descriptor::FileDescriptorProto>>(
+                "proto_file",
+                |m: &CodeGeneratorRequest| { &m.proto_file },
+                |m: &mut CodeGeneratorRequest| { &mut m.proto_file },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorRequest>(
+                "CodeGeneratorRequest",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static CodeGeneratorRequest {
-        static mut instance: ::protobuf::lazy::Lazy<CodeGeneratorRequest> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(CodeGeneratorRequest::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<CodeGeneratorRequest> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(CodeGeneratorRequest::new)
     }
 }
 
@@ -293,7 +286,7 @@
 pub struct CodeGeneratorResponse {
     // message fields
     error: ::protobuf::SingularField<::std::string::String>,
-    file: ::protobuf::RepeatedField<CodeGeneratorResponse_File>,
+    pub file: ::protobuf::RepeatedField<CodeGeneratorResponse_File>,
     // special fields
     #[cfg_attr(feature = "with-serde", serde(skip))]
     pub unknown_fields: ::protobuf::UnknownFields,
@@ -449,7 +442,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -462,34 +455,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "error",
-                    |m: &CodeGeneratorResponse| { &m.error },
-                    |m: &mut CodeGeneratorResponse| { &mut m.error },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<CodeGeneratorResponse_File>>(
-                    "file",
-                    |m: &CodeGeneratorResponse| { &m.file },
-                    |m: &mut CodeGeneratorResponse| { &mut m.file },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorResponse>(
-                    "CodeGeneratorResponse",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "error",
+                |m: &CodeGeneratorResponse| { &m.error },
+                |m: &mut CodeGeneratorResponse| { &mut m.error },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<CodeGeneratorResponse_File>>(
+                "file",
+                |m: &CodeGeneratorResponse| { &m.file },
+                |m: &mut CodeGeneratorResponse| { &mut m.file },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorResponse>(
+                "CodeGeneratorResponse",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static CodeGeneratorResponse {
-        static mut instance: ::protobuf::lazy::Lazy<CodeGeneratorResponse> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(CodeGeneratorResponse::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<CodeGeneratorResponse> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(CodeGeneratorResponse::new)
     }
 }
 
@@ -723,7 +712,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -736,39 +725,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &CodeGeneratorResponse_File| { &m.name },
-                    |m: &mut CodeGeneratorResponse_File| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "insertion_point",
-                    |m: &CodeGeneratorResponse_File| { &m.insertion_point },
-                    |m: &mut CodeGeneratorResponse_File| { &mut m.insertion_point },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "content",
-                    |m: &CodeGeneratorResponse_File| { &m.content },
-                    |m: &mut CodeGeneratorResponse_File| { &mut m.content },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorResponse_File>(
-                    "CodeGeneratorResponse.File",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &CodeGeneratorResponse_File| { &m.name },
+                |m: &mut CodeGeneratorResponse_File| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "insertion_point",
+                |m: &CodeGeneratorResponse_File| { &m.insertion_point },
+                |m: &mut CodeGeneratorResponse_File| { &mut m.insertion_point },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "content",
+                |m: &CodeGeneratorResponse_File| { &m.content },
+                |m: &mut CodeGeneratorResponse_File| { &mut m.content },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CodeGeneratorResponse_File>(
+                "CodeGeneratorResponse.File",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static CodeGeneratorResponse_File {
-        static mut instance: ::protobuf::lazy::Lazy<CodeGeneratorResponse_File> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(CodeGeneratorResponse_File::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<CodeGeneratorResponse_File> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(CodeGeneratorResponse_File::new)
     }
 }
 
@@ -983,16 +968,14 @@
     \x02\x01\x03\x12\x04\x94\x01\x17\x19\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/reflect/accessor.rs b/src/reflect/accessor.rs
index 8a586b2..9f04838 100644
--- a/src/reflect/accessor.rs
+++ b/src/reflect/accessor.rs
@@ -24,7 +24,7 @@
 use super::ReflectFieldRef;
 
 /// this trait should not be used directly, use `FieldDescriptor` instead
-pub trait FieldAccessor {
+pub trait FieldAccessor: Sync {
     fn name_generic(&self) -> &'static str;
     fn has_field_generic(&self, m: &Message) -> bool;
     fn len_field_generic(&self, m: &Message) -> usize;
@@ -44,7 +44,7 @@
     fn get_reflect<'a>(&self, m: &'a Message) -> ReflectFieldRef<'a>;
 }
 
-trait GetSingularMessage<M> {
+trait GetSingularMessage<M>: Sync {
     fn get_message<'a>(&self, m: &'a M) -> &'a Message;
 }
 
@@ -58,7 +58,7 @@
     }
 }
 
-trait GetSingularEnum<M> {
+trait GetSingularEnum<M>: Sync {
     fn get_enum(&self, m: &M) -> &'static EnumValueDescriptor;
 }
 
@@ -72,19 +72,19 @@
     }
 }
 
-trait GetRepeatedMessage<M> {
+trait GetRepeatedMessage<M>: Sync {
     fn len_field(&self, m: &M) -> usize;
     fn get_message_item<'a>(&self, m: &'a M, index: usize) -> &'a Message;
     fn reflect_repeated_message<'a>(&self, m: &'a M) -> Box<ReflectRepeatedMessage<'a> + 'a>;
 }
 
-trait GetRepeatedEnum<M: Message + 'static> {
+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<ReflectRepeatedEnum<'a> + 'a>;
 }
 
-trait GetSetCopyFns<M> {
+trait GetSetCopyFns<M>: Sync {
     fn get_field<'a>(&self, m: &'a M) -> ReflectValueRef<'a>;
 }
 
@@ -119,7 +119,7 @@
     }
 }
 
-trait FieldAccessor2<M, R: ?Sized>
+trait FieldAccessor2<M, R: ?Sized>: Sync
 where
     M: Message + 'static,
 {
diff --git a/src/rt.rs b/src/rt.rs
index 312bb4f..b50b71d 100644
--- a/src/rt.rs
+++ b/src/rt.rs
@@ -30,6 +30,7 @@
 use zigzag::*;
 
 use unknown::UnknownFields;
+pub use crate::lazy_v2::LazyV2;
 
 /// Given `u64` value compute varint encoded length.
 pub fn compute_raw_varint64_size(value: u64) -> u32 {
diff --git a/src/rustproto.rs b/src/rustproto.rs
index 92c2547..6690ee7 100644
--- a/src/rustproto.rs
+++ b/src/rustproto.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,16 +15,12 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `rustproto.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
+/// Extension fields
 pub mod exts {
-    use protobuf::Message as Message_imported_for_functions;
 
     pub const expose_oneof_all: ::protobuf::ext::ExtFieldOptional<::protobuf::descriptor::FileOptions, ::protobuf::types::ProtobufTypeBool> = ::protobuf::ext::ExtFieldOptional { field_number: 17001, phantom: ::std::marker::PhantomData };
 
@@ -185,16 +182,14 @@
     \n\x03\x07\x12\x03\x12\x0366;\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/stream.rs b/src/stream.rs
index 53c3f45..074d9c7 100644
--- a/src/stream.rs
+++ b/src/stream.rs
@@ -809,7 +809,7 @@
             Ok(t) => t,
             Err(_) => return Err(ProtobufError::WireError(WireError::Utf8Error)),
         };
-        mem::replace(target, s);
+        *target = s;
         Ok(())
     }
 
diff --git a/src/well_known_types/any.rs b/src/well_known_types/any.rs
index 25166a0..71ee88d 100644
--- a/src/well_known_types/any.rs
+++ b/src/well_known_types/any.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/any.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Any {
@@ -166,7 +163,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -179,34 +176,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "type_url",
-                    |m: &Any| { &m.type_url },
-                    |m: &mut Any| { &mut m.type_url },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
-                    "value",
-                    |m: &Any| { &m.value },
-                    |m: &mut Any| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Any>(
-                    "Any",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "type_url",
+                |m: &Any| { &m.type_url },
+                |m: &mut Any| { &mut m.type_url },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
+                "value",
+                |m: &Any| { &m.value },
+                |m: &mut Any| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Any>(
+                "Any",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Any {
-        static mut instance: ::protobuf::lazy::Lazy<Any> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Any::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Any> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Any::new)
     }
 }
 
@@ -353,16 +346,14 @@
     \x10\x11b\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/api.rs b/src/well_known_types/api.rs
index c4848f2..5742a7d 100644
--- a/src/well_known_types/api.rs
+++ b/src/well_known_types/api.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/api.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Api {
@@ -157,7 +154,7 @@
 
 
     pub fn get_source_context(&self) -> &::protobuf::well_known_types::SourceContext {
-        self.source_context.as_ref().unwrap_or_else(|| ::protobuf::well_known_types::SourceContext::default_instance())
+        self.source_context.as_ref().unwrap_or_else(|| <::protobuf::well_known_types::SourceContext as ::protobuf::Message>::default_instance())
     }
     pub fn clear_source_context(&mut self) {
         self.source_context.clear();
@@ -347,7 +344,7 @@
             v.write_to_with_cached_sizes(os)?;
         };
         if self.syntax != ::protobuf::well_known_types::Syntax::SYNTAX_PROTO2 {
-            os.write_enum(7, self.syntax.value())?;
+            os.write_enum(7, ::protobuf::ProtobufEnum::value(&self.syntax))?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
@@ -371,7 +368,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -384,59 +381,55 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Api| { &m.name },
-                    |m: &mut Api| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Method>>(
-                    "methods",
-                    |m: &Api| { &m.methods },
-                    |m: &mut Api| { &mut m.methods },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Option>>(
-                    "options",
-                    |m: &Api| { &m.options },
-                    |m: &mut Api| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "version",
-                    |m: &Api| { &m.version },
-                    |m: &mut Api| { &mut m.version },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::SourceContext>>(
-                    "source_context",
-                    |m: &Api| { &m.source_context },
-                    |m: &mut Api| { &mut m.source_context },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Mixin>>(
-                    "mixins",
-                    |m: &Api| { &m.mixins },
-                    |m: &mut Api| { &mut m.mixins },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<::protobuf::well_known_types::Syntax>>(
-                    "syntax",
-                    |m: &Api| { &m.syntax },
-                    |m: &mut Api| { &mut m.syntax },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Api>(
-                    "Api",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Api| { &m.name },
+                |m: &mut Api| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Method>>(
+                "methods",
+                |m: &Api| { &m.methods },
+                |m: &mut Api| { &mut m.methods },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Option>>(
+                "options",
+                |m: &Api| { &m.options },
+                |m: &mut Api| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "version",
+                |m: &Api| { &m.version },
+                |m: &mut Api| { &mut m.version },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::SourceContext>>(
+                "source_context",
+                |m: &Api| { &m.source_context },
+                |m: &mut Api| { &mut m.source_context },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Mixin>>(
+                "mixins",
+                |m: &Api| { &m.mixins },
+                |m: &mut Api| { &mut m.mixins },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<::protobuf::well_known_types::Syntax>>(
+                "syntax",
+                |m: &Api| { &m.syntax },
+                |m: &mut Api| { &mut m.syntax },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Api>(
+                "Api",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Api {
-        static mut instance: ::protobuf::lazy::Lazy<Api> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Api::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Api> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Api::new)
     }
 }
 
@@ -747,7 +740,7 @@
             v.write_to_with_cached_sizes(os)?;
         };
         if self.syntax != ::protobuf::well_known_types::Syntax::SYNTAX_PROTO2 {
-            os.write_enum(7, self.syntax.value())?;
+            os.write_enum(7, ::protobuf::ProtobufEnum::value(&self.syntax))?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
@@ -771,7 +764,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -784,59 +777,55 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Method| { &m.name },
-                    |m: &mut Method| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "request_type_url",
-                    |m: &Method| { &m.request_type_url },
-                    |m: &mut Method| { &mut m.request_type_url },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "request_streaming",
-                    |m: &Method| { &m.request_streaming },
-                    |m: &mut Method| { &mut m.request_streaming },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "response_type_url",
-                    |m: &Method| { &m.response_type_url },
-                    |m: &mut Method| { &mut m.response_type_url },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "response_streaming",
-                    |m: &Method| { &m.response_streaming },
-                    |m: &mut Method| { &mut m.response_streaming },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Option>>(
-                    "options",
-                    |m: &Method| { &m.options },
-                    |m: &mut Method| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<::protobuf::well_known_types::Syntax>>(
-                    "syntax",
-                    |m: &Method| { &m.syntax },
-                    |m: &mut Method| { &mut m.syntax },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Method>(
-                    "Method",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Method| { &m.name },
+                |m: &mut Method| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "request_type_url",
+                |m: &Method| { &m.request_type_url },
+                |m: &mut Method| { &mut m.request_type_url },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "request_streaming",
+                |m: &Method| { &m.request_streaming },
+                |m: &mut Method| { &mut m.request_streaming },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "response_type_url",
+                |m: &Method| { &m.response_type_url },
+                |m: &mut Method| { &mut m.response_type_url },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "response_streaming",
+                |m: &Method| { &m.response_streaming },
+                |m: &mut Method| { &mut m.response_streaming },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Option>>(
+                "options",
+                |m: &Method| { &m.options },
+                |m: &mut Method| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<::protobuf::well_known_types::Syntax>>(
+                "syntax",
+                |m: &Method| { &m.syntax },
+                |m: &mut Method| { &mut m.syntax },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Method>(
+                "Method",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Method {
-        static mut instance: ::protobuf::lazy::Lazy<Method> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Method::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Method> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Method::new)
     }
 }
 
@@ -1009,7 +998,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1022,34 +1011,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Mixin| { &m.name },
-                    |m: &mut Mixin| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "root",
-                    |m: &Mixin| { &m.root },
-                    |m: &mut Mixin| { &mut m.root },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Mixin>(
-                    "Mixin",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Mixin| { &m.name },
+                |m: &mut Mixin| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "root",
+                |m: &Mixin| { &m.root },
+                |m: &mut Mixin| { &mut m.root },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Mixin>(
+                "Mixin",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Mixin {
-        static mut instance: ::protobuf::lazy::Lazy<Mixin> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Mixin::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Mixin> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Mixin::new)
     }
 }
 
@@ -1281,16 +1266,14 @@
     \x03\x12\x04\xc7\x01\x10\x11b\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/duration.rs b/src/well_known_types/duration.rs
index 303173d..7ca828f 100644
--- a/src/well_known_types/duration.rs
+++ b/src/well_known_types/duration.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/duration.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Duration {
@@ -152,7 +149,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -165,34 +162,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "seconds",
-                    |m: &Duration| { &m.seconds },
-                    |m: &mut Duration| { &mut m.seconds },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "nanos",
-                    |m: &Duration| { &m.nanos },
-                    |m: &mut Duration| { &mut m.nanos },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Duration>(
-                    "Duration",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
+                "seconds",
+                |m: &Duration| { &m.seconds },
+                |m: &mut Duration| { &mut m.seconds },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "nanos",
+                |m: &Duration| { &m.nanos },
+                |m: &mut Duration| { &mut m.nanos },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Duration>(
+                "Duration",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Duration {
-        static mut instance: ::protobuf::lazy::Lazy<Duration> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Duration::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Duration> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Duration::new)
     }
 }
 
@@ -317,16 +310,14 @@
     \x03f\x08\r\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03f\x10\x11b\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/empty.rs b/src/well_known_types/empty.rs
index df64a48..5e5b378 100644
--- a/src/well_known_types/empty.rs
+++ b/src/well_known_types/empty.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/empty.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Empty {
@@ -93,7 +90,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -106,24 +103,20 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let fields = ::std::vec::Vec::new();
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Empty>(
-                    "Empty",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let fields = ::std::vec::Vec::new();
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Empty>(
+                "Empty",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Empty {
-        static mut instance: ::protobuf::lazy::Lazy<Empty> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Empty::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Empty> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Empty::new)
     }
 }
 
@@ -202,16 +195,14 @@
     \x12\x033\x08\rb\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/field_mask.rs b/src/well_known_types/field_mask.rs
index 421d15c..62186f9 100644
--- a/src/well_known_types/field_mask.rs
+++ b/src/well_known_types/field_mask.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/field_mask.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct FieldMask {
@@ -129,7 +126,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -142,29 +139,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "paths",
-                    |m: &FieldMask| { &m.paths },
-                    |m: &mut FieldMask| { &mut m.paths },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldMask>(
-                    "FieldMask",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "paths",
+                |m: &FieldMask| { &m.paths },
+                |m: &mut FieldMask| { &mut m.paths },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldMask>(
+                "FieldMask",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FieldMask {
-        static mut instance: ::protobuf::lazy::Lazy<FieldMask> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FieldMask::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FieldMask> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FieldMask::new)
     }
 }
 
@@ -373,16 +366,14 @@
     \x01\x1a\x1bb\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/source_context.rs b/src/well_known_types/source_context.rs
index c9a9e26..8145ba6 100644
--- a/src/well_known_types/source_context.rs
+++ b/src/well_known_types/source_context.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/source_context.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct SourceContext {
@@ -130,7 +127,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -143,29 +140,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "file_name",
-                    |m: &SourceContext| { &m.file_name },
-                    |m: &mut SourceContext| { &mut m.file_name },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<SourceContext>(
-                    "SourceContext",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "file_name",
+                |m: &SourceContext| { &m.file_name },
+                |m: &mut SourceContext| { &mut m.file_name },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<SourceContext>(
+                "SourceContext",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static SourceContext {
-        static mut instance: ::protobuf::lazy::Lazy<SourceContext> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(SourceContext::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<SourceContext> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(SourceContext::new)
     }
 }
 
@@ -243,16 +236,14 @@
     \0\x02\0\x03\x12\x03-\x15\x16b\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/struct_pb.rs b/src/well_known_types/struct_pb.rs
index f644b20..973aba8 100644
--- a/src/well_known_types/struct_pb.rs
+++ b/src/well_known_types/struct_pb.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/struct.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Struct {
@@ -125,7 +122,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -138,29 +135,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<Value>>(
-                    "fields",
-                    |m: &Struct| { &m.fields },
-                    |m: &mut Struct| { &mut m.fields },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Struct>(
-                    "Struct",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<Value>>(
+                "fields",
+                |m: &Struct| { &m.fields },
+                |m: &mut Struct| { &mut m.fields },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Struct>(
+                "Struct",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Struct {
-        static mut instance: ::protobuf::lazy::Lazy<Struct> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Struct::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Struct> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Struct::new)
     }
 }
 
@@ -347,7 +340,7 @@
     pub fn get_struct_value(&self) -> &Struct {
         match self.kind {
             ::std::option::Option::Some(Value_oneof_kind::struct_value(ref v)) => v,
-            _ => Struct::default_instance(),
+            _ => <Struct as ::protobuf::Message>::default_instance(),
         }
     }
     pub fn clear_struct_value(&mut self) {
@@ -396,7 +389,7 @@
     pub fn get_list_value(&self) -> &ListValue {
         match self.kind {
             ::std::option::Option::Some(Value_oneof_kind::list_value(ref v)) => v,
-            _ => ListValue::default_instance(),
+            _ => <ListValue as ::protobuf::Message>::default_instance(),
         }
     }
     pub fn clear_list_value(&mut self) {
@@ -540,7 +533,7 @@
         if let ::std::option::Option::Some(ref v) = self.kind {
             match v {
                 &Value_oneof_kind::null_value(v) => {
-                    os.write_enum(1, v.value())?;
+                    os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
                 },
                 &Value_oneof_kind::number_value(v) => {
                     os.write_double(2, v)?;
@@ -585,7 +578,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -598,54 +591,50 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor::<_, NullValue>(
-                    "null_value",
-                    Value::has_null_value,
-                    Value::get_null_value,
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>(
-                    "number_value",
-                    Value::has_number_value,
-                    Value::get_number_value,
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
-                    "string_value",
-                    Value::has_string_value,
-                    Value::get_string_value,
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
-                    "bool_value",
-                    Value::has_bool_value,
-                    Value::get_bool_value,
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, Struct>(
-                    "struct_value",
-                    Value::has_struct_value,
-                    Value::get_struct_value,
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, ListValue>(
-                    "list_value",
-                    Value::has_list_value,
-                    Value::get_list_value,
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Value>(
-                    "Value",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor::<_, NullValue>(
+                "null_value",
+                Value::has_null_value,
+                Value::get_null_value,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>(
+                "number_value",
+                Value::has_number_value,
+                Value::get_number_value,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
+                "string_value",
+                Value::has_string_value,
+                Value::get_string_value,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
+                "bool_value",
+                Value::has_bool_value,
+                Value::get_bool_value,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, Struct>(
+                "struct_value",
+                Value::has_struct_value,
+                Value::get_struct_value,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, ListValue>(
+                "list_value",
+                Value::has_list_value,
+                Value::get_list_value,
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Value>(
+                "Value",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Value {
-        static mut instance: ::protobuf::lazy::Lazy<Value> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Value::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Value> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Value::new)
     }
 }
 
@@ -788,7 +777,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -801,29 +790,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Value>>(
-                    "values",
-                    |m: &ListValue| { &m.values },
-                    |m: &mut ListValue| { &mut m.values },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<ListValue>(
-                    "ListValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Value>>(
+                "values",
+                |m: &ListValue| { &m.values },
+                |m: &mut ListValue| { &mut m.values },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<ListValue>(
+                "ListValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static ListValue {
-        static mut instance: ::protobuf::lazy::Lazy<ListValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(ListValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<ListValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(ListValue::new)
     }
 }
 
@@ -872,12 +857,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<NullValue>("NullValue", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<NullValue>("NullValue", file_descriptor_proto())
+        })
     }
 }
 
@@ -892,7 +875,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for NullValue {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -1013,16 +996,14 @@
     \x03^\x11\x17\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03^\x1a\x1bb\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    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 2fed143..3ba6090 100644
--- a/src/well_known_types/timestamp.rs
+++ b/src/well_known_types/timestamp.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/timestamp.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Timestamp {
@@ -152,7 +149,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -165,34 +162,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "seconds",
-                    |m: &Timestamp| { &m.seconds },
-                    |m: &mut Timestamp| { &mut m.seconds },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "nanos",
-                    |m: &Timestamp| { &m.nanos },
-                    |m: &mut Timestamp| { &mut m.nanos },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Timestamp>(
-                    "Timestamp",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
+                "seconds",
+                |m: &Timestamp| { &m.seconds },
+                |m: &mut Timestamp| { &mut m.seconds },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "nanos",
+                |m: &Timestamp| { &m.nanos },
+                |m: &mut Timestamp| { &mut m.nanos },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Timestamp>(
+                "Timestamp",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Timestamp {
-        static mut instance: ::protobuf::lazy::Lazy<Timestamp> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Timestamp::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Timestamp> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Timestamp::new)
     }
 }
 
@@ -320,16 +313,14 @@
     roto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types/type_pb.rs b/src/well_known_types/type_pb.rs
index 23df582..021300f 100644
--- a/src/well_known_types/type_pb.rs
+++ b/src/well_known_types/type_pb.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/type.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct Type {
@@ -155,7 +152,7 @@
 
 
     pub fn get_source_context(&self) -> &::protobuf::well_known_types::SourceContext {
-        self.source_context.as_ref().unwrap_or_else(|| ::protobuf::well_known_types::SourceContext::default_instance())
+        self.source_context.as_ref().unwrap_or_else(|| <::protobuf::well_known_types::SourceContext as ::protobuf::Message>::default_instance())
     }
     pub fn clear_source_context(&mut self) {
         self.source_context.clear();
@@ -303,7 +300,7 @@
             v.write_to_with_cached_sizes(os)?;
         }
         if self.syntax != Syntax::SYNTAX_PROTO2 {
-            os.write_enum(6, self.syntax.value())?;
+            os.write_enum(6, ::protobuf::ProtobufEnum::value(&self.syntax))?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
@@ -327,7 +324,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -340,54 +337,50 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Type| { &m.name },
-                    |m: &mut Type| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Field>>(
-                    "fields",
-                    |m: &Type| { &m.fields },
-                    |m: &mut Type| { &mut m.fields },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "oneofs",
-                    |m: &Type| { &m.oneofs },
-                    |m: &mut Type| { &mut m.oneofs },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
-                    "options",
-                    |m: &Type| { &m.options },
-                    |m: &mut Type| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::SourceContext>>(
-                    "source_context",
-                    |m: &Type| { &m.source_context },
-                    |m: &mut Type| { &mut m.source_context },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Syntax>>(
-                    "syntax",
-                    |m: &Type| { &m.syntax },
-                    |m: &mut Type| { &mut m.syntax },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Type>(
-                    "Type",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Type| { &m.name },
+                |m: &mut Type| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Field>>(
+                "fields",
+                |m: &Type| { &m.fields },
+                |m: &mut Type| { &mut m.fields },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "oneofs",
+                |m: &Type| { &m.oneofs },
+                |m: &mut Type| { &mut m.oneofs },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
+                "options",
+                |m: &Type| { &m.options },
+                |m: &mut Type| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::SourceContext>>(
+                "source_context",
+                |m: &Type| { &m.source_context },
+                |m: &mut Type| { &mut m.source_context },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Syntax>>(
+                "syntax",
+                |m: &Type| { &m.syntax },
+                |m: &mut Type| { &mut m.syntax },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Type>(
+                "Type",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Type {
-        static mut instance: ::protobuf::lazy::Lazy<Type> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Type::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Type> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Type::new)
     }
 }
 
@@ -758,10 +751,10 @@
 
     fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
         if self.kind != Field_Kind::TYPE_UNKNOWN {
-            os.write_enum(1, self.kind.value())?;
+            os.write_enum(1, ::protobuf::ProtobufEnum::value(&self.kind))?;
         }
         if self.cardinality != Field_Cardinality::CARDINALITY_UNKNOWN {
-            os.write_enum(2, self.cardinality.value())?;
+            os.write_enum(2, ::protobuf::ProtobufEnum::value(&self.cardinality))?;
         }
         if self.number != 0 {
             os.write_int32(3, self.number)?;
@@ -811,7 +804,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -824,74 +817,70 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Field_Kind>>(
-                    "kind",
-                    |m: &Field| { &m.kind },
-                    |m: &mut Field| { &mut m.kind },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Field_Cardinality>>(
-                    "cardinality",
-                    |m: &Field| { &m.cardinality },
-                    |m: &mut Field| { &mut m.cardinality },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "number",
-                    |m: &Field| { &m.number },
-                    |m: &mut Field| { &mut m.number },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Field| { &m.name },
-                    |m: &mut Field| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "type_url",
-                    |m: &Field| { &m.type_url },
-                    |m: &mut Field| { &mut m.type_url },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "oneof_index",
-                    |m: &Field| { &m.oneof_index },
-                    |m: &mut Field| { &mut m.oneof_index },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "packed",
-                    |m: &Field| { &m.packed },
-                    |m: &mut Field| { &mut m.packed },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
-                    "options",
-                    |m: &Field| { &m.options },
-                    |m: &mut Field| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "json_name",
-                    |m: &Field| { &m.json_name },
-                    |m: &mut Field| { &mut m.json_name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "default_value",
-                    |m: &Field| { &m.default_value },
-                    |m: &mut Field| { &mut m.default_value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Field>(
-                    "Field",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Field_Kind>>(
+                "kind",
+                |m: &Field| { &m.kind },
+                |m: &mut Field| { &mut m.kind },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Field_Cardinality>>(
+                "cardinality",
+                |m: &Field| { &m.cardinality },
+                |m: &mut Field| { &mut m.cardinality },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "number",
+                |m: &Field| { &m.number },
+                |m: &mut Field| { &mut m.number },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Field| { &m.name },
+                |m: &mut Field| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "type_url",
+                |m: &Field| { &m.type_url },
+                |m: &mut Field| { &mut m.type_url },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "oneof_index",
+                |m: &Field| { &m.oneof_index },
+                |m: &mut Field| { &mut m.oneof_index },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "packed",
+                |m: &Field| { &m.packed },
+                |m: &mut Field| { &mut m.packed },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
+                "options",
+                |m: &Field| { &m.options },
+                |m: &mut Field| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "json_name",
+                |m: &Field| { &m.json_name },
+                |m: &mut Field| { &mut m.json_name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "default_value",
+                |m: &Field| { &m.default_value },
+                |m: &mut Field| { &mut m.default_value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Field>(
+                "Field",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Field {
-        static mut instance: ::protobuf::lazy::Lazy<Field> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Field::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Field> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Field::new)
     }
 }
 
@@ -1003,12 +992,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<Field_Kind>("Field.Kind", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<Field_Kind>("Field.Kind", file_descriptor_proto())
+        })
     }
 }
 
@@ -1023,7 +1010,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for Field_Kind {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -1062,12 +1049,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<Field_Cardinality>("Field.Cardinality", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<Field_Cardinality>("Field.Cardinality", file_descriptor_proto())
+        })
     }
 }
 
@@ -1082,7 +1067,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for Field_Cardinality {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -1193,7 +1178,7 @@
 
 
     pub fn get_source_context(&self) -> &::protobuf::well_known_types::SourceContext {
-        self.source_context.as_ref().unwrap_or_else(|| ::protobuf::well_known_types::SourceContext::default_instance())
+        self.source_context.as_ref().unwrap_or_else(|| <::protobuf::well_known_types::SourceContext as ::protobuf::Message>::default_instance())
     }
     pub fn clear_source_context(&mut self) {
         self.source_context.clear();
@@ -1332,7 +1317,7 @@
             v.write_to_with_cached_sizes(os)?;
         }
         if self.syntax != Syntax::SYNTAX_PROTO2 {
-            os.write_enum(5, self.syntax.value())?;
+            os.write_enum(5, ::protobuf::ProtobufEnum::value(&self.syntax))?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
@@ -1356,7 +1341,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1369,49 +1354,45 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Enum| { &m.name },
-                    |m: &mut Enum| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumValue>>(
-                    "enumvalue",
-                    |m: &Enum| { &m.enumvalue },
-                    |m: &mut Enum| { &mut m.enumvalue },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
-                    "options",
-                    |m: &Enum| { &m.options },
-                    |m: &mut Enum| { &mut m.options },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::SourceContext>>(
-                    "source_context",
-                    |m: &Enum| { &m.source_context },
-                    |m: &mut Enum| { &mut m.source_context },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Syntax>>(
-                    "syntax",
-                    |m: &Enum| { &m.syntax },
-                    |m: &mut Enum| { &mut m.syntax },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Enum>(
-                    "Enum",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Enum| { &m.name },
+                |m: &mut Enum| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<EnumValue>>(
+                "enumvalue",
+                |m: &Enum| { &m.enumvalue },
+                |m: &mut Enum| { &mut m.enumvalue },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
+                "options",
+                |m: &Enum| { &m.options },
+                |m: &mut Enum| { &mut m.options },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::SourceContext>>(
+                "source_context",
+                |m: &Enum| { &m.source_context },
+                |m: &mut Enum| { &mut m.source_context },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<Syntax>>(
+                "syntax",
+                |m: &Enum| { &m.syntax },
+                |m: &mut Enum| { &mut m.syntax },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Enum>(
+                "Enum",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Enum {
-        static mut instance: ::protobuf::lazy::Lazy<Enum> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Enum::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Enum> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Enum::new)
     }
 }
 
@@ -1618,7 +1599,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1631,39 +1612,35 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &EnumValue| { &m.name },
-                    |m: &mut EnumValue| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "number",
-                    |m: &EnumValue| { &m.number },
-                    |m: &mut EnumValue| { &mut m.number },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
-                    "options",
-                    |m: &EnumValue| { &m.options },
-                    |m: &mut EnumValue| { &mut m.options },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumValue>(
-                    "EnumValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &EnumValue| { &m.name },
+                |m: &mut EnumValue| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "number",
+                |m: &EnumValue| { &m.number },
+                |m: &mut EnumValue| { &mut m.number },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<Option>>(
+                "options",
+                |m: &EnumValue| { &m.options },
+                |m: &mut EnumValue| { &mut m.options },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<EnumValue>(
+                "EnumValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static EnumValue {
-        static mut instance: ::protobuf::lazy::Lazy<EnumValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(EnumValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<EnumValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(EnumValue::new)
     }
 }
 
@@ -1742,7 +1719,7 @@
 
 
     pub fn get_value(&self) -> &::protobuf::well_known_types::Any {
-        self.value.as_ref().unwrap_or_else(|| ::protobuf::well_known_types::Any::default_instance())
+        self.value.as_ref().unwrap_or_else(|| <::protobuf::well_known_types::Any as ::protobuf::Message>::default_instance())
     }
     pub fn clear_value(&mut self) {
         self.value.clear();
@@ -1847,7 +1824,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1860,34 +1837,30 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "name",
-                    |m: &Option| { &m.name },
-                    |m: &mut Option| { &mut m.name },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Any>>(
-                    "value",
-                    |m: &Option| { &m.value },
-                    |m: &mut Option| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Option>(
-                    "Option",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "name",
+                |m: &Option| { &m.name },
+                |m: &mut Option| { &mut m.name },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Any>>(
+                "value",
+                |m: &Option| { &m.value },
+                |m: &mut Option| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Option>(
+                "Option",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Option {
-        static mut instance: ::protobuf::lazy::Lazy<Option> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Option::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Option> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Option::new)
     }
 }
 
@@ -1940,12 +1913,10 @@
     }
 
     fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                ::protobuf::reflect::EnumDescriptor::new_pb_name::<Syntax>("Syntax", file_descriptor_proto())
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<Syntax>("Syntax", file_descriptor_proto())
+        })
     }
 }
 
@@ -1960,7 +1931,7 @@
 
 impl ::protobuf::reflect::ProtobufValue for Syntax {
     fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(self.descriptor())
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
     }
 }
 
@@ -2239,16 +2210,14 @@
     to3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    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 35015fd..c0ff80e 100644
--- a/src/well_known_types/wrappers.rs
+++ b/src/well_known_types/wrappers.rs
@@ -1,11 +1,12 @@
-// This file is generated by rust-protobuf 2.14.0-pre. Do not edit
+// This file is generated by rust-protobuf 2.16.0-pre. Do not edit
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
-#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_attributes)]
+#![rustfmt::skip]
 
 #![allow(box_pointers)]
 #![allow(dead_code)]
@@ -14,14 +15,10 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
 //! Generated file from `google/protobuf/wrappers.proto`
 
-use protobuf::Message as Message_imported_for_functions;
-use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
-
 #[derive(PartialEq,Clone,Default)]
 #[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
 pub struct DoubleValue {
@@ -123,7 +120,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -136,29 +133,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeDouble>(
-                    "value",
-                    |m: &DoubleValue| { &m.value },
-                    |m: &mut DoubleValue| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<DoubleValue>(
-                    "DoubleValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeDouble>(
+                "value",
+                |m: &DoubleValue| { &m.value },
+                |m: &mut DoubleValue| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<DoubleValue>(
+                "DoubleValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static DoubleValue {
-        static mut instance: ::protobuf::lazy::Lazy<DoubleValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(DoubleValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<DoubleValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(DoubleValue::new)
     }
 }
 
@@ -282,7 +275,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -295,29 +288,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeFloat>(
-                    "value",
-                    |m: &FloatValue| { &m.value },
-                    |m: &mut FloatValue| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<FloatValue>(
-                    "FloatValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeFloat>(
+                "value",
+                |m: &FloatValue| { &m.value },
+                |m: &mut FloatValue| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FloatValue>(
+                "FloatValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static FloatValue {
-        static mut instance: ::protobuf::lazy::Lazy<FloatValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(FloatValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<FloatValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FloatValue::new)
     }
 }
 
@@ -441,7 +430,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -454,29 +443,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "value",
-                    |m: &Int64Value| { &m.value },
-                    |m: &mut Int64Value| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Int64Value>(
-                    "Int64Value",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
+                "value",
+                |m: &Int64Value| { &m.value },
+                |m: &mut Int64Value| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Int64Value>(
+                "Int64Value",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Int64Value {
-        static mut instance: ::protobuf::lazy::Lazy<Int64Value> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Int64Value::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Int64Value> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Int64Value::new)
     }
 }
 
@@ -600,7 +585,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -613,29 +598,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint64>(
-                    "value",
-                    |m: &UInt64Value| { &m.value },
-                    |m: &mut UInt64Value| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<UInt64Value>(
-                    "UInt64Value",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint64>(
+                "value",
+                |m: &UInt64Value| { &m.value },
+                |m: &mut UInt64Value| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<UInt64Value>(
+                "UInt64Value",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static UInt64Value {
-        static mut instance: ::protobuf::lazy::Lazy<UInt64Value> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(UInt64Value::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<UInt64Value> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(UInt64Value::new)
     }
 }
 
@@ -759,7 +740,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -772,29 +753,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                    "value",
-                    |m: &Int32Value| { &m.value },
-                    |m: &mut Int32Value| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<Int32Value>(
-                    "Int32Value",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
+                "value",
+                |m: &Int32Value| { &m.value },
+                |m: &mut Int32Value| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Int32Value>(
+                "Int32Value",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static Int32Value {
-        static mut instance: ::protobuf::lazy::Lazy<Int32Value> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(Int32Value::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<Int32Value> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(Int32Value::new)
     }
 }
 
@@ -918,7 +895,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -931,29 +908,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>(
-                    "value",
-                    |m: &UInt32Value| { &m.value },
-                    |m: &mut UInt32Value| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<UInt32Value>(
-                    "UInt32Value",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>(
+                "value",
+                |m: &UInt32Value| { &m.value },
+                |m: &mut UInt32Value| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<UInt32Value>(
+                "UInt32Value",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static UInt32Value {
-        static mut instance: ::protobuf::lazy::Lazy<UInt32Value> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(UInt32Value::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<UInt32Value> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(UInt32Value::new)
     }
 }
 
@@ -1077,7 +1050,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1090,29 +1063,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                    "value",
-                    |m: &BoolValue| { &m.value },
-                    |m: &mut BoolValue| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<BoolValue>(
-                    "BoolValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
+                "value",
+                |m: &BoolValue| { &m.value },
+                |m: &mut BoolValue| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<BoolValue>(
+                "BoolValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static BoolValue {
-        static mut instance: ::protobuf::lazy::Lazy<BoolValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(BoolValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<BoolValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(BoolValue::new)
     }
 }
 
@@ -1243,7 +1212,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1256,29 +1225,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                    "value",
-                    |m: &StringValue| { &m.value },
-                    |m: &mut StringValue| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<StringValue>(
-                    "StringValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "value",
+                |m: &StringValue| { &m.value },
+                |m: &mut StringValue| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<StringValue>(
+                "StringValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static StringValue {
-        static mut instance: ::protobuf::lazy::Lazy<StringValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(StringValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<StringValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(StringValue::new)
     }
 }
 
@@ -1409,7 +1374,7 @@
     fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
         self as &mut dyn (::std::any::Any)
     }
-    fn into_any(self: Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
         self
     }
 
@@ -1422,29 +1387,25 @@
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            descriptor.get(|| {
-                let mut fields = ::std::vec::Vec::new();
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
-                    "value",
-                    |m: &BytesValue| { &m.value },
-                    |m: &mut BytesValue| { &mut m.value },
-                ));
-                ::protobuf::reflect::MessageDescriptor::new_pb_name::<BytesValue>(
-                    "BytesValue",
-                    fields,
-                    file_descriptor_proto()
-                )
-            })
-        }
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
+                "value",
+                |m: &BytesValue| { &m.value },
+                |m: &mut BytesValue| { &mut m.value },
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<BytesValue>(
+                "BytesValue",
+                fields,
+                file_descriptor_proto()
+            )
+        })
     }
 
     fn default_instance() -> &'static BytesValue {
-        static mut instance: ::protobuf::lazy::Lazy<BytesValue> = ::protobuf::lazy::Lazy::INIT;
-        unsafe {
-            instance.get(BytesValue::new)
-        }
+        static instance: ::protobuf::rt::LazyV2<BytesValue> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(BytesValue::new)
     }
 }
 
@@ -1582,16 +1543,14 @@
     b\x06proto3\
 ";
 
-static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy::INIT;
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
 
 fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
     ::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
 }
 
 pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    unsafe {
-        file_descriptor_proto_lazy.get(|| {
-            parse_descriptor_proto()
-        })
-    }
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
 }
diff --git a/src/well_known_types_util/any.rs b/src/well_known_types_util/any.rs
new file mode 100644
index 0000000..31ddd82
--- /dev/null
+++ b/src/well_known_types_util/any.rs
@@ -0,0 +1,114 @@
+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/well_known_types_util/mod.rs b/src/well_known_types_util/mod.rs
new file mode 100644
index 0000000..bd4c243
--- /dev/null
+++ b/src/well_known_types_util/mod.rs
@@ -0,0 +1 @@
+mod any;