Regenerated code with changes
diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
index aeea673..0c66d4b 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
@@ -1122,7 +1122,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestAllTypes : pb::GeneratedMessage<TestAllTypes, TestAllTypes.Builder> {

-    private static readonly TestAllTypes defaultInstance = new Builder().BuildPartial();

+    private static readonly TestAllTypes defaultInstance = new TestAllTypes().MakeReadOnly();

     private static readonly string[] _testAllTypesFieldNames = new string[] { "default_bool", "default_bytes", "default_cord", "default_double", "default_fixed32", "default_fixed64", "default_float", "default_foreign_enum", "default_import_enum", "default_int32", "default_int64", "default_nested_enum", "default_sfixed32", "default_sfixed64", "default_sint32", "default_sint64", "default_string", "default_string_piece", "default_uint32", "default_uint64", "optional_bool", "optional_bytes", "optional_cord", "optional_double", "optional_fixed32", "optional_fixed64", "optional_float", "optional_foreign_enum", "optional_foreign_message", "optional_import_enum", "optional_import_message", "optional_int32", "optional_int64", "optional_nested_enum", "optional_nested_message", "optional_sfixed32", "optional_sfixed64", "optional_sint32", "optional_sint64", "optional_string", "optional_string_piece", "optional_uint32", "optional_uint64", "optionalgroup", "repeated_bool", "repeated_bytes", "repeated_cord", "repeated_double", "repeated_fixed32", "repeated_fixed64", "repeated_float", "repeated_foreign_enum", "repeated_foreign_message", "repeated_import_enum", "repeated_import_message", "repeated_int32", "repeated_int64", "repeated_nested_enum", "repeated_nested_message", "repeated_sfixed32", "repeated_sfixed64", "repeated_sint32", "repeated_sint64", "repeated_string", "repeated_string_piece", "repeated_uint32", "repeated_uint64", "repeatedgroup" };

     private static readonly uint[] _testAllTypesFieldTags = new uint[] { 584, 602, 682, 577, 541, 545, 573, 656, 664, 488, 496, 648, 557, 561, 520, 528, 594, 674, 504, 512, 104, 122, 202, 97, 61, 65, 93, 176, 154, 184, 162, 8, 16, 168, 146, 77, 81, 40, 48, 114, 194, 24, 32, 131, 344, 362, 442, 337, 301, 305, 333, 416, 394, 424, 402, 248, 256, 408, 386, 317, 321, 280, 288, 354, 434, 264, 272, 371 };

     public static TestAllTypes DefaultInstance {

@@ -1130,7 +1130,7 @@
     }

     

     public override TestAllTypes DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestAllTypes ThisMessage {

@@ -1162,7 +1162,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {

-        private static readonly NestedMessage defaultInstance = new Builder().BuildPartial();

+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();

         private static readonly string[] _nestedMessageFieldNames = new string[] { "bb" };

         private static readonly uint[] _nestedMessageFieldTags = new uint[] { 8 };

         public static NestedMessage DefaultInstance {

@@ -1170,7 +1170,7 @@
         }

         

         public override NestedMessage DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override NestedMessage ThisMessage {

@@ -1256,6 +1256,10 @@
         public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private NestedMessage MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1271,22 +1275,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new NestedMessage();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(NestedMessage cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          NestedMessage result;

+          private bool resultIsReadOnly;

+          private NestedMessage result;

           

           private NestedMessage PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               NestedMessage original = result;

               result = new NestedMessage();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1301,13 +1305,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new NestedMessage();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -1323,11 +1327,11 @@
           }

           

           public override NestedMessage BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -1431,7 +1435,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class OptionalGroup : pb::GeneratedMessage<OptionalGroup, OptionalGroup.Builder> {

-        private static readonly OptionalGroup defaultInstance = new Builder().BuildPartial();

+        private static readonly OptionalGroup defaultInstance = new OptionalGroup().MakeReadOnly();

         private static readonly string[] _optionalGroupFieldNames = new string[] { "a" };

         private static readonly uint[] _optionalGroupFieldTags = new uint[] { 136 };

         public static OptionalGroup DefaultInstance {

@@ -1439,7 +1443,7 @@
         }

         

         public override OptionalGroup DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override OptionalGroup ThisMessage {

@@ -1525,6 +1529,10 @@
         public static OptionalGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private OptionalGroup MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1540,22 +1548,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new OptionalGroup();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(OptionalGroup cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          OptionalGroup result;

+          private bool resultIsReadOnly;

+          private OptionalGroup result;

           

           private OptionalGroup PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               OptionalGroup original = result;

               result = new OptionalGroup();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1570,13 +1578,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new OptionalGroup();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -1592,11 +1600,11 @@
           }

           

           public override OptionalGroup BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -1700,7 +1708,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class RepeatedGroup : pb::GeneratedMessage<RepeatedGroup, RepeatedGroup.Builder> {

-        private static readonly RepeatedGroup defaultInstance = new Builder().BuildPartial();

+        private static readonly RepeatedGroup defaultInstance = new RepeatedGroup().MakeReadOnly();

         private static readonly string[] _repeatedGroupFieldNames = new string[] { "a" };

         private static readonly uint[] _repeatedGroupFieldTags = new uint[] { 376 };

         public static RepeatedGroup DefaultInstance {

@@ -1708,7 +1716,7 @@
         }

         

         public override RepeatedGroup DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override RepeatedGroup ThisMessage {

@@ -1794,6 +1802,10 @@
         public static RepeatedGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private RepeatedGroup MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1809,22 +1821,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new RepeatedGroup();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(RepeatedGroup cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          RepeatedGroup result;

+          private bool resultIsReadOnly;

+          private RepeatedGroup result;

           

           private RepeatedGroup PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               RepeatedGroup original = result;

               result = new RepeatedGroup();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1839,13 +1851,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new RepeatedGroup();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -1861,11 +1873,11 @@
           }

           

           public override RepeatedGroup BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -2124,42 +2136,42 @@
     

     public const int OptionalGroupFieldNumber = 16;

     private bool hasOptionalGroup;

-    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup optionalGroup_;

     public bool HasOptionalGroup {

       get { return hasOptionalGroup; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup OptionalGroup {

-      get { return optionalGroup_; }

+      get { return optionalGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance; }

     }

     

     public const int OptionalNestedMessageFieldNumber = 18;

     private bool hasOptionalNestedMessage;

-    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage optionalNestedMessage_;

     public bool HasOptionalNestedMessage {

       get { return hasOptionalNestedMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalNestedMessage {

-      get { return optionalNestedMessage_; }

+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }

     }

     

     public const int OptionalForeignMessageFieldNumber = 19;

     private bool hasOptionalForeignMessage;

-    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage optionalForeignMessage_;

     public bool HasOptionalForeignMessage {

       get { return hasOptionalForeignMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ForeignMessage OptionalForeignMessage {

-      get { return optionalForeignMessage_; }

+      get { return optionalForeignMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }

     }

     

     public const int OptionalImportMessageFieldNumber = 20;

     private bool hasOptionalImportMessage;

-    private global::Google.ProtocolBuffers.TestProtos.ImportMessage optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ImportMessage optionalImportMessage_;

     public bool HasOptionalImportMessage {

       get { return hasOptionalImportMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ImportMessage OptionalImportMessage {

-      get { return optionalImportMessage_; }

+      get { return optionalImportMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance; }

     }

     

     public const int OptionalNestedEnumFieldNumber = 21;

@@ -3267,6 +3279,34 @@
     public static TestAllTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestAllTypes MakeReadOnly() {

+      repeatedInt32_.MakeReadOnly();

+      repeatedInt64_.MakeReadOnly();

+      repeatedUint32_.MakeReadOnly();

+      repeatedUint64_.MakeReadOnly();

+      repeatedSint32_.MakeReadOnly();

+      repeatedSint64_.MakeReadOnly();

+      repeatedFixed32_.MakeReadOnly();

+      repeatedFixed64_.MakeReadOnly();

+      repeatedSfixed32_.MakeReadOnly();

+      repeatedSfixed64_.MakeReadOnly();

+      repeatedFloat_.MakeReadOnly();

+      repeatedDouble_.MakeReadOnly();

+      repeatedBool_.MakeReadOnly();

+      repeatedString_.MakeReadOnly();

+      repeatedBytes_.MakeReadOnly();

+      repeatedGroup_.MakeReadOnly();

+      repeatedNestedMessage_.MakeReadOnly();

+      repeatedForeignMessage_.MakeReadOnly();

+      repeatedImportMessage_.MakeReadOnly();

+      repeatedNestedEnum_.MakeReadOnly();

+      repeatedForeignEnum_.MakeReadOnly();

+      repeatedImportEnum_.MakeReadOnly();

+      repeatedStringPiece_.MakeReadOnly();

+      repeatedCord_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -3282,22 +3322,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestAllTypes();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestAllTypes cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestAllTypes result;

+      private bool resultIsReadOnly;

+      private TestAllTypes result;

       

       private TestAllTypes PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestAllTypes original = result;

           result = new TestAllTypes();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3312,13 +3352,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestAllTypes();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -3334,35 +3374,11 @@
       }

       

       public override TestAllTypes BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.repeatedInt32_.MakeReadOnly();

-        result.repeatedInt64_.MakeReadOnly();

-        result.repeatedUint32_.MakeReadOnly();

-        result.repeatedUint64_.MakeReadOnly();

-        result.repeatedSint32_.MakeReadOnly();

-        result.repeatedSint64_.MakeReadOnly();

-        result.repeatedFixed32_.MakeReadOnly();

-        result.repeatedFixed64_.MakeReadOnly();

-        result.repeatedSfixed32_.MakeReadOnly();

-        result.repeatedSfixed64_.MakeReadOnly();

-        result.repeatedFloat_.MakeReadOnly();

-        result.repeatedDouble_.MakeReadOnly();

-        result.repeatedBool_.MakeReadOnly();

-        result.repeatedString_.MakeReadOnly();

-        result.repeatedBytes_.MakeReadOnly();

-        result.repeatedGroup_.MakeReadOnly();

-        result.repeatedNestedMessage_.MakeReadOnly();

-        result.repeatedForeignMessage_.MakeReadOnly();

-        result.repeatedImportMessage_.MakeReadOnly();

-        result.repeatedNestedEnum_.MakeReadOnly();

-        result.repeatedForeignEnum_.MakeReadOnly();

-        result.repeatedImportEnum_.MakeReadOnly();

-        result.repeatedStringPiece_.MakeReadOnly();

-        result.repeatedCord_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -4363,7 +4379,7 @@
       public Builder ClearOptionalGroup() {

         PrepareBuilder();

         result.hasOptionalGroup = false;

-        result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance;

+        result.optionalGroup_ = null;

         return this;

       }

       

@@ -4403,7 +4419,7 @@
       public Builder ClearOptionalNestedMessage() {

         PrepareBuilder();

         result.hasOptionalNestedMessage = false;

-        result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance;

+        result.optionalNestedMessage_ = null;

         return this;

       }

       

@@ -4443,7 +4459,7 @@
       public Builder ClearOptionalForeignMessage() {

         PrepareBuilder();

         result.hasOptionalForeignMessage = false;

-        result.optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

+        result.optionalForeignMessage_ = null;

         return this;

       }

       

@@ -4483,7 +4499,7 @@
       public Builder ClearOptionalImportMessage() {

         PrepareBuilder();

         result.hasOptionalImportMessage = false;

-        result.optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance;

+        result.optionalImportMessage_ = null;

         return this;

       }

       

@@ -5814,7 +5830,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestDeprecatedFields : pb::GeneratedMessage<TestDeprecatedFields, TestDeprecatedFields.Builder> {

-    private static readonly TestDeprecatedFields defaultInstance = new Builder().BuildPartial();

+    private static readonly TestDeprecatedFields defaultInstance = new TestDeprecatedFields().MakeReadOnly();

     private static readonly string[] _testDeprecatedFieldsFieldNames = new string[] { "deprecated_int32" };

     private static readonly uint[] _testDeprecatedFieldsFieldTags = new uint[] { 8 };

     public static TestDeprecatedFields DefaultInstance {

@@ -5822,7 +5838,7 @@
     }

     

     public override TestDeprecatedFields DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestDeprecatedFields ThisMessage {

@@ -5908,6 +5924,10 @@
     public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestDeprecatedFields MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -5923,22 +5943,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestDeprecatedFields();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestDeprecatedFields cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestDeprecatedFields result;

+      private bool resultIsReadOnly;

+      private TestDeprecatedFields result;

       

       private TestDeprecatedFields PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestDeprecatedFields original = result;

           result = new TestDeprecatedFields();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -5953,13 +5973,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestDeprecatedFields();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -5975,11 +5995,11 @@
       }

       

       public override TestDeprecatedFields BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6083,7 +6103,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class ForeignMessage : pb::GeneratedMessage<ForeignMessage, ForeignMessage.Builder> {

-    private static readonly ForeignMessage defaultInstance = new Builder().BuildPartial();

+    private static readonly ForeignMessage defaultInstance = new ForeignMessage().MakeReadOnly();

     private static readonly string[] _foreignMessageFieldNames = new string[] { "c" };

     private static readonly uint[] _foreignMessageFieldTags = new uint[] { 8 };

     public static ForeignMessage DefaultInstance {

@@ -6091,7 +6111,7 @@
     }

     

     public override ForeignMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ForeignMessage ThisMessage {

@@ -6177,6 +6197,10 @@
     public static ForeignMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private ForeignMessage MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6192,22 +6216,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ForeignMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ForeignMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ForeignMessage result;

+      private bool resultIsReadOnly;

+      private ForeignMessage result;

       

       private ForeignMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ForeignMessage original = result;

           result = new ForeignMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6222,13 +6246,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ForeignMessage();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -6244,11 +6268,11 @@
       }

       

       public override ForeignMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6352,7 +6376,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestAllExtensions : pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder> {

-    private static readonly TestAllExtensions defaultInstance = new Builder().BuildPartial();

+    private static readonly TestAllExtensions defaultInstance = new TestAllExtensions().MakeReadOnly();

     private static readonly string[] _testAllExtensionsFieldNames = new string[] {  };

     private static readonly uint[] _testAllExtensionsFieldTags = new uint[] {  };

     public static TestAllExtensions DefaultInstance {

@@ -6360,7 +6384,7 @@
     }

     

     public override TestAllExtensions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestAllExtensions ThisMessage {

@@ -6434,6 +6458,10 @@
     public static TestAllExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestAllExtensions MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6449,22 +6477,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestAllExtensions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestAllExtensions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestAllExtensions result;

+      private bool resultIsReadOnly;

+      private TestAllExtensions result;

       

       private TestAllExtensions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestAllExtensions original = result;

           result = new TestAllExtensions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6479,13 +6507,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestAllExtensions();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -6501,11 +6529,11 @@
       }

       

       public override TestAllExtensions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6583,7 +6611,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class OptionalGroup_extension : pb::GeneratedMessage<OptionalGroup_extension, OptionalGroup_extension.Builder> {

-    private static readonly OptionalGroup_extension defaultInstance = new Builder().BuildPartial();

+    private static readonly OptionalGroup_extension defaultInstance = new OptionalGroup_extension().MakeReadOnly();

     private static readonly string[] _optionalGroupExtensionFieldNames = new string[] { "a" };

     private static readonly uint[] _optionalGroupExtensionFieldTags = new uint[] { 136 };

     public static OptionalGroup_extension DefaultInstance {

@@ -6591,7 +6619,7 @@
     }

     

     public override OptionalGroup_extension DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override OptionalGroup_extension ThisMessage {

@@ -6677,6 +6705,10 @@
     public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private OptionalGroup_extension MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6692,22 +6724,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new OptionalGroup_extension();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(OptionalGroup_extension cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      OptionalGroup_extension result;

+      private bool resultIsReadOnly;

+      private OptionalGroup_extension result;

       

       private OptionalGroup_extension PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           OptionalGroup_extension original = result;

           result = new OptionalGroup_extension();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6722,13 +6754,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new OptionalGroup_extension();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -6744,11 +6776,11 @@
       }

       

       public override OptionalGroup_extension BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6852,7 +6884,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class RepeatedGroup_extension : pb::GeneratedMessage<RepeatedGroup_extension, RepeatedGroup_extension.Builder> {

-    private static readonly RepeatedGroup_extension defaultInstance = new Builder().BuildPartial();

+    private static readonly RepeatedGroup_extension defaultInstance = new RepeatedGroup_extension().MakeReadOnly();

     private static readonly string[] _repeatedGroupExtensionFieldNames = new string[] { "a" };

     private static readonly uint[] _repeatedGroupExtensionFieldTags = new uint[] { 376 };

     public static RepeatedGroup_extension DefaultInstance {

@@ -6860,7 +6892,7 @@
     }

     

     public override RepeatedGroup_extension DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override RepeatedGroup_extension ThisMessage {

@@ -6946,6 +6978,10 @@
     public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private RepeatedGroup_extension MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6961,22 +6997,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new RepeatedGroup_extension();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(RepeatedGroup_extension cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      RepeatedGroup_extension result;

+      private bool resultIsReadOnly;

+      private RepeatedGroup_extension result;

       

       private RepeatedGroup_extension PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           RepeatedGroup_extension original = result;

           result = new RepeatedGroup_extension();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6991,13 +7027,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new RepeatedGroup_extension();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -7013,11 +7049,11 @@
       }

       

       public override RepeatedGroup_extension BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -7121,7 +7157,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestNestedExtension : pb::GeneratedMessage<TestNestedExtension, TestNestedExtension.Builder> {

-    private static readonly TestNestedExtension defaultInstance = new Builder().BuildPartial();

+    private static readonly TestNestedExtension defaultInstance = new TestNestedExtension().MakeReadOnly();

     private static readonly string[] _testNestedExtensionFieldNames = new string[] {  };

     private static readonly uint[] _testNestedExtensionFieldTags = new uint[] {  };

     public static TestNestedExtension DefaultInstance {

@@ -7129,7 +7165,7 @@
     }

     

     public override TestNestedExtension DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestNestedExtension ThisMessage {

@@ -7201,6 +7237,10 @@
     public static TestNestedExtension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestNestedExtension MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -7216,22 +7256,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestNestedExtension();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestNestedExtension cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestNestedExtension result;

+      private bool resultIsReadOnly;

+      private TestNestedExtension result;

       

       private TestNestedExtension PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestNestedExtension original = result;

           result = new TestNestedExtension();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -7246,13 +7286,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestNestedExtension();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -7268,11 +7308,11 @@
       }

       

       public override TestNestedExtension BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -7349,7 +7389,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestRequired : pb::GeneratedMessage<TestRequired, TestRequired.Builder> {

-    private static readonly TestRequired defaultInstance = new Builder().BuildPartial();

+    private static readonly TestRequired defaultInstance = new TestRequired().MakeReadOnly();

     private static readonly string[] _testRequiredFieldNames = new string[] { "a", "b", "c", "dummy10", "dummy11", "dummy12", "dummy13", "dummy14", "dummy15", "dummy16", "dummy17", "dummy18", "dummy19", "dummy2", "dummy20", "dummy21", "dummy22", "dummy23", "dummy24", "dummy25", "dummy26", "dummy27", "dummy28", "dummy29", "dummy30", "dummy31", "dummy32", "dummy4", "dummy5", "dummy6", "dummy7", "dummy8", "dummy9" };

     private static readonly uint[] _testRequiredFieldTags = new uint[] { 8, 24, 264, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 16, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 32, 40, 48, 56, 64, 72 };

     public static TestRequired DefaultInstance {

@@ -7357,7 +7397,7 @@
     }

     

     public override TestRequired DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestRequired ThisMessage {

@@ -7962,6 +8002,10 @@
     public static TestRequired ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestRequired MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -7977,22 +8021,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestRequired();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestRequired cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestRequired result;

+      private bool resultIsReadOnly;

+      private TestRequired result;

       

       private TestRequired PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestRequired original = result;

           result = new TestRequired();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -8007,13 +8051,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestRequired();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -8029,11 +8073,11 @@
       }

       

       public override TestRequired BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9001,7 +9045,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestRequiredForeign : pb::GeneratedMessage<TestRequiredForeign, TestRequiredForeign.Builder> {

-    private static readonly TestRequiredForeign defaultInstance = new Builder().BuildPartial();

+    private static readonly TestRequiredForeign defaultInstance = new TestRequiredForeign().MakeReadOnly();

     private static readonly string[] _testRequiredForeignFieldNames = new string[] { "dummy", "optional_message", "repeated_message" };

     private static readonly uint[] _testRequiredForeignFieldTags = new uint[] { 24, 10, 18 };

     public static TestRequiredForeign DefaultInstance {

@@ -9009,7 +9053,7 @@
     }

     

     public override TestRequiredForeign DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestRequiredForeign ThisMessage {

@@ -9026,12 +9070,12 @@
     

     public const int OptionalMessageFieldNumber = 1;

     private bool hasOptionalMessage;

-    private global::Google.ProtocolBuffers.TestProtos.TestRequired optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestRequired optionalMessage_;

     public bool HasOptionalMessage {

       get { return hasOptionalMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestRequired OptionalMessage {

-      get { return optionalMessage_; }

+      get { return optionalMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance; }

     }

     

     public const int RepeatedMessageFieldNumber = 2;

@@ -9135,6 +9179,11 @@
     public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestRequiredForeign MakeReadOnly() {

+      repeatedMessage_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9150,22 +9199,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestRequiredForeign();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestRequiredForeign cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestRequiredForeign result;

+      private bool resultIsReadOnly;

+      private TestRequiredForeign result;

       

       private TestRequiredForeign PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestRequiredForeign original = result;

           result = new TestRequiredForeign();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9180,13 +9229,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestRequiredForeign();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -9202,12 +9251,11 @@
       }

       

       public override TestRequiredForeign BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.repeatedMessage_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9337,7 +9385,7 @@
       public Builder ClearOptionalMessage() {

         PrepareBuilder();

         result.hasOptionalMessage = false;

-        result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance;

+        result.optionalMessage_ = null;

         return this;

       }

       

@@ -9414,7 +9462,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestForeignNested : pb::GeneratedMessage<TestForeignNested, TestForeignNested.Builder> {

-    private static readonly TestForeignNested defaultInstance = new Builder().BuildPartial();

+    private static readonly TestForeignNested defaultInstance = new TestForeignNested().MakeReadOnly();

     private static readonly string[] _testForeignNestedFieldNames = new string[] { "foreign_nested" };

     private static readonly uint[] _testForeignNestedFieldTags = new uint[] { 10 };

     public static TestForeignNested DefaultInstance {

@@ -9422,7 +9470,7 @@
     }

     

     public override TestForeignNested DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestForeignNested ThisMessage {

@@ -9439,12 +9487,12 @@
     

     public const int ForeignNestedFieldNumber = 1;

     private bool hasForeignNested;

-    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage foreignNested_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage foreignNested_;

     public bool HasForeignNested {

       get { return hasForeignNested; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage ForeignNested {

-      get { return foreignNested_; }

+      get { return foreignNested_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -9508,6 +9556,10 @@
     public static TestForeignNested ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestForeignNested MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9523,22 +9575,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestForeignNested();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestForeignNested cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestForeignNested result;

+      private bool resultIsReadOnly;

+      private TestForeignNested result;

       

       private TestForeignNested PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestForeignNested original = result;

           result = new TestForeignNested();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9553,13 +9605,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestForeignNested();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -9575,11 +9627,11 @@
       }

       

       public override TestForeignNested BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9695,7 +9747,7 @@
       public Builder ClearForeignNested() {

         PrepareBuilder();

         result.hasForeignNested = false;

-        result.foreignNested_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance;

+        result.foreignNested_ = null;

         return this;

       }

     }

@@ -9708,7 +9760,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestEmptyMessage : pb::GeneratedMessage<TestEmptyMessage, TestEmptyMessage.Builder> {

-    private static readonly TestEmptyMessage defaultInstance = new Builder().BuildPartial();

+    private static readonly TestEmptyMessage defaultInstance = new TestEmptyMessage().MakeReadOnly();

     private static readonly string[] _testEmptyMessageFieldNames = new string[] {  };

     private static readonly uint[] _testEmptyMessageFieldTags = new uint[] {  };

     public static TestEmptyMessage DefaultInstance {

@@ -9716,7 +9768,7 @@
     }

     

     public override TestEmptyMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestEmptyMessage ThisMessage {

@@ -9786,6 +9838,10 @@
     public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestEmptyMessage MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9801,22 +9857,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestEmptyMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestEmptyMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestEmptyMessage result;

+      private bool resultIsReadOnly;

+      private TestEmptyMessage result;

       

       private TestEmptyMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestEmptyMessage original = result;

           result = new TestEmptyMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9831,13 +9887,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestEmptyMessage();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -9853,11 +9909,11 @@
       }

       

       public override TestEmptyMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -9934,7 +9990,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestEmptyMessageWithExtensions : pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> {

-    private static readonly TestEmptyMessageWithExtensions defaultInstance = new Builder().BuildPartial();

+    private static readonly TestEmptyMessageWithExtensions defaultInstance = new TestEmptyMessageWithExtensions().MakeReadOnly();

     private static readonly string[] _testEmptyMessageWithExtensionsFieldNames = new string[] {  };

     private static readonly uint[] _testEmptyMessageWithExtensionsFieldTags = new uint[] {  };

     public static TestEmptyMessageWithExtensions DefaultInstance {

@@ -9942,7 +9998,7 @@
     }

     

     public override TestEmptyMessageWithExtensions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestEmptyMessageWithExtensions ThisMessage {

@@ -10016,6 +10072,10 @@
     public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestEmptyMessageWithExtensions MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -10031,22 +10091,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestEmptyMessageWithExtensions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestEmptyMessageWithExtensions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestEmptyMessageWithExtensions result;

+      private bool resultIsReadOnly;

+      private TestEmptyMessageWithExtensions result;

       

       private TestEmptyMessageWithExtensions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestEmptyMessageWithExtensions original = result;

           result = new TestEmptyMessageWithExtensions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -10061,13 +10121,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestEmptyMessageWithExtensions();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -10083,11 +10143,11 @@
       }

       

       public override TestEmptyMessageWithExtensions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -10165,7 +10225,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestMultipleExtensionRanges : pb::ExtendableMessage<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder> {

-    private static readonly TestMultipleExtensionRanges defaultInstance = new Builder().BuildPartial();

+    private static readonly TestMultipleExtensionRanges defaultInstance = new TestMultipleExtensionRanges().MakeReadOnly();

     private static readonly string[] _testMultipleExtensionRangesFieldNames = new string[] {  };

     private static readonly uint[] _testMultipleExtensionRangesFieldTags = new uint[] {  };

     public static TestMultipleExtensionRanges DefaultInstance {

@@ -10173,7 +10233,7 @@
     }

     

     public override TestMultipleExtensionRanges DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMultipleExtensionRanges ThisMessage {

@@ -10249,6 +10309,10 @@
     public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestMultipleExtensionRanges MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -10264,22 +10328,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMultipleExtensionRanges();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMultipleExtensionRanges cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMultipleExtensionRanges result;

+      private bool resultIsReadOnly;

+      private TestMultipleExtensionRanges result;

       

       private TestMultipleExtensionRanges PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMultipleExtensionRanges original = result;

           result = new TestMultipleExtensionRanges();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -10294,13 +10358,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMultipleExtensionRanges();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -10316,11 +10380,11 @@
       }

       

       public override TestMultipleExtensionRanges BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -10398,7 +10462,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestReallyLargeTagNumber : pb::GeneratedMessage<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> {

-    private static readonly TestReallyLargeTagNumber defaultInstance = new Builder().BuildPartial();

+    private static readonly TestReallyLargeTagNumber defaultInstance = new TestReallyLargeTagNumber().MakeReadOnly();

     private static readonly string[] _testReallyLargeTagNumberFieldNames = new string[] { "a", "bb" };

     private static readonly uint[] _testReallyLargeTagNumberFieldTags = new uint[] { 8, 2147483640 };

     public static TestReallyLargeTagNumber DefaultInstance {

@@ -10406,7 +10470,7 @@
     }

     

     public override TestReallyLargeTagNumber DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestReallyLargeTagNumber ThisMessage {

@@ -10508,6 +10572,10 @@
     public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestReallyLargeTagNumber MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -10523,22 +10591,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestReallyLargeTagNumber();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestReallyLargeTagNumber cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestReallyLargeTagNumber result;

+      private bool resultIsReadOnly;

+      private TestReallyLargeTagNumber result;

       

       private TestReallyLargeTagNumber PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestReallyLargeTagNumber original = result;

           result = new TestReallyLargeTagNumber();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -10553,13 +10621,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestReallyLargeTagNumber();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -10575,11 +10643,11 @@
       }

       

       public override TestReallyLargeTagNumber BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -10710,7 +10778,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestRecursiveMessage : pb::GeneratedMessage<TestRecursiveMessage, TestRecursiveMessage.Builder> {

-    private static readonly TestRecursiveMessage defaultInstance = new Builder().BuildPartial();

+    private static readonly TestRecursiveMessage defaultInstance = new TestRecursiveMessage().MakeReadOnly();

     private static readonly string[] _testRecursiveMessageFieldNames = new string[] { "a", "i" };

     private static readonly uint[] _testRecursiveMessageFieldTags = new uint[] { 10, 16 };

     public static TestRecursiveMessage DefaultInstance {

@@ -10718,7 +10786,7 @@
     }

     

     public override TestRecursiveMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestRecursiveMessage ThisMessage {

@@ -10735,12 +10803,12 @@
     

     public const int AFieldNumber = 1;

     private bool hasA;

-    private global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage a_ = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage a_;

     public bool HasA {

       get { return hasA; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage A {

-      get { return a_; }

+      get { return a_ ?? global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance; }

     }

     

     public const int IFieldNumber = 2;

@@ -10820,6 +10888,10 @@
     public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestRecursiveMessage MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -10835,22 +10907,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestRecursiveMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestRecursiveMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestRecursiveMessage result;

+      private bool resultIsReadOnly;

+      private TestRecursiveMessage result;

       

       private TestRecursiveMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestRecursiveMessage original = result;

           result = new TestRecursiveMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -10865,13 +10937,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestRecursiveMessage();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -10887,11 +10959,11 @@
       }

       

       public override TestRecursiveMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -11014,7 +11086,7 @@
       public Builder ClearA() {

         PrepareBuilder();

         result.hasA = false;

-        result.a_ = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance;

+        result.a_ = null;

         return this;

       }

       

@@ -11047,7 +11119,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestMutualRecursionA : pb::GeneratedMessage<TestMutualRecursionA, TestMutualRecursionA.Builder> {

-    private static readonly TestMutualRecursionA defaultInstance = new Builder().BuildPartial();

+    private static readonly TestMutualRecursionA defaultInstance = new TestMutualRecursionA().MakeReadOnly();

     private static readonly string[] _testMutualRecursionAFieldNames = new string[] { "bb" };

     private static readonly uint[] _testMutualRecursionAFieldTags = new uint[] { 10 };

     public static TestMutualRecursionA DefaultInstance {

@@ -11055,7 +11127,7 @@
     }

     

     public override TestMutualRecursionA DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMutualRecursionA ThisMessage {

@@ -11072,12 +11144,12 @@
     

     public const int BbFieldNumber = 1;

     private bool hasBb;

-    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB bb_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB bb_;

     public bool HasBb {

       get { return hasBb; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB Bb {

-      get { return bb_; }

+      get { return bb_ ?? global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -11141,6 +11213,10 @@
     public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestMutualRecursionA MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -11156,22 +11232,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMutualRecursionA();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMutualRecursionA cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMutualRecursionA result;

+      private bool resultIsReadOnly;

+      private TestMutualRecursionA result;

       

       private TestMutualRecursionA PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMutualRecursionA original = result;

           result = new TestMutualRecursionA();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -11186,13 +11262,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMutualRecursionA();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -11208,11 +11284,11 @@
       }

       

       public override TestMutualRecursionA BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -11328,7 +11404,7 @@
       public Builder ClearBb() {

         PrepareBuilder();

         result.hasBb = false;

-        result.bb_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance;

+        result.bb_ = null;

         return this;

       }

     }

@@ -11341,7 +11417,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestMutualRecursionB : pb::GeneratedMessage<TestMutualRecursionB, TestMutualRecursionB.Builder> {

-    private static readonly TestMutualRecursionB defaultInstance = new Builder().BuildPartial();

+    private static readonly TestMutualRecursionB defaultInstance = new TestMutualRecursionB().MakeReadOnly();

     private static readonly string[] _testMutualRecursionBFieldNames = new string[] { "a", "optional_int32" };

     private static readonly uint[] _testMutualRecursionBFieldTags = new uint[] { 10, 16 };

     public static TestMutualRecursionB DefaultInstance {

@@ -11349,7 +11425,7 @@
     }

     

     public override TestMutualRecursionB DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMutualRecursionB ThisMessage {

@@ -11366,12 +11442,12 @@
     

     public const int AFieldNumber = 1;

     private bool hasA;

-    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA a_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA a_;

     public bool HasA {

       get { return hasA; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA A {

-      get { return a_; }

+      get { return a_ ?? global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance; }

     }

     

     public const int OptionalInt32FieldNumber = 2;

@@ -11451,6 +11527,10 @@
     public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestMutualRecursionB MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -11466,22 +11546,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMutualRecursionB();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMutualRecursionB cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMutualRecursionB result;

+      private bool resultIsReadOnly;

+      private TestMutualRecursionB result;

       

       private TestMutualRecursionB PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMutualRecursionB original = result;

           result = new TestMutualRecursionB();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -11496,13 +11576,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMutualRecursionB();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -11518,11 +11598,11 @@
       }

       

       public override TestMutualRecursionB BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -11645,7 +11725,7 @@
       public Builder ClearA() {

         PrepareBuilder();

         result.hasA = false;

-        result.a_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance;

+        result.a_ = null;

         return this;

       }

       

@@ -11678,7 +11758,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestDupFieldNumber : pb::GeneratedMessage<TestDupFieldNumber, TestDupFieldNumber.Builder> {

-    private static readonly TestDupFieldNumber defaultInstance = new Builder().BuildPartial();

+    private static readonly TestDupFieldNumber defaultInstance = new TestDupFieldNumber().MakeReadOnly();

     private static readonly string[] _testDupFieldNumberFieldNames = new string[] { "a", "bar", "foo" };

     private static readonly uint[] _testDupFieldNumberFieldTags = new uint[] { 8, 27, 19 };

     public static TestDupFieldNumber DefaultInstance {

@@ -11686,7 +11766,7 @@
     }

     

     public override TestDupFieldNumber DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestDupFieldNumber ThisMessage {

@@ -11710,7 +11790,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class Foo : pb::GeneratedMessage<Foo, Foo.Builder> {

-        private static readonly Foo defaultInstance = new Builder().BuildPartial();

+        private static readonly Foo defaultInstance = new Foo().MakeReadOnly();

         private static readonly string[] _fooFieldNames = new string[] { "a" };

         private static readonly uint[] _fooFieldTags = new uint[] { 8 };

         public static Foo DefaultInstance {

@@ -11718,7 +11798,7 @@
         }

         

         public override Foo DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Foo ThisMessage {

@@ -11804,6 +11884,10 @@
         public static Foo ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private Foo MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -11819,22 +11903,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Foo();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Foo cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Foo result;

+          private bool resultIsReadOnly;

+          private Foo result;

           

           private Foo PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Foo original = result;

               result = new Foo();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -11849,13 +11933,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Foo();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -11871,11 +11955,11 @@
           }

           

           public override Foo BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -11979,7 +12063,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class Bar : pb::GeneratedMessage<Bar, Bar.Builder> {

-        private static readonly Bar defaultInstance = new Builder().BuildPartial();

+        private static readonly Bar defaultInstance = new Bar().MakeReadOnly();

         private static readonly string[] _barFieldNames = new string[] { "a" };

         private static readonly uint[] _barFieldTags = new uint[] { 8 };

         public static Bar DefaultInstance {

@@ -11987,7 +12071,7 @@
         }

         

         public override Bar DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Bar ThisMessage {

@@ -12073,6 +12157,10 @@
         public static Bar ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private Bar MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -12088,22 +12176,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Bar();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Bar cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Bar result;

+          private bool resultIsReadOnly;

+          private Bar result;

           

           private Bar PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Bar original = result;

               result = new Bar();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -12118,13 +12206,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Bar();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -12140,11 +12228,11 @@
           }

           

           public override Bar BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -12259,22 +12347,22 @@
     

     public const int FooFieldNumber = 2;

     private bool hasFoo;

-    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo foo_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo foo_;

     public bool HasFoo {

       get { return hasFoo; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo Foo {

-      get { return foo_; }

+      get { return foo_ ?? global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance; }

     }

     

     public const int BarFieldNumber = 3;

     private bool hasBar;

-    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar bar_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar bar_;

     public bool HasBar {

       get { return hasBar; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar Bar {

-      get { return bar_; }

+      get { return bar_ ?? global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -12350,6 +12438,10 @@
     public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestDupFieldNumber MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -12365,22 +12457,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestDupFieldNumber();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestDupFieldNumber cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestDupFieldNumber result;

+      private bool resultIsReadOnly;

+      private TestDupFieldNumber result;

       

       private TestDupFieldNumber PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestDupFieldNumber original = result;

           result = new TestDupFieldNumber();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -12395,13 +12487,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestDupFieldNumber();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -12417,11 +12509,11 @@
       }

       

       public override TestDupFieldNumber BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -12576,7 +12668,7 @@
       public Builder ClearFoo() {

         PrepareBuilder();

         result.hasFoo = false;

-        result.foo_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance;

+        result.foo_ = null;

         return this;

       }

       

@@ -12616,7 +12708,7 @@
       public Builder ClearBar() {

         PrepareBuilder();

         result.hasBar = false;

-        result.bar_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance;

+        result.bar_ = null;

         return this;

       }

     }

@@ -12629,7 +12721,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestNestedMessageHasBits : pb::GeneratedMessage<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> {

-    private static readonly TestNestedMessageHasBits defaultInstance = new Builder().BuildPartial();

+    private static readonly TestNestedMessageHasBits defaultInstance = new TestNestedMessageHasBits().MakeReadOnly();

     private static readonly string[] _testNestedMessageHasBitsFieldNames = new string[] { "optional_nested_message" };

     private static readonly uint[] _testNestedMessageHasBitsFieldTags = new uint[] { 10 };

     public static TestNestedMessageHasBits DefaultInstance {

@@ -12637,7 +12729,7 @@
     }

     

     public override TestNestedMessageHasBits DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestNestedMessageHasBits ThisMessage {

@@ -12661,7 +12753,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {

-        private static readonly NestedMessage defaultInstance = new Builder().BuildPartial();

+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();

         private static readonly string[] _nestedMessageFieldNames = new string[] { "nestedmessage_repeated_foreignmessage", "nestedmessage_repeated_int32" };

         private static readonly uint[] _nestedMessageFieldTags = new uint[] { 18, 8 };

         public static NestedMessage DefaultInstance {

@@ -12669,7 +12761,7 @@
         }

         

         public override NestedMessage DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override NestedMessage ThisMessage {

@@ -12780,6 +12872,12 @@
         public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private NestedMessage MakeReadOnly() {

+          nestedmessageRepeatedInt32_.MakeReadOnly();

+          nestedmessageRepeatedForeignmessage_.MakeReadOnly();

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -12795,22 +12893,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new NestedMessage();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(NestedMessage cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          NestedMessage result;

+          private bool resultIsReadOnly;

+          private NestedMessage result;

           

           private NestedMessage PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               NestedMessage original = result;

               result = new NestedMessage();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -12825,13 +12923,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new NestedMessage();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -12847,13 +12945,11 @@
           }

           

           public override NestedMessage BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            result.nestedmessageRepeatedInt32_.MakeReadOnly();

-            result.nestedmessageRepeatedForeignmessage_.MakeReadOnly();

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -13020,12 +13116,12 @@
     

     public const int OptionalNestedMessageFieldNumber = 1;

     private bool hasOptionalNestedMessage;

-    private global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage optionalNestedMessage_;

     public bool HasOptionalNestedMessage {

       get { return hasOptionalNestedMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {

-      get { return optionalNestedMessage_; }

+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -13089,6 +13185,10 @@
     public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestNestedMessageHasBits MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -13104,22 +13204,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestNestedMessageHasBits();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestNestedMessageHasBits cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestNestedMessageHasBits result;

+      private bool resultIsReadOnly;

+      private TestNestedMessageHasBits result;

       

       private TestNestedMessageHasBits PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestNestedMessageHasBits original = result;

           result = new TestNestedMessageHasBits();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -13134,13 +13234,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestNestedMessageHasBits();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -13156,11 +13256,11 @@
       }

       

       public override TestNestedMessageHasBits BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -13276,7 +13376,7 @@
       public Builder ClearOptionalNestedMessage() {

         PrepareBuilder();

         result.hasOptionalNestedMessage = false;

-        result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;

+        result.optionalNestedMessage_ = null;

         return this;

       }

     }

@@ -13289,7 +13389,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestCamelCaseFieldNames : pb::GeneratedMessage<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> {

-    private static readonly TestCamelCaseFieldNames defaultInstance = new Builder().BuildPartial();

+    private static readonly TestCamelCaseFieldNames defaultInstance = new TestCamelCaseFieldNames().MakeReadOnly();

     private static readonly string[] _testCamelCaseFieldNamesFieldNames = new string[] { "CordField", "EnumField", "MessageField", "PrimitiveField", "RepeatedCordField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedStringPieceField", "StringField", "StringPieceField" };

     private static readonly uint[] _testCamelCaseFieldNamesFieldTags = new uint[] { 50, 24, 34, 8, 98, 72, 82, 56, 66, 90, 18, 42 };

     public static TestCamelCaseFieldNames DefaultInstance {

@@ -13297,7 +13397,7 @@
     }

     

     public override TestCamelCaseFieldNames DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestCamelCaseFieldNames ThisMessage {

@@ -13344,12 +13444,12 @@
     

     public const int MessageFieldFieldNumber = 4;

     private bool hasMessageField;

-    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageField_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageField_;

     public bool HasMessageField {

       get { return hasMessageField; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageField {

-      get { return messageField_; }

+      get { return messageField_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }

     }

     

     public const int StringPieceFieldFieldNumber = 5;

@@ -13598,6 +13698,16 @@
     public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestCamelCaseFieldNames MakeReadOnly() {

+      repeatedPrimitiveField_.MakeReadOnly();

+      repeatedStringField_.MakeReadOnly();

+      repeatedEnumField_.MakeReadOnly();

+      repeatedMessageField_.MakeReadOnly();

+      repeatedStringPieceField_.MakeReadOnly();

+      repeatedCordField_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -13613,22 +13723,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestCamelCaseFieldNames();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestCamelCaseFieldNames cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestCamelCaseFieldNames result;

+      private bool resultIsReadOnly;

+      private TestCamelCaseFieldNames result;

       

       private TestCamelCaseFieldNames PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestCamelCaseFieldNames original = result;

           result = new TestCamelCaseFieldNames();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -13643,13 +13753,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestCamelCaseFieldNames();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -13665,17 +13775,11 @@
       }

       

       public override TestCamelCaseFieldNames BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.repeatedPrimitiveField_.MakeReadOnly();

-        result.repeatedStringField_.MakeReadOnly();

-        result.repeatedEnumField_.MakeReadOnly();

-        result.repeatedMessageField_.MakeReadOnly();

-        result.repeatedStringPieceField_.MakeReadOnly();

-        result.repeatedCordField_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -13948,7 +14052,7 @@
       public Builder ClearMessageField() {

         PrepareBuilder();

         result.hasMessageField = false;

-        result.messageField_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

+        result.messageField_ = null;

         return this;

       }

       

@@ -14203,7 +14307,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestFieldOrderings : pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder> {

-    private static readonly TestFieldOrderings defaultInstance = new Builder().BuildPartial();

+    private static readonly TestFieldOrderings defaultInstance = new TestFieldOrderings().MakeReadOnly();

     private static readonly string[] _testFieldOrderingsFieldNames = new string[] { "my_float", "my_int", "my_string" };

     private static readonly uint[] _testFieldOrderingsFieldTags = new uint[] { 813, 8, 90 };

     public static TestFieldOrderings DefaultInstance {

@@ -14211,7 +14315,7 @@
     }

     

     public override TestFieldOrderings DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestFieldOrderings ThisMessage {

@@ -14334,6 +14438,10 @@
     public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestFieldOrderings MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -14349,22 +14457,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestFieldOrderings();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestFieldOrderings cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestFieldOrderings result;

+      private bool resultIsReadOnly;

+      private TestFieldOrderings result;

       

       private TestFieldOrderings PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestFieldOrderings original = result;

           result = new TestFieldOrderings();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -14379,13 +14487,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestFieldOrderings();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -14401,11 +14509,11 @@
       }

       

       public override TestFieldOrderings BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -14565,7 +14673,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestExtremeDefaultValues : pb::GeneratedMessage<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> {

-    private static readonly TestExtremeDefaultValues defaultInstance = new Builder().BuildPartial();

+    private static readonly TestExtremeDefaultValues defaultInstance = new TestExtremeDefaultValues().MakeReadOnly();

     private static readonly string[] _testExtremeDefaultValuesFieldNames = new string[] { "escaped_bytes", "inf_double", "inf_float", "large_float", "large_uint32", "large_uint64", "nan_double", "nan_float", "neg_inf_double", "neg_inf_float", "negative_float", "negative_one_float", "one_float", "small_float", "small_int32", "small_int64", "small_negative_float", "utf8_string", "zero_float" };

     private static readonly uint[] _testExtremeDefaultValuesFieldTags = new uint[] { 10, 113, 141, 101, 16, 24, 129, 157, 121, 149, 93, 85, 69, 77, 32, 40, 109, 50, 61 };

     public static TestExtremeDefaultValues DefaultInstance {

@@ -14573,7 +14681,7 @@
     }

     

     public override TestExtremeDefaultValues DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestExtremeDefaultValues ThisMessage {

@@ -14949,6 +15057,10 @@
     public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestExtremeDefaultValues MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -14964,22 +15076,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestExtremeDefaultValues();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestExtremeDefaultValues cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestExtremeDefaultValues result;

+      private bool resultIsReadOnly;

+      private TestExtremeDefaultValues result;

       

       private TestExtremeDefaultValues PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestExtremeDefaultValues original = result;

           result = new TestExtremeDefaultValues();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -14994,13 +15106,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestExtremeDefaultValues();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -15016,11 +15128,11 @@
       }

       

       public override TestExtremeDefaultValues BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -15616,7 +15728,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class OneString : pb::GeneratedMessage<OneString, OneString.Builder> {

-    private static readonly OneString defaultInstance = new Builder().BuildPartial();

+    private static readonly OneString defaultInstance = new OneString().MakeReadOnly();

     private static readonly string[] _oneStringFieldNames = new string[] { "data" };

     private static readonly uint[] _oneStringFieldTags = new uint[] { 10 };

     public static OneString DefaultInstance {

@@ -15624,7 +15736,7 @@
     }

     

     public override OneString DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override OneString ThisMessage {

@@ -15710,6 +15822,10 @@
     public static OneString ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private OneString MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -15725,22 +15841,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new OneString();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(OneString cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      OneString result;

+      private bool resultIsReadOnly;

+      private OneString result;

       

       private OneString PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           OneString original = result;

           result = new OneString();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -15755,13 +15871,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new OneString();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -15777,11 +15893,11 @@
       }

       

       public override OneString BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -15886,7 +16002,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class OneBytes : pb::GeneratedMessage<OneBytes, OneBytes.Builder> {

-    private static readonly OneBytes defaultInstance = new Builder().BuildPartial();

+    private static readonly OneBytes defaultInstance = new OneBytes().MakeReadOnly();

     private static readonly string[] _oneBytesFieldNames = new string[] { "data" };

     private static readonly uint[] _oneBytesFieldTags = new uint[] { 10 };

     public static OneBytes DefaultInstance {

@@ -15894,7 +16010,7 @@
     }

     

     public override OneBytes DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override OneBytes ThisMessage {

@@ -15980,6 +16096,10 @@
     public static OneBytes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private OneBytes MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -15995,22 +16115,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new OneBytes();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(OneBytes cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      OneBytes result;

+      private bool resultIsReadOnly;

+      private OneBytes result;

       

       private OneBytes PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           OneBytes original = result;

           result = new OneBytes();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -16025,13 +16145,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new OneBytes();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -16047,11 +16167,11 @@
       }

       

       public override OneBytes BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -16156,7 +16276,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestPackedTypes : pb::GeneratedMessage<TestPackedTypes, TestPackedTypes.Builder> {

-    private static readonly TestPackedTypes defaultInstance = new Builder().BuildPartial();

+    private static readonly TestPackedTypes defaultInstance = new TestPackedTypes().MakeReadOnly();

     private static readonly string[] _testPackedTypesFieldNames = new string[] { "packed_bool", "packed_double", "packed_enum", "packed_fixed32", "packed_fixed64", "packed_float", "packed_int32", "packed_int64", "packed_sfixed32", "packed_sfixed64", "packed_sint32", "packed_sint64", "packed_uint32", "packed_uint64" };

     private static readonly uint[] _testPackedTypesFieldTags = new uint[] { 818, 810, 826, 770, 778, 802, 722, 730, 786, 794, 754, 762, 738, 746 };

     public static TestPackedTypes DefaultInstance {

@@ -16164,7 +16284,7 @@
     }

     

     public override TestPackedTypes DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestPackedTypes ThisMessage {

@@ -16607,6 +16727,24 @@
     public static TestPackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestPackedTypes MakeReadOnly() {

+      packedInt32_.MakeReadOnly();

+      packedInt64_.MakeReadOnly();

+      packedUint32_.MakeReadOnly();

+      packedUint64_.MakeReadOnly();

+      packedSint32_.MakeReadOnly();

+      packedSint64_.MakeReadOnly();

+      packedFixed32_.MakeReadOnly();

+      packedFixed64_.MakeReadOnly();

+      packedSfixed32_.MakeReadOnly();

+      packedSfixed64_.MakeReadOnly();

+      packedFloat_.MakeReadOnly();

+      packedDouble_.MakeReadOnly();

+      packedBool_.MakeReadOnly();

+      packedEnum_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -16622,22 +16760,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestPackedTypes();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestPackedTypes cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestPackedTypes result;

+      private bool resultIsReadOnly;

+      private TestPackedTypes result;

       

       private TestPackedTypes PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestPackedTypes original = result;

           result = new TestPackedTypes();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -16652,13 +16790,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestPackedTypes();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -16674,25 +16812,11 @@
       }

       

       public override TestPackedTypes BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.packedInt32_.MakeReadOnly();

-        result.packedInt64_.MakeReadOnly();

-        result.packedUint32_.MakeReadOnly();

-        result.packedUint64_.MakeReadOnly();

-        result.packedSint32_.MakeReadOnly();

-        result.packedSint64_.MakeReadOnly();

-        result.packedFixed32_.MakeReadOnly();

-        result.packedFixed64_.MakeReadOnly();

-        result.packedSfixed32_.MakeReadOnly();

-        result.packedSfixed64_.MakeReadOnly();

-        result.packedFloat_.MakeReadOnly();

-        result.packedDouble_.MakeReadOnly();

-        result.packedBool_.MakeReadOnly();

-        result.packedEnum_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -17330,7 +17454,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestUnpackedTypes : pb::GeneratedMessage<TestUnpackedTypes, TestUnpackedTypes.Builder> {

-    private static readonly TestUnpackedTypes defaultInstance = new Builder().BuildPartial();

+    private static readonly TestUnpackedTypes defaultInstance = new TestUnpackedTypes().MakeReadOnly();

     private static readonly string[] _testUnpackedTypesFieldNames = new string[] { "unpacked_bool", "unpacked_double", "unpacked_enum", "unpacked_fixed32", "unpacked_fixed64", "unpacked_float", "unpacked_int32", "unpacked_int64", "unpacked_sfixed32", "unpacked_sfixed64", "unpacked_sint32", "unpacked_sint64", "unpacked_uint32", "unpacked_uint64" };

     private static readonly uint[] _testUnpackedTypesFieldTags = new uint[] { 816, 809, 824, 773, 777, 805, 720, 728, 789, 793, 752, 760, 736, 744 };

     public static TestUnpackedTypes DefaultInstance {

@@ -17338,7 +17462,7 @@
     }

     

     public override TestUnpackedTypes DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestUnpackedTypes ThisMessage {

@@ -17726,6 +17850,24 @@
     public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestUnpackedTypes MakeReadOnly() {

+      unpackedInt32_.MakeReadOnly();

+      unpackedInt64_.MakeReadOnly();

+      unpackedUint32_.MakeReadOnly();

+      unpackedUint64_.MakeReadOnly();

+      unpackedSint32_.MakeReadOnly();

+      unpackedSint64_.MakeReadOnly();

+      unpackedFixed32_.MakeReadOnly();

+      unpackedFixed64_.MakeReadOnly();

+      unpackedSfixed32_.MakeReadOnly();

+      unpackedSfixed64_.MakeReadOnly();

+      unpackedFloat_.MakeReadOnly();

+      unpackedDouble_.MakeReadOnly();

+      unpackedBool_.MakeReadOnly();

+      unpackedEnum_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -17741,22 +17883,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestUnpackedTypes();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestUnpackedTypes cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestUnpackedTypes result;

+      private bool resultIsReadOnly;

+      private TestUnpackedTypes result;

       

       private TestUnpackedTypes PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestUnpackedTypes original = result;

           result = new TestUnpackedTypes();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -17771,13 +17913,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestUnpackedTypes();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -17793,25 +17935,11 @@
       }

       

       public override TestUnpackedTypes BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.unpackedInt32_.MakeReadOnly();

-        result.unpackedInt64_.MakeReadOnly();

-        result.unpackedUint32_.MakeReadOnly();

-        result.unpackedUint64_.MakeReadOnly();

-        result.unpackedSint32_.MakeReadOnly();

-        result.unpackedSint64_.MakeReadOnly();

-        result.unpackedFixed32_.MakeReadOnly();

-        result.unpackedFixed64_.MakeReadOnly();

-        result.unpackedSfixed32_.MakeReadOnly();

-        result.unpackedSfixed64_.MakeReadOnly();

-        result.unpackedFloat_.MakeReadOnly();

-        result.unpackedDouble_.MakeReadOnly();

-        result.unpackedBool_.MakeReadOnly();

-        result.unpackedEnum_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -18449,7 +18577,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestPackedExtensions : pb::ExtendableMessage<TestPackedExtensions, TestPackedExtensions.Builder> {

-    private static readonly TestPackedExtensions defaultInstance = new Builder().BuildPartial();

+    private static readonly TestPackedExtensions defaultInstance = new TestPackedExtensions().MakeReadOnly();

     private static readonly string[] _testPackedExtensionsFieldNames = new string[] {  };

     private static readonly uint[] _testPackedExtensionsFieldTags = new uint[] {  };

     public static TestPackedExtensions DefaultInstance {

@@ -18457,7 +18585,7 @@
     }

     

     public override TestPackedExtensions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestPackedExtensions ThisMessage {

@@ -18531,6 +18659,10 @@
     public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestPackedExtensions MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -18546,22 +18678,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestPackedExtensions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestPackedExtensions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestPackedExtensions result;

+      private bool resultIsReadOnly;

+      private TestPackedExtensions result;

       

       private TestPackedExtensions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestPackedExtensions original = result;

           result = new TestPackedExtensions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -18576,13 +18708,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestPackedExtensions();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -18598,11 +18730,11 @@
       }

       

       public override TestPackedExtensions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -18680,7 +18812,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestUnpackedExtensions : pb::ExtendableMessage<TestUnpackedExtensions, TestUnpackedExtensions.Builder> {

-    private static readonly TestUnpackedExtensions defaultInstance = new Builder().BuildPartial();

+    private static readonly TestUnpackedExtensions defaultInstance = new TestUnpackedExtensions().MakeReadOnly();

     private static readonly string[] _testUnpackedExtensionsFieldNames = new string[] {  };

     private static readonly uint[] _testUnpackedExtensionsFieldTags = new uint[] {  };

     public static TestUnpackedExtensions DefaultInstance {

@@ -18688,7 +18820,7 @@
     }

     

     public override TestUnpackedExtensions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestUnpackedExtensions ThisMessage {

@@ -18762,6 +18894,10 @@
     public static TestUnpackedExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestUnpackedExtensions MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -18777,22 +18913,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestUnpackedExtensions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestUnpackedExtensions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestUnpackedExtensions result;

+      private bool resultIsReadOnly;

+      private TestUnpackedExtensions result;

       

       private TestUnpackedExtensions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestUnpackedExtensions original = result;

           result = new TestUnpackedExtensions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -18807,13 +18943,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestUnpackedExtensions();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -18829,11 +18965,11 @@
       }

       

       public override TestUnpackedExtensions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -18911,7 +19047,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestDynamicExtensions : pb::GeneratedMessage<TestDynamicExtensions, TestDynamicExtensions.Builder> {

-    private static readonly TestDynamicExtensions defaultInstance = new Builder().BuildPartial();

+    private static readonly TestDynamicExtensions defaultInstance = new TestDynamicExtensions().MakeReadOnly();

     private static readonly string[] _testDynamicExtensionsFieldNames = new string[] { "dynamic_enum_extension", "dynamic_message_extension", "enum_extension", "message_extension", "packed_extension", "repeated_extension", "scalar_extension" };

     private static readonly uint[] _testDynamicExtensionsFieldTags = new uint[] { 16016, 16034, 16008, 16026, 16050, 16042, 16005 };

     public static TestDynamicExtensions DefaultInstance {

@@ -18919,7 +19055,7 @@
     }

     

     public override TestDynamicExtensions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestDynamicExtensions ThisMessage {

@@ -18951,7 +19087,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class DynamicMessageType : pb::GeneratedMessage<DynamicMessageType, DynamicMessageType.Builder> {

-        private static readonly DynamicMessageType defaultInstance = new Builder().BuildPartial();

+        private static readonly DynamicMessageType defaultInstance = new DynamicMessageType().MakeReadOnly();

         private static readonly string[] _dynamicMessageTypeFieldNames = new string[] { "dynamic_field" };

         private static readonly uint[] _dynamicMessageTypeFieldTags = new uint[] { 16800 };

         public static DynamicMessageType DefaultInstance {

@@ -18959,7 +19095,7 @@
         }

         

         public override DynamicMessageType DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override DynamicMessageType ThisMessage {

@@ -19045,6 +19181,10 @@
         public static DynamicMessageType ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private DynamicMessageType MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -19060,22 +19200,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new DynamicMessageType();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(DynamicMessageType cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          DynamicMessageType result;

+          private bool resultIsReadOnly;

+          private DynamicMessageType result;

           

           private DynamicMessageType PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               DynamicMessageType original = result;

               result = new DynamicMessageType();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -19090,13 +19230,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new DynamicMessageType();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

@@ -19112,11 +19252,11 @@
           }

           

           public override DynamicMessageType BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -19252,22 +19392,22 @@
     

     public const int MessageExtensionFieldNumber = 2003;

     private bool hasMessageExtension;

-    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageExtension_;

     public bool HasMessageExtension {

       get { return hasMessageExtension; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageExtension {

-      get { return messageExtension_; }

+      get { return messageExtension_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }

     }

     

     public const int DynamicMessageExtensionFieldNumber = 2004;

     private bool hasDynamicMessageExtension;

-    private global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType dynamicMessageExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType dynamicMessageExtension_;

     public bool HasDynamicMessageExtension {

       get { return hasDynamicMessageExtension; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType DynamicMessageExtension {

-      get { return dynamicMessageExtension_; }

+      get { return dynamicMessageExtension_ ?? global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance; }

     }

     

     public const int RepeatedExtensionFieldNumber = 2005;

@@ -19405,6 +19545,12 @@
     public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestDynamicExtensions MakeReadOnly() {

+      repeatedExtension_.MakeReadOnly();

+      packedExtension_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -19420,22 +19566,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestDynamicExtensions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestDynamicExtensions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestDynamicExtensions result;

+      private bool resultIsReadOnly;

+      private TestDynamicExtensions result;

       

       private TestDynamicExtensions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestDynamicExtensions original = result;

           result = new TestDynamicExtensions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -19450,13 +19596,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestDynamicExtensions();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -19472,13 +19618,11 @@
       }

       

       public override TestDynamicExtensions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.repeatedExtension_.MakeReadOnly();

-        result.packedExtension_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -19720,7 +19864,7 @@
       public Builder ClearMessageExtension() {

         PrepareBuilder();

         result.hasMessageExtension = false;

-        result.messageExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance;

+        result.messageExtension_ = null;

         return this;

       }

       

@@ -19760,7 +19904,7 @@
       public Builder ClearDynamicMessageExtension() {

         PrepareBuilder();

         result.hasDynamicMessageExtension = false;

-        result.dynamicMessageExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance;

+        result.dynamicMessageExtension_ = null;

         return this;

       }

       

@@ -19835,7 +19979,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestRepeatedScalarDifferentTagSizes : pb::GeneratedMessage<TestRepeatedScalarDifferentTagSizes, TestRepeatedScalarDifferentTagSizes.Builder> {

-    private static readonly TestRepeatedScalarDifferentTagSizes defaultInstance = new Builder().BuildPartial();

+    private static readonly TestRepeatedScalarDifferentTagSizes defaultInstance = new TestRepeatedScalarDifferentTagSizes().MakeReadOnly();

     private static readonly string[] _testRepeatedScalarDifferentTagSizesFieldNames = new string[] { "repeated_fixed32", "repeated_fixed64", "repeated_float", "repeated_int32", "repeated_int64", "repeated_uint64" };

     private static readonly uint[] _testRepeatedScalarDifferentTagSizesFieldTags = new uint[] { 101, 16369, 2097141, 104, 16376, 2097144 };

     public static TestRepeatedScalarDifferentTagSizes DefaultInstance {

@@ -19843,7 +19987,7 @@
     }

     

     public override TestRepeatedScalarDifferentTagSizes DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestRepeatedScalarDifferentTagSizes ThisMessage {

@@ -20051,6 +20195,16 @@
     public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestRepeatedScalarDifferentTagSizes MakeReadOnly() {

+      repeatedFixed32_.MakeReadOnly();

+      repeatedInt32_.MakeReadOnly();

+      repeatedFixed64_.MakeReadOnly();

+      repeatedInt64_.MakeReadOnly();

+      repeatedFloat_.MakeReadOnly();

+      repeatedUint64_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -20066,22 +20220,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestRepeatedScalarDifferentTagSizes();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestRepeatedScalarDifferentTagSizes cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestRepeatedScalarDifferentTagSizes result;

+      private bool resultIsReadOnly;

+      private TestRepeatedScalarDifferentTagSizes result;

       

       private TestRepeatedScalarDifferentTagSizes PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestRepeatedScalarDifferentTagSizes original = result;

           result = new TestRepeatedScalarDifferentTagSizes();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -20096,13 +20250,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestRepeatedScalarDifferentTagSizes();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -20118,17 +20272,11 @@
       }

       

       public override TestRepeatedScalarDifferentTagSizes BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.repeatedFixed32_.MakeReadOnly();

-        result.repeatedInt32_.MakeReadOnly();

-        result.repeatedFixed64_.MakeReadOnly();

-        result.repeatedInt64_.MakeReadOnly();

-        result.repeatedFloat_.MakeReadOnly();

-        result.repeatedUint64_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -20448,7 +20596,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class FooRequest : pb::GeneratedMessage<FooRequest, FooRequest.Builder> {

-    private static readonly FooRequest defaultInstance = new Builder().BuildPartial();

+    private static readonly FooRequest defaultInstance = new FooRequest().MakeReadOnly();

     private static readonly string[] _fooRequestFieldNames = new string[] {  };

     private static readonly uint[] _fooRequestFieldTags = new uint[] {  };

     public static FooRequest DefaultInstance {

@@ -20456,7 +20604,7 @@
     }

     

     public override FooRequest DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FooRequest ThisMessage {

@@ -20526,6 +20674,10 @@
     public static FooRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private FooRequest MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -20541,22 +20693,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FooRequest();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FooRequest cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FooRequest result;

+      private bool resultIsReadOnly;

+      private FooRequest result;

       

       private FooRequest PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FooRequest original = result;

           result = new FooRequest();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -20571,13 +20723,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FooRequest();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -20593,11 +20745,11 @@
       }

       

       public override FooRequest BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -20674,7 +20826,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class FooResponse : pb::GeneratedMessage<FooResponse, FooResponse.Builder> {

-    private static readonly FooResponse defaultInstance = new Builder().BuildPartial();

+    private static readonly FooResponse defaultInstance = new FooResponse().MakeReadOnly();

     private static readonly string[] _fooResponseFieldNames = new string[] {  };

     private static readonly uint[] _fooResponseFieldTags = new uint[] {  };

     public static FooResponse DefaultInstance {

@@ -20682,7 +20834,7 @@
     }

     

     public override FooResponse DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FooResponse ThisMessage {

@@ -20752,6 +20904,10 @@
     public static FooResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private FooResponse MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -20767,22 +20923,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FooResponse();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FooResponse cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FooResponse result;

+      private bool resultIsReadOnly;

+      private FooResponse result;

       

       private FooResponse PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FooResponse original = result;

           result = new FooResponse();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -20797,13 +20953,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FooResponse();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -20819,11 +20975,11 @@
       }

       

       public override FooResponse BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -20900,7 +21056,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class BarRequest : pb::GeneratedMessage<BarRequest, BarRequest.Builder> {

-    private static readonly BarRequest defaultInstance = new Builder().BuildPartial();

+    private static readonly BarRequest defaultInstance = new BarRequest().MakeReadOnly();

     private static readonly string[] _barRequestFieldNames = new string[] {  };

     private static readonly uint[] _barRequestFieldTags = new uint[] {  };

     public static BarRequest DefaultInstance {

@@ -20908,7 +21064,7 @@
     }

     

     public override BarRequest DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override BarRequest ThisMessage {

@@ -20978,6 +21134,10 @@
     public static BarRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private BarRequest MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -20993,22 +21153,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new BarRequest();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(BarRequest cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      BarRequest result;

+      private bool resultIsReadOnly;

+      private BarRequest result;

       

       private BarRequest PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           BarRequest original = result;

           result = new BarRequest();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -21023,13 +21183,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new BarRequest();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -21045,11 +21205,11 @@
       }

       

       public override BarRequest BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -21126,7 +21286,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class BarResponse : pb::GeneratedMessage<BarResponse, BarResponse.Builder> {

-    private static readonly BarResponse defaultInstance = new Builder().BuildPartial();

+    private static readonly BarResponse defaultInstance = new BarResponse().MakeReadOnly();

     private static readonly string[] _barResponseFieldNames = new string[] {  };

     private static readonly uint[] _barResponseFieldTags = new uint[] {  };

     public static BarResponse DefaultInstance {

@@ -21134,7 +21294,7 @@
     }

     

     public override BarResponse DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override BarResponse ThisMessage {

@@ -21204,6 +21364,10 @@
     public static BarResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private BarResponse MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -21219,22 +21383,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new BarResponse();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(BarResponse cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      BarResponse result;

+      private bool resultIsReadOnly;

+      private BarResponse result;

       

       private BarResponse PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           BarResponse original = result;

           result = new BarResponse();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -21249,13 +21413,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new BarResponse();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

@@ -21271,11 +21435,11 @@
       }

       

       public override BarResponse BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {