Regenerated code with changes
diff --git a/src/AddressBook/AddressBookProtos.cs b/src/AddressBook/AddressBookProtos.cs
index 8bb19df..92d41ac 100644
--- a/src/AddressBook/AddressBookProtos.cs
+++ b/src/AddressBook/AddressBookProtos.cs
@@ -68,7 +68,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _personFieldNames = new string[] { "email", "id", "name", "phone" };

     private static readonly uint[] _personFieldTags = new uint[] { 26, 16, 10, 34 };

     public static Person DefaultInstance {

@@ -76,7 +76,7 @@
     }

     

     public override Person DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override Person ThisMessage {

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

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

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

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

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

         private static readonly string[] _phoneNumberFieldNames = new string[] { "number", "type" };

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

         public static PhoneNumber DefaultInstance {

@@ -116,7 +116,7 @@
         }

         

         public override PhoneNumber DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override PhoneNumber ThisMessage {

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

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

         }

+        private PhoneNumber MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

@@ -234,22 +238,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new PhoneNumber();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(PhoneNumber cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          PhoneNumber result;

+          private bool resultIsReadOnly;

+          private PhoneNumber result;

           

           private PhoneNumber PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               PhoneNumber original = result;

               result = new PhoneNumber();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -264,13 +268,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new PhoneNumber();

-            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);

@@ -286,11 +290,11 @@
           }

           

           public override PhoneNumber BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -555,6 +559,11 @@
     public static Person ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private Person MakeReadOnly() {

+      phone_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -570,22 +579,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new Person();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(Person cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      Person result;

+      private bool resultIsReadOnly;

+      private Person result;

       

       private Person PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           Person original = result;

           result = new Person();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -600,13 +609,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new Person();

-        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);

@@ -622,12 +631,11 @@
       }

       

       public override Person BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.phone_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _addressBookFieldNames = new string[] { "person" };

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

     public static AddressBook DefaultInstance {

@@ -846,7 +854,7 @@
     }

     

     public override AddressBook DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override AddressBook ThisMessage {

@@ -937,6 +945,11 @@
     public static AddressBook ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private AddressBook MakeReadOnly() {

+      person_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -952,22 +965,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new AddressBook();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(AddressBook cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      AddressBook result;

+      private bool resultIsReadOnly;

+      private AddressBook result;

       

       private AddressBook PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           AddressBook original = result;

           result = new AddressBook();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -982,13 +995,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new AddressBook();

-        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);

@@ -1004,12 +1017,11 @@
       }

       

       public override AddressBook BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.person_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
index 215b9b4..e6b39f4 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
@@ -60,7 +60,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _optionsMessageFieldNames = new string[] { "customized", "normal", "options_message" };

     private static readonly uint[] _optionsMessageFieldTags = new uint[] { 26, 10, 18 };

     public static OptionsMessage DefaultInstance {

@@ -68,7 +68,7 @@
     }

     

     public override OptionsMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override OptionsMessage ThisMessage {

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

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

     }

+    private OptionsMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -201,22 +205,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new OptionsMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(OptionsMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      OptionsMessage result;

+      private bool resultIsReadOnly;

+      private OptionsMessage result;

       

       private OptionsMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           OptionsMessage original = result;

           result = new OptionsMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -231,13 +235,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new OptionsMessage();

-        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);

@@ -253,11 +257,11 @@
       }

       

       public override OptionsMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
index bc29da2..c030e0e 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
@@ -400,7 +400,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _testMessageWithCustomOptionsFieldNames = new string[] { "field1" };

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

     public static TestMessageWithCustomOptions DefaultInstance {

@@ -408,7 +408,7 @@
     }

     

     public override TestMessageWithCustomOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMessageWithCustomOptions ThisMessage {

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

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

     }

+    private TestMessageWithCustomOptions MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -524,22 +528,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMessageWithCustomOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMessageWithCustomOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMessageWithCustomOptions result;

+      private bool resultIsReadOnly;

+      private TestMessageWithCustomOptions result;

       

       private TestMessageWithCustomOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMessageWithCustomOptions original = result;

           result = new TestMessageWithCustomOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -554,13 +558,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMessageWithCustomOptions();

-        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);

@@ -576,11 +580,11 @@
       }

       

       public override TestMessageWithCustomOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static CustomOptionFooRequest DefaultInstance {

@@ -693,7 +697,7 @@
     }

     

     public override CustomOptionFooRequest DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CustomOptionFooRequest ThisMessage {

@@ -763,6 +767,10 @@
     public static CustomOptionFooRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CustomOptionFooRequest MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -778,22 +786,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CustomOptionFooRequest();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CustomOptionFooRequest cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CustomOptionFooRequest result;

+      private bool resultIsReadOnly;

+      private CustomOptionFooRequest result;

       

       private CustomOptionFooRequest PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CustomOptionFooRequest original = result;

           result = new CustomOptionFooRequest();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -808,13 +816,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CustomOptionFooRequest();

-        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);

@@ -830,11 +838,11 @@
       }

       

       public override CustomOptionFooRequest BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static CustomOptionFooResponse DefaultInstance {

@@ -919,7 +927,7 @@
     }

     

     public override CustomOptionFooResponse DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CustomOptionFooResponse ThisMessage {

@@ -989,6 +997,10 @@
     public static CustomOptionFooResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CustomOptionFooResponse MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1004,22 +1016,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CustomOptionFooResponse();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CustomOptionFooResponse cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CustomOptionFooResponse result;

+      private bool resultIsReadOnly;

+      private CustomOptionFooResponse result;

       

       private CustomOptionFooResponse PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CustomOptionFooResponse original = result;

           result = new CustomOptionFooResponse();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1034,13 +1046,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CustomOptionFooResponse();

-        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);

@@ -1056,11 +1068,11 @@
       }

       

       public override CustomOptionFooResponse BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static DummyMessageContainingEnum DefaultInstance {

@@ -1145,7 +1157,7 @@
     }

     

     public override DummyMessageContainingEnum DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override DummyMessageContainingEnum ThisMessage {

@@ -1230,6 +1242,10 @@
     public static DummyMessageContainingEnum ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private DummyMessageContainingEnum MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1245,22 +1261,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new DummyMessageContainingEnum();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(DummyMessageContainingEnum cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      DummyMessageContainingEnum result;

+      private bool resultIsReadOnly;

+      private DummyMessageContainingEnum result;

       

       private DummyMessageContainingEnum PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           DummyMessageContainingEnum original = result;

           result = new DummyMessageContainingEnum();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1275,13 +1291,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new DummyMessageContainingEnum();

-        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);

@@ -1297,11 +1313,11 @@
       }

       

       public override DummyMessageContainingEnum BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static DummyMessageInvalidAsOptionType DefaultInstance {

@@ -1386,7 +1402,7 @@
     }

     

     public override DummyMessageInvalidAsOptionType DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override DummyMessageInvalidAsOptionType ThisMessage {

@@ -1456,6 +1472,10 @@
     public static DummyMessageInvalidAsOptionType ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private DummyMessageInvalidAsOptionType MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1471,22 +1491,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new DummyMessageInvalidAsOptionType();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(DummyMessageInvalidAsOptionType cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      DummyMessageInvalidAsOptionType result;

+      private bool resultIsReadOnly;

+      private DummyMessageInvalidAsOptionType result;

       

       private DummyMessageInvalidAsOptionType PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           DummyMessageInvalidAsOptionType original = result;

           result = new DummyMessageInvalidAsOptionType();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1501,13 +1521,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new DummyMessageInvalidAsOptionType();

-        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);

@@ -1523,11 +1543,11 @@
       }

       

       public override DummyMessageInvalidAsOptionType BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static CustomOptionMinIntegerValues DefaultInstance {

@@ -1612,7 +1632,7 @@
     }

     

     public override CustomOptionMinIntegerValues DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CustomOptionMinIntegerValues ThisMessage {

@@ -1682,6 +1702,10 @@
     public static CustomOptionMinIntegerValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CustomOptionMinIntegerValues MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1697,22 +1721,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CustomOptionMinIntegerValues();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CustomOptionMinIntegerValues cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CustomOptionMinIntegerValues result;

+      private bool resultIsReadOnly;

+      private CustomOptionMinIntegerValues result;

       

       private CustomOptionMinIntegerValues PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CustomOptionMinIntegerValues original = result;

           result = new CustomOptionMinIntegerValues();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1727,13 +1751,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CustomOptionMinIntegerValues();

-        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);

@@ -1749,11 +1773,11 @@
       }

       

       public override CustomOptionMinIntegerValues BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static CustomOptionMaxIntegerValues DefaultInstance {

@@ -1838,7 +1862,7 @@
     }

     

     public override CustomOptionMaxIntegerValues DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CustomOptionMaxIntegerValues ThisMessage {

@@ -1908,6 +1932,10 @@
     public static CustomOptionMaxIntegerValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CustomOptionMaxIntegerValues MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1923,22 +1951,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CustomOptionMaxIntegerValues();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CustomOptionMaxIntegerValues cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CustomOptionMaxIntegerValues result;

+      private bool resultIsReadOnly;

+      private CustomOptionMaxIntegerValues result;

       

       private CustomOptionMaxIntegerValues PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CustomOptionMaxIntegerValues original = result;

           result = new CustomOptionMaxIntegerValues();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1953,13 +1981,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CustomOptionMaxIntegerValues();

-        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);

@@ -1975,11 +2003,11 @@
       }

       

       public override CustomOptionMaxIntegerValues BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static CustomOptionOtherValues DefaultInstance {

@@ -2064,7 +2092,7 @@
     }

     

     public override CustomOptionOtherValues DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CustomOptionOtherValues ThisMessage {

@@ -2134,6 +2162,10 @@
     public static CustomOptionOtherValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CustomOptionOtherValues MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2149,22 +2181,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CustomOptionOtherValues();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CustomOptionOtherValues cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CustomOptionOtherValues result;

+      private bool resultIsReadOnly;

+      private CustomOptionOtherValues result;

       

       private CustomOptionOtherValues PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CustomOptionOtherValues original = result;

           result = new CustomOptionOtherValues();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2179,13 +2211,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CustomOptionOtherValues();

-        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);

@@ -2201,11 +2233,11 @@
       }

       

       public override CustomOptionOtherValues BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static SettingRealsFromPositiveInts DefaultInstance {

@@ -2290,7 +2322,7 @@
     }

     

     public override SettingRealsFromPositiveInts DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SettingRealsFromPositiveInts ThisMessage {

@@ -2360,6 +2392,10 @@
     public static SettingRealsFromPositiveInts ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SettingRealsFromPositiveInts MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2375,22 +2411,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SettingRealsFromPositiveInts();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SettingRealsFromPositiveInts cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SettingRealsFromPositiveInts result;

+      private bool resultIsReadOnly;

+      private SettingRealsFromPositiveInts result;

       

       private SettingRealsFromPositiveInts PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SettingRealsFromPositiveInts original = result;

           result = new SettingRealsFromPositiveInts();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2405,13 +2441,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SettingRealsFromPositiveInts();

-        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);

@@ -2427,11 +2463,11 @@
       }

       

       public override SettingRealsFromPositiveInts BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static SettingRealsFromNegativeInts DefaultInstance {

@@ -2516,7 +2552,7 @@
     }

     

     public override SettingRealsFromNegativeInts DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SettingRealsFromNegativeInts ThisMessage {

@@ -2586,6 +2622,10 @@
     public static SettingRealsFromNegativeInts ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SettingRealsFromNegativeInts MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2601,22 +2641,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SettingRealsFromNegativeInts();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SettingRealsFromNegativeInts cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SettingRealsFromNegativeInts result;

+      private bool resultIsReadOnly;

+      private SettingRealsFromNegativeInts result;

       

       private SettingRealsFromNegativeInts PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SettingRealsFromNegativeInts original = result;

           result = new SettingRealsFromNegativeInts();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2631,13 +2671,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SettingRealsFromNegativeInts();

-        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);

@@ -2653,11 +2693,11 @@
       }

       

       public override SettingRealsFromNegativeInts BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _complexOptionType1FieldNames = new string[] { "foo", "foo2", "foo3" };

     private static readonly uint[] _complexOptionType1FieldTags = new uint[] { 8, 16, 24 };

     public static ComplexOptionType1 DefaultInstance {

@@ -2742,7 +2782,7 @@
     }

     

     public override ComplexOptionType1 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ComplexOptionType1 ThisMessage {

@@ -2864,6 +2904,10 @@
     public static ComplexOptionType1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private ComplexOptionType1 MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2879,22 +2923,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ComplexOptionType1();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ComplexOptionType1 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ComplexOptionType1 result;

+      private bool resultIsReadOnly;

+      private ComplexOptionType1 result;

       

       private ComplexOptionType1 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ComplexOptionType1 original = result;

           result = new ComplexOptionType1();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2909,13 +2953,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ComplexOptionType1();

-        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);

@@ -2931,11 +2975,11 @@
       }

       

       public override ComplexOptionType1 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _complexOptionType2FieldNames = new string[] { "bar", "baz", "fred" };

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

     public static ComplexOptionType2 DefaultInstance {

@@ -3102,7 +3146,7 @@
     }

     

     public override ComplexOptionType2 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ComplexOptionType2 ThisMessage {

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

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

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

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

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

         private static readonly string[] _complexOptionType4FieldNames = new string[] { "waldo" };

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

         public static ComplexOptionType4 DefaultInstance {

@@ -3134,7 +3178,7 @@
         }

         

         public override ComplexOptionType4 DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override ComplexOptionType4 ThisMessage {

@@ -3222,6 +3266,10 @@
         public static ComplexOptionType4 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private ComplexOptionType4 MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

@@ -3237,22 +3285,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new ComplexOptionType4();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(ComplexOptionType4 cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          ComplexOptionType4 result;

+          private bool resultIsReadOnly;

+          private ComplexOptionType4 result;

           

           private ComplexOptionType4 PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               ComplexOptionType4 original = result;

               result = new ComplexOptionType4();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -3267,13 +3315,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new ComplexOptionType4();

-            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);

@@ -3289,11 +3337,11 @@
           }

           

           public override ComplexOptionType4 BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -3398,12 +3446,12 @@
     

     public const int BarFieldNumber = 1;

     private bool hasBar;

-    private global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1 bar_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1 bar_;

     public bool HasBar {

       get { return hasBar; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1 Bar {

-      get { return bar_; }

+      get { return bar_ ?? global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.DefaultInstance; }

     }

     

     public const int BazFieldNumber = 2;

@@ -3418,12 +3466,12 @@
     

     public const int FredFieldNumber = 3;

     private bool hasFred;

-    private global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 fred_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 fred_;

     public bool HasFred {

       get { return hasFred; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 Fred {

-      get { return fred_; }

+      get { return fred_ ?? global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -3506,6 +3554,10 @@
     public static ComplexOptionType2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private ComplexOptionType2 MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -3521,22 +3573,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ComplexOptionType2();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ComplexOptionType2 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ComplexOptionType2 result;

+      private bool resultIsReadOnly;

+      private ComplexOptionType2 result;

       

       private ComplexOptionType2 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ComplexOptionType2 original = result;

           result = new ComplexOptionType2();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3551,13 +3603,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ComplexOptionType2();

-        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);

@@ -3573,11 +3625,11 @@
       }

       

       public override ComplexOptionType2 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -3713,7 +3765,7 @@
       public Builder ClearBar() {

         PrepareBuilder();

         result.hasBar = false;

-        result.bar_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.DefaultInstance;

+        result.bar_ = null;

         return this;

       }

       

@@ -3773,7 +3825,7 @@
       public Builder ClearFred() {

         PrepareBuilder();

         result.hasFred = false;

-        result.fred_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.DefaultInstance;

+        result.fred_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _complexOptionType3FieldNames = new string[] { "complexoptiontype5", "qux" };

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

     public static ComplexOptionType3 DefaultInstance {

@@ -3794,7 +3846,7 @@
     }

     

     public override ComplexOptionType3 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ComplexOptionType3 ThisMessage {

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

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

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

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

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

         private static readonly string[] _complexOptionType5FieldNames = new string[] { "plugh" };

         private static readonly uint[] _complexOptionType5FieldTags = new uint[] { 24 };

         public static ComplexOptionType5 DefaultInstance {

@@ -3826,7 +3878,7 @@
         }

         

         public override ComplexOptionType5 DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override ComplexOptionType5 ThisMessage {

@@ -3912,6 +3964,10 @@
         public static ComplexOptionType5 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private ComplexOptionType5 MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

@@ -3927,22 +3983,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new ComplexOptionType5();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(ComplexOptionType5 cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          ComplexOptionType5 result;

+          private bool resultIsReadOnly;

+          private ComplexOptionType5 result;

           

           private ComplexOptionType5 PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               ComplexOptionType5 original = result;

               result = new ComplexOptionType5();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -3957,13 +4013,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new ComplexOptionType5();

-            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);

@@ -3979,11 +4035,11 @@
           }

           

           public override ComplexOptionType5 BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -4098,12 +4154,12 @@
     

     public const int ComplexOptionType5FieldNumber = 2;

     private bool hasComplexOptionType5;

-    private global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5 complexOptionType5_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5 complexOptionType5_;

     public bool HasComplexOptionType5 {

       get { return hasComplexOptionType5; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5 ComplexOptionType5 {

-      get { return complexOptionType5_; }

+      get { return complexOptionType5_ ?? global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -4173,6 +4229,10 @@
     public static ComplexOptionType3 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private ComplexOptionType3 MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -4188,22 +4248,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ComplexOptionType3();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ComplexOptionType3 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ComplexOptionType3 result;

+      private bool resultIsReadOnly;

+      private ComplexOptionType3 result;

       

       private ComplexOptionType3 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ComplexOptionType3 original = result;

           result = new ComplexOptionType3();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4218,13 +4278,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ComplexOptionType3();

-        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);

@@ -4240,11 +4300,11 @@
       }

       

       public override ComplexOptionType3 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -4387,7 +4447,7 @@
       public Builder ClearComplexOptionType5() {

         PrepareBuilder();

         result.hasComplexOptionType5 = false;

-        result.complexOptionType5_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.DefaultInstance;

+        result.complexOptionType5_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _complexOpt6FieldNames = new string[] { "xyzzy" };

     private static readonly uint[] _complexOpt6FieldTags = new uint[] { 60751608 };

     public static ComplexOpt6 DefaultInstance {

@@ -4408,7 +4468,7 @@
     }

     

     public override ComplexOpt6 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ComplexOpt6 ThisMessage {

@@ -4494,6 +4554,10 @@
     public static ComplexOpt6 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private ComplexOpt6 MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -4509,22 +4573,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ComplexOpt6();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ComplexOpt6 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ComplexOpt6 result;

+      private bool resultIsReadOnly;

+      private ComplexOpt6 result;

       

       private ComplexOpt6 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ComplexOpt6 original = result;

           result = new ComplexOpt6();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4539,13 +4603,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ComplexOpt6();

-        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);

@@ -4561,11 +4625,11 @@
       }

       

       public override ComplexOpt6 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static VariousComplexOptions DefaultInstance {

@@ -4677,7 +4741,7 @@
     }

     

     public override VariousComplexOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override VariousComplexOptions ThisMessage {

@@ -4747,6 +4811,10 @@
     public static VariousComplexOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private VariousComplexOptions MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -4762,22 +4830,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new VariousComplexOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(VariousComplexOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      VariousComplexOptions result;

+      private bool resultIsReadOnly;

+      private VariousComplexOptions result;

       

       private VariousComplexOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           VariousComplexOptions original = result;

           result = new VariousComplexOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4792,13 +4860,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new VariousComplexOptions();

-        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);

@@ -4814,11 +4882,11 @@
       }

       

       public override VariousComplexOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
index 466cce7..47df973 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
@@ -64,7 +64,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

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

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

     public static TestEmbedOptimizedForSize DefaultInstance {

@@ -72,7 +72,7 @@
     }

     

     public override TestEmbedOptimizedForSize DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestEmbedOptimizedForSize ThisMessage {

@@ -89,12 +89,12 @@
     

     public const int OptionalMessageFieldNumber = 1;

     private bool hasOptionalMessage;

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

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

     public bool HasOptionalMessage {

       get { return hasOptionalMessage; }

     }

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

-      get { return optionalMessage_; }

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

     }

     

     public const int RepeatedMessageFieldNumber = 2;

@@ -182,6 +182,11 @@
     public static TestEmbedOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestEmbedOptimizedForSize 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(); }

@@ -197,22 +202,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestEmbedOptimizedForSize();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestEmbedOptimizedForSize cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestEmbedOptimizedForSize result;

+      private bool resultIsReadOnly;

+      private TestEmbedOptimizedForSize result;

       

       private TestEmbedOptimizedForSize PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestEmbedOptimizedForSize original = result;

           result = new TestEmbedOptimizedForSize();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -227,13 +232,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestEmbedOptimizedForSize();

-        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);

@@ -249,12 +254,11 @@
       }

       

       public override TestEmbedOptimizedForSize 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) {

@@ -377,7 +381,7 @@
       public Builder ClearOptionalMessage() {

         PrepareBuilder();

         result.hasOptionalMessage = false;

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

+        result.optionalMessage_ = null;

         return this;

       }

       

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs
index 7791759..29d784b 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs
@@ -26,6 +26,10 @@
     internal static pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.AB, global::UnitTest.Issues.TestProtos.AB.Builder> internal__static_unittest_issues_AB__FieldAccessorTable;

     internal static pbd::MessageDescriptor internal__static_unittest_issues_NumberField__Descriptor;

     internal static pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.NumberField, global::UnitTest.Issues.TestProtos.NumberField.Builder> internal__static_unittest_issues_NumberField__FieldAccessorTable;

+    internal static pbd::MessageDescriptor internal__static_unittest_issues_MyMessageAReferenceB__Descriptor;

+    internal static pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.MyMessageAReferenceB, global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.Builder> internal__static_unittest_issues_MyMessageAReferenceB__FieldAccessorTable;

+    internal static pbd::MessageDescriptor internal__static_unittest_issues_MyMessageBReferenceA__Descriptor;

+    internal static pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.MyMessageBReferenceA, global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.Builder> internal__static_unittest_issues_MyMessageBReferenceA__FieldAccessorTable;

     #endregion

     #region Descriptor

     public static pbd::FileDescriptor Descriptor {

@@ -38,9 +42,12 @@
           "ChxleHRlc3QvdW5pdHRlc3RfaXNzdWVzLnByb3RvEg91bml0dGVzdF9pc3N1" + 

           "ZXMaJGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byIPCgFB" + 

           "EgoKAl9BGAEgASgFIg8KAUISCgoCQl8YASABKAUiEQoCQUISCwoDYV9iGAEg" + 

-          "ASgFIhoKC051bWJlckZpZWxkEgsKA18wMRgBIAEoBUJASAHCPjsKGlVuaXRU" + 

-          "ZXN0Lklzc3Vlcy5UZXN0UHJvdG9zEh1Vbml0VGVzdEV4dHJhc0lzc3Vlc1By" + 

-          "b3RvRmlsZQ==");

+          "ASgFIhoKC051bWJlckZpZWxkEgsKA18wMRgBIAEoBSJMChRNeU1lc3NhZ2VB" + 

+          "UmVmZXJlbmNlQhI0CgV2YWx1ZRgBIAIoCzIlLnVuaXR0ZXN0X2lzc3Vlcy5N" + 

+          "eU1lc3NhZ2VCUmVmZXJlbmNlQSJMChRNeU1lc3NhZ2VCUmVmZXJlbmNlQRI0" + 

+          "CgV2YWx1ZRgBIAIoCzIlLnVuaXR0ZXN0X2lzc3Vlcy5NeU1lc3NhZ2VBUmVm" + 

+          "ZXJlbmNlQkJASAHCPjsKGlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zEh1V" + 

+          "bml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZQ==");

       pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {

         descriptor = root;

         internal__static_unittest_issues_A__Descriptor = Descriptor.MessageTypes[0];

@@ -59,6 +66,14 @@
         internal__static_unittest_issues_NumberField__FieldAccessorTable = 

             new pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.NumberField, global::UnitTest.Issues.TestProtos.NumberField.Builder>(internal__static_unittest_issues_NumberField__Descriptor,

                 new string[] { "_01", });

+        internal__static_unittest_issues_MyMessageAReferenceB__Descriptor = Descriptor.MessageTypes[4];

+        internal__static_unittest_issues_MyMessageAReferenceB__FieldAccessorTable = 

+            new pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.MyMessageAReferenceB, global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.Builder>(internal__static_unittest_issues_MyMessageAReferenceB__Descriptor,

+                new string[] { "Value", });

+        internal__static_unittest_issues_MyMessageBReferenceA__Descriptor = Descriptor.MessageTypes[5];

+        internal__static_unittest_issues_MyMessageBReferenceA__FieldAccessorTable = 

+            new pb::FieldAccess.FieldAccessorTable<global::UnitTest.Issues.TestProtos.MyMessageBReferenceA, global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.Builder>(internal__static_unittest_issues_MyMessageBReferenceA__Descriptor,

+                new string[] { "Value", });

         pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();

         RegisterAllExtensions(registry);

         global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);

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

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

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

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

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

     private static readonly string[] _aFieldNames = new string[] { "_A" };

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

     public static A DefaultInstance {

@@ -85,7 +100,7 @@
     }

     

     public override A DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override A ThisMessage {

@@ -171,6 +186,10 @@
     public static A ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private A MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -186,22 +205,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new A();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(A cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      A result;

+      private bool resultIsReadOnly;

+      private A result;

       

       private A PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           A original = result;

           result = new A();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -216,13 +235,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new A();

-        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);

@@ -238,11 +257,11 @@
       }

       

       public override A BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _bFieldNames = new string[] { "B_" };

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

     public static B DefaultInstance {

@@ -354,7 +373,7 @@
     }

     

     public override B DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override B ThisMessage {

@@ -440,6 +459,10 @@
     public static B ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private B MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -455,22 +478,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new B();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(B cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      B result;

+      private bool resultIsReadOnly;

+      private B result;

       

       private B PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           B original = result;

           result = new B();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -485,13 +508,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new B();

-        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);

@@ -507,11 +530,11 @@
       }

       

       public override B BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _aBFieldNames = new string[] { "a_b" };

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

     public static AB DefaultInstance {

@@ -623,7 +646,7 @@
     }

     

     public override AB DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override AB ThisMessage {

@@ -709,6 +732,10 @@
     public static AB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private AB MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -724,22 +751,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new AB();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(AB cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      AB result;

+      private bool resultIsReadOnly;

+      private AB result;

       

       private AB PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           AB original = result;

           result = new AB();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -754,13 +781,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new AB();

-        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);

@@ -776,11 +803,11 @@
       }

       

       public override AB BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _numberFieldFieldNames = new string[] { "_01" };

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

     public static NumberField DefaultInstance {

@@ -892,7 +919,7 @@
     }

     

     public override NumberField DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override NumberField ThisMessage {

@@ -980,6 +1007,10 @@
     public static NumberField ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private NumberField MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -995,22 +1026,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new NumberField();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(NumberField cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      NumberField result;

+      private bool resultIsReadOnly;

+      private NumberField result;

       

       private NumberField PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           NumberField original = result;

           result = new NumberField();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1025,13 +1056,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new NumberField();

-        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);

@@ -1047,11 +1078,11 @@
       }

       

       public override NumberField BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -1153,6 +1184,606 @@
     }

   }

   

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

+    private static readonly string[] _myMessageAReferenceBFieldNames = new string[] { "value" };

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

+    public static MyMessageAReferenceB DefaultInstance {

+      get { return defaultInstance; }

+    }

+    

+    public override MyMessageAReferenceB DefaultInstanceForType {

+      get { return DefaultInstance; }

+    }

+    

+    protected override MyMessageAReferenceB ThisMessage {

+      get { return this; }

+    }

+    

+    public static pbd::MessageDescriptor Descriptor {

+      get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_MyMessageAReferenceB__Descriptor; }

+    }

+    

+    protected override pb::FieldAccess.FieldAccessorTable<MyMessageAReferenceB, MyMessageAReferenceB.Builder> InternalFieldAccessors {

+      get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_MyMessageAReferenceB__FieldAccessorTable; }

+    }

+    

+    public const int ValueFieldNumber = 1;

+    private bool hasValue;

+    private global::UnitTest.Issues.TestProtos.MyMessageBReferenceA value_;

+    public bool HasValue {

+      get { return hasValue; }

+    }

+    public global::UnitTest.Issues.TestProtos.MyMessageBReferenceA Value {

+      get { return value_ ?? global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.DefaultInstance; }

+    }

+    

+    public override bool IsInitialized {

+      get {

+        if (!hasValue) return false;

+        if (!Value.IsInitialized) return false;

+        return true;

+      }

+    }

+    

+    public override void WriteTo(pb::ICodedOutputStream output) {

+      int size = SerializedSize;

+      string[] field_names = _myMessageAReferenceBFieldNames;

+      if (hasValue) {

+        output.WriteMessage(1, field_names[0], Value);

+      }

+      UnknownFields.WriteTo(output);

+    }

+    

+    private int memoizedSerializedSize = -1;

+    public override int SerializedSize {

+      get {

+        int size = memoizedSerializedSize;

+        if (size != -1) return size;

+        

+        size = 0;

+        if (hasValue) {

+          size += pb::CodedOutputStream.ComputeMessageSize(1, Value);

+        }

+        size += UnknownFields.SerializedSize;

+        memoizedSerializedSize = size;

+        return size;

+      }

+    }

+    

+    public static MyMessageAReferenceB ParseFrom(pb::ByteString data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(byte[] data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(global::System.IO.Stream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

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

+    }

+    public static MyMessageAReferenceB ParseDelimitedFrom(global::System.IO.Stream input) {

+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(pb::ICodedInputStream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static MyMessageAReferenceB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

+    }

+    private MyMessageAReferenceB MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

+    public static Builder CreateBuilder(MyMessageAReferenceB prototype) {

+      return new Builder(prototype);

+    }

+    

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

+    public sealed partial class Builder : pb::GeneratedBuilder<MyMessageAReferenceB, Builder> {

+      protected override Builder ThisBuilder {

+        get { return this; }

+      }

+      public Builder() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+      }

+      internal Builder(MyMessageAReferenceB cloneFrom) {

+        result = cloneFrom;

+        resultIsReadOnly = true;

+      }

+      

+      private bool resultIsReadOnly;

+      private MyMessageAReferenceB result;

+      

+      private MyMessageAReferenceB PrepareBuilder() {

+        if (resultIsReadOnly) {

+          MyMessageAReferenceB original = result;

+          result = new MyMessageAReferenceB();

+          resultIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

+      

+      protected override MyMessageAReferenceB MessageBeingBuilt {

+        get { return PrepareBuilder(); }

+      }

+      

+      public override Builder Clear() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+        return this;

+      }

+      

+      public override Builder Clone() {

+        if (resultIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

+      }

+      

+      public override pbd::MessageDescriptor DescriptorForType {

+        get { return global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.Descriptor; }

+      }

+      

+      public override MyMessageAReferenceB DefaultInstanceForType {

+        get { return global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.DefaultInstance; }

+      }

+      

+      public override MyMessageAReferenceB BuildPartial() {

+        if (resultIsReadOnly) {

+          return result;

+        }

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

+      }

+      

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

+        if (other is MyMessageAReferenceB) {

+          return MergeFrom((MyMessageAReferenceB) other);

+        } else {

+          base.MergeFrom(other);

+          return this;

+        }

+      }

+      

+      public override Builder MergeFrom(MyMessageAReferenceB other) {

+        if (other == global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.DefaultInstance) return this;

+        PrepareBuilder();

+        if (other.HasValue) {

+          MergeValue(other.Value);

+        }

+        this.MergeUnknownFields(other.UnknownFields);

+        return this;

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

+        return MergeFrom(input, pb::ExtensionRegistry.Empty);

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

+        pb::UnknownFieldSet.Builder unknownFields = null;

+        uint tag;

+        string field_name;

+        while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_myMessageAReferenceBFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _myMessageAReferenceBFieldTags[field_ordinal];

+            else {

+              if (unknownFields == null) {

+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+              }

+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

+          switch (tag) {

+            case 0: {

+              throw pb::InvalidProtocolBufferException.InvalidTag();

+            }

+            default: {

+              if (pb::WireFormat.IsEndGroupTag(tag)) {

+                if (unknownFields != null) {

+                  this.UnknownFields = unknownFields.Build();

+                }

+                return this;

+              }

+              if (unknownFields == null) {

+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+              }

+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+              break;

+            }

+            case 10: {

+              global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.Builder subBuilder = global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.CreateBuilder();

+              if (result.hasValue) {

+                subBuilder.MergeFrom(Value);

+              }

+              input.ReadMessage(subBuilder, extensionRegistry);

+              Value = subBuilder.BuildPartial();

+              break;

+            }

+          }

+        }

+        

+        if (unknownFields != null) {

+          this.UnknownFields = unknownFields.Build();

+        }

+        return this;

+      }

+      

+      

+      public bool HasValue {

+       get { return result.hasValue; }

+      }

+      public global::UnitTest.Issues.TestProtos.MyMessageBReferenceA Value {

+        get { return result.Value; }

+        set { SetValue(value); }

+      }

+      public Builder SetValue(global::UnitTest.Issues.TestProtos.MyMessageBReferenceA value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.hasValue = true;

+        result.value_ = value;

+        return this;

+      }

+      public Builder SetValue(global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.Builder builderForValue) {

+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

+        result.hasValue = true;

+        result.value_ = builderForValue.Build();

+        return this;

+      }

+      public Builder MergeValue(global::UnitTest.Issues.TestProtos.MyMessageBReferenceA value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        if (result.hasValue &&

+            result.value_ != global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.DefaultInstance) {

+            result.value_ = global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.CreateBuilder(result.value_).MergeFrom(value).BuildPartial();

+        } else {

+          result.value_ = value;

+        }

+        result.hasValue = true;

+        return this;

+      }

+      public Builder ClearValue() {

+        PrepareBuilder();

+        result.hasValue = false;

+        result.value_ = null;

+        return this;

+      }

+    }

+    static MyMessageAReferenceB() {

+      object.ReferenceEquals(global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.Descriptor, null);

+    }

+  }

+  

+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

+    private static readonly string[] _myMessageBReferenceAFieldNames = new string[] { "value" };

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

+    public static MyMessageBReferenceA DefaultInstance {

+      get { return defaultInstance; }

+    }

+    

+    public override MyMessageBReferenceA DefaultInstanceForType {

+      get { return DefaultInstance; }

+    }

+    

+    protected override MyMessageBReferenceA ThisMessage {

+      get { return this; }

+    }

+    

+    public static pbd::MessageDescriptor Descriptor {

+      get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_MyMessageBReferenceA__Descriptor; }

+    }

+    

+    protected override pb::FieldAccess.FieldAccessorTable<MyMessageBReferenceA, MyMessageBReferenceA.Builder> InternalFieldAccessors {

+      get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_MyMessageBReferenceA__FieldAccessorTable; }

+    }

+    

+    public const int ValueFieldNumber = 1;

+    private bool hasValue;

+    private global::UnitTest.Issues.TestProtos.MyMessageAReferenceB value_;

+    public bool HasValue {

+      get { return hasValue; }

+    }

+    public global::UnitTest.Issues.TestProtos.MyMessageAReferenceB Value {

+      get { return value_ ?? global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.DefaultInstance; }

+    }

+    

+    public override bool IsInitialized {

+      get {

+        if (!hasValue) return false;

+        if (!Value.IsInitialized) return false;

+        return true;

+      }

+    }

+    

+    public override void WriteTo(pb::ICodedOutputStream output) {

+      int size = SerializedSize;

+      string[] field_names = _myMessageBReferenceAFieldNames;

+      if (hasValue) {

+        output.WriteMessage(1, field_names[0], Value);

+      }

+      UnknownFields.WriteTo(output);

+    }

+    

+    private int memoizedSerializedSize = -1;

+    public override int SerializedSize {

+      get {

+        int size = memoizedSerializedSize;

+        if (size != -1) return size;

+        

+        size = 0;

+        if (hasValue) {

+          size += pb::CodedOutputStream.ComputeMessageSize(1, Value);

+        }

+        size += UnknownFields.SerializedSize;

+        memoizedSerializedSize = size;

+        return size;

+      }

+    }

+    

+    public static MyMessageBReferenceA ParseFrom(pb::ByteString data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(byte[] data) {

+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {

+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(global::System.IO.Stream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

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

+    }

+    public static MyMessageBReferenceA ParseDelimitedFrom(global::System.IO.Stream input) {

+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(pb::ICodedInputStream input) {

+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();

+    }

+    public static MyMessageBReferenceA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

+    }

+    private MyMessageBReferenceA MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

+    public static Builder CreateBuilder(MyMessageBReferenceA prototype) {

+      return new Builder(prototype);

+    }

+    

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

+    public sealed partial class Builder : pb::GeneratedBuilder<MyMessageBReferenceA, Builder> {

+      protected override Builder ThisBuilder {

+        get { return this; }

+      }

+      public Builder() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+      }

+      internal Builder(MyMessageBReferenceA cloneFrom) {

+        result = cloneFrom;

+        resultIsReadOnly = true;

+      }

+      

+      private bool resultIsReadOnly;

+      private MyMessageBReferenceA result;

+      

+      private MyMessageBReferenceA PrepareBuilder() {

+        if (resultIsReadOnly) {

+          MyMessageBReferenceA original = result;

+          result = new MyMessageBReferenceA();

+          resultIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

+      

+      protected override MyMessageBReferenceA MessageBeingBuilt {

+        get { return PrepareBuilder(); }

+      }

+      

+      public override Builder Clear() {

+        result = DefaultInstance;

+        resultIsReadOnly = true;

+        return this;

+      }

+      

+      public override Builder Clone() {

+        if (resultIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

+      }

+      

+      public override pbd::MessageDescriptor DescriptorForType {

+        get { return global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.Descriptor; }

+      }

+      

+      public override MyMessageBReferenceA DefaultInstanceForType {

+        get { return global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.DefaultInstance; }

+      }

+      

+      public override MyMessageBReferenceA BuildPartial() {

+        if (resultIsReadOnly) {

+          return result;

+        }

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

+      }

+      

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

+        if (other is MyMessageBReferenceA) {

+          return MergeFrom((MyMessageBReferenceA) other);

+        } else {

+          base.MergeFrom(other);

+          return this;

+        }

+      }

+      

+      public override Builder MergeFrom(MyMessageBReferenceA other) {

+        if (other == global::UnitTest.Issues.TestProtos.MyMessageBReferenceA.DefaultInstance) return this;

+        PrepareBuilder();

+        if (other.HasValue) {

+          MergeValue(other.Value);

+        }

+        this.MergeUnknownFields(other.UnknownFields);

+        return this;

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

+        return MergeFrom(input, pb::ExtensionRegistry.Empty);

+      }

+      

+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

+        pb::UnknownFieldSet.Builder unknownFields = null;

+        uint tag;

+        string field_name;

+        while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_myMessageBReferenceAFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _myMessageBReferenceAFieldTags[field_ordinal];

+            else {

+              if (unknownFields == null) {

+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+              }

+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

+          switch (tag) {

+            case 0: {

+              throw pb::InvalidProtocolBufferException.InvalidTag();

+            }

+            default: {

+              if (pb::WireFormat.IsEndGroupTag(tag)) {

+                if (unknownFields != null) {

+                  this.UnknownFields = unknownFields.Build();

+                }

+                return this;

+              }

+              if (unknownFields == null) {

+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+              }

+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+              break;

+            }

+            case 10: {

+              global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.Builder subBuilder = global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.CreateBuilder();

+              if (result.hasValue) {

+                subBuilder.MergeFrom(Value);

+              }

+              input.ReadMessage(subBuilder, extensionRegistry);

+              Value = subBuilder.BuildPartial();

+              break;

+            }

+          }

+        }

+        

+        if (unknownFields != null) {

+          this.UnknownFields = unknownFields.Build();

+        }

+        return this;

+      }

+      

+      

+      public bool HasValue {

+       get { return result.hasValue; }

+      }

+      public global::UnitTest.Issues.TestProtos.MyMessageAReferenceB Value {

+        get { return result.Value; }

+        set { SetValue(value); }

+      }

+      public Builder SetValue(global::UnitTest.Issues.TestProtos.MyMessageAReferenceB value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        result.hasValue = true;

+        result.value_ = value;

+        return this;

+      }

+      public Builder SetValue(global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.Builder builderForValue) {

+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

+        result.hasValue = true;

+        result.value_ = builderForValue.Build();

+        return this;

+      }

+      public Builder MergeValue(global::UnitTest.Issues.TestProtos.MyMessageAReferenceB value) {

+        pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

+        if (result.hasValue &&

+            result.value_ != global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.DefaultInstance) {

+            result.value_ = global::UnitTest.Issues.TestProtos.MyMessageAReferenceB.CreateBuilder(result.value_).MergeFrom(value).BuildPartial();

+        } else {

+          result.value_ = value;

+        }

+        result.hasValue = true;

+        return this;

+      }

+      public Builder ClearValue() {

+        PrepareBuilder();

+        result.hasValue = false;

+        result.value_ = null;

+        return this;

+      }

+    }

+    static MyMessageBReferenceA() {

+      object.ReferenceEquals(global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.Descriptor, null);

+    }

+  }

+  

   #endregion

   

 }

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
index 64046ee..05925a2 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
@@ -137,13 +137,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static SizeMessage1 DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override SizeMessage1 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SizeMessage1 ThisMessage {

@@ -504,12 +504,12 @@
     

     public const int Field15FieldNumber = 15;

     private bool hasField15;

-    private global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage field15_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage field15_;

     public bool HasField15 {

       get { return hasField15; }

     }

     public global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage Field15 {

-      get { return field15_; }

+      get { return field15_ ?? global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance; }

     }

     

     public const int Field78FieldNumber = 78;

@@ -602,6 +602,11 @@
     public static SizeMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SizeMessage1 MakeReadOnly() {

+      field5_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -617,22 +622,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SizeMessage1();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SizeMessage1 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SizeMessage1 result;

+      private bool resultIsReadOnly;

+      private SizeMessage1 result;

       

       private SizeMessage1 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SizeMessage1 original = result;

           result = new SizeMessage1();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -647,13 +652,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SizeMessage1();

-        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);

@@ -669,12 +674,11 @@
       }

       

       public override SizeMessage1 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.field5_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -1416,7 +1420,7 @@
       public Builder ClearField15() {

         PrepareBuilder();

         result.hasField15 = false;

-        result.field15_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance;

+        result.field15_ = null;

         return this;

       }

       

@@ -1550,13 +1554,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static SizeMessage1SubMessage DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override SizeMessage1SubMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SizeMessage1SubMessage ThisMessage {

@@ -1805,6 +1809,10 @@
     public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SizeMessage1SubMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1820,22 +1828,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SizeMessage1SubMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SizeMessage1SubMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SizeMessage1SubMessage result;

+      private bool resultIsReadOnly;

+      private SizeMessage1SubMessage result;

       

       private SizeMessage1SubMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SizeMessage1SubMessage original = result;

           result = new SizeMessage1SubMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1850,13 +1858,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SizeMessage1SubMessage();

-        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);

@@ -1872,11 +1880,11 @@
       }

       

       public override SizeMessage1SubMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -2299,13 +2307,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static SizeMessage2 DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override SizeMessage2 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SizeMessage2 ThisMessage {

@@ -2329,13 +2337,13 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

         public static Group1 DefaultInstance {

           get { return defaultInstance; }

         }

         

         public override Group1 DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Group1 ThisMessage {

@@ -2509,12 +2517,12 @@
         

         public const int Field31FieldNumber = 31;

         private bool hasField31;

-        private global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage field31_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance;

+        private global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage field31_;

         public bool HasField31 {

           get { return hasField31; }

         }

         public global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage Field31 {

-          get { return field31_; }

+          get { return field31_ ?? global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance; }

         }

         

         public static Group1 ParseFrom(pb::ByteString data) {

@@ -2547,6 +2555,13 @@
         public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private Group1 MakeReadOnly() {

+          field14_.MakeReadOnly();

+          field22_.MakeReadOnly();

+          field73_.MakeReadOnly();

+          return this;

+        }

+        

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

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

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

@@ -2562,22 +2577,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Group1();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Group1 cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Group1 result;

+          private bool resultIsReadOnly;

+          private Group1 result;

           

           private Group1 PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Group1 original = result;

               result = new Group1();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -2592,13 +2607,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Group1();

-            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);

@@ -2614,14 +2629,11 @@
           }

           

           public override Group1 BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            result.field14_.MakeReadOnly();

-            result.field22_.MakeReadOnly();

-            result.field73_.MakeReadOnly();

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           

@@ -3003,7 +3015,7 @@
           public Builder ClearField31() {

             PrepareBuilder();

             result.hasField31 = false;

-            result.field31_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance;

+            result.field31_ = null;

             return this;

           }

         }

@@ -3353,6 +3365,14 @@
     public static SizeMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SizeMessage2 MakeReadOnly() {

+      group1_.MakeReadOnly();

+      field128_.MakeReadOnly();

+      field127_.MakeReadOnly();

+      field130_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -3368,22 +3388,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SizeMessage2();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SizeMessage2 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SizeMessage2 result;

+      private bool resultIsReadOnly;

+      private SizeMessage2 result;

       

       private SizeMessage2 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SizeMessage2 original = result;

           result = new SizeMessage2();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3398,13 +3418,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SizeMessage2();

-        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);

@@ -3420,15 +3440,11 @@
       }

       

       public override SizeMessage2 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.group1_.MakeReadOnly();

-        result.field128_.MakeReadOnly();

-        result.field127_.MakeReadOnly();

-        result.field130_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -4102,13 +4118,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static SizeMessage2GroupedMessage DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override SizeMessage2GroupedMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SizeMessage2GroupedMessage ThisMessage {

@@ -4263,6 +4279,10 @@
     public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SizeMessage2GroupedMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -4278,22 +4298,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SizeMessage2GroupedMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SizeMessage2GroupedMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SizeMessage2GroupedMessage result;

+      private bool resultIsReadOnly;

+      private SizeMessage2GroupedMessage result;

       

       private SizeMessage2GroupedMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SizeMessage2GroupedMessage original = result;

           result = new SizeMessage2GroupedMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4308,13 +4328,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SizeMessage2GroupedMessage();

-        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);

@@ -4330,11 +4350,11 @@
       }

       

       public override SizeMessage2GroupedMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
index 379a86f..5b70d22 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
@@ -137,7 +137,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _speedMessage1FieldNames = new string[] { "field1", "field100", "field101", "field102", "field103", "field104", "field12", "field128", "field129", "field13", "field130", "field131", "field14", "field15", "field150", "field16", "field17", "field18", "field2", "field22", "field23", "field24", "field25", "field271", "field272", "field280", "field29", "field3", "field30", "field4", "field5", "field59", "field6", "field60", "field67", "field68", "field7", "field78", "field80", "field81", "field9" };

     private static readonly uint[] _speedMessage1FieldTags = new uint[] { 10, 800, 808, 818, 826, 832, 96, 1024, 1034, 104, 1040, 1048, 112, 122, 1200, 128, 136, 146, 16, 176, 184, 192, 200, 2168, 2176, 2240, 232, 24, 240, 34, 41, 472, 48, 480, 536, 544, 58, 624, 640, 648, 74 };

     public static SpeedMessage1 DefaultInstance {

@@ -145,7 +145,7 @@
     }

     

     public override SpeedMessage1 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SpeedMessage1 ThisMessage {

@@ -506,12 +506,12 @@
     

     public const int Field15FieldNumber = 15;

     private bool hasField15;

-    private global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage field15_;

     public bool HasField15 {

       get { return hasField15; }

     }

     public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {

-      get { return field15_; }

+      get { return field15_ ?? global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance; }

     }

     

     public const int Field78FieldNumber = 78;

@@ -881,6 +881,11 @@
     public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SpeedMessage1 MakeReadOnly() {

+      field5_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -896,22 +901,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SpeedMessage1();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SpeedMessage1 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SpeedMessage1 result;

+      private bool resultIsReadOnly;

+      private SpeedMessage1 result;

       

       private SpeedMessage1 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SpeedMessage1 original = result;

           result = new SpeedMessage1();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -926,13 +931,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SpeedMessage1();

-        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);

@@ -948,12 +953,11 @@
       }

       

       public override SpeedMessage1 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.field5_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -2052,7 +2056,7 @@
       public Builder ClearField15() {

         PrepareBuilder();

         result.hasField15 = false;

-        result.field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance;

+        result.field15_ = null;

         return this;

       }

       

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

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

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

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

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

     private static readonly string[] _speedMessage1SubMessageFieldNames = new string[] { "field1", "field12", "field13", "field14", "field15", "field16", "field19", "field2", "field20", "field203", "field204", "field205", "field206", "field207", "field21", "field22", "field23", "field28", "field3", "field300" };

     private static readonly uint[] _speedMessage1SubMessageFieldTags = new uint[] { 8, 96, 104, 112, 122, 128, 152, 16, 160, 1629, 1632, 1642, 1648, 1656, 169, 176, 184, 224, 24, 2400 };

     public static SpeedMessage1SubMessage DefaultInstance {

@@ -2194,7 +2198,7 @@
     }

     

     public override SpeedMessage1SubMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SpeedMessage1SubMessage ThisMessage {

@@ -2588,6 +2592,10 @@
     public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SpeedMessage1SubMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2603,22 +2611,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SpeedMessage1SubMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SpeedMessage1SubMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SpeedMessage1SubMessage result;

+      private bool resultIsReadOnly;

+      private SpeedMessage1SubMessage result;

       

       private SpeedMessage1SubMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SpeedMessage1SubMessage original = result;

           result = new SpeedMessage1SubMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2633,13 +2641,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SpeedMessage1SubMessage();

-        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);

@@ -2655,11 +2663,11 @@
       }

       

       public override SpeedMessage1SubMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _speedMessage2FieldNames = new string[] { "field1", "field109", "field127", "field128", "field129", "field130", "field131", "field2", "field205", "field206", "field21", "field210", "field211", "field212", "field213", "field216", "field217", "field218", "field220", "field221", "field222", "field25", "field3", "field30", "field4", "field6", "field63", "field71", "field75", "group1" };

     private static readonly uint[] _speedMessage2FieldTags = new uint[] { 10, 872, 1018, 1026, 1032, 1040, 1048, 18, 1640, 1648, 168, 1680, 1688, 1696, 1704, 1728, 1736, 1744, 1760, 1768, 1781, 205, 24, 240, 32, 50, 504, 568, 600, 83 };

     public static SpeedMessage2 DefaultInstance {

@@ -3294,7 +3302,7 @@
     }

     

     public override SpeedMessage2 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SpeedMessage2 ThisMessage {

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

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

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

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

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

         private static readonly string[] _group1FieldNames = new string[] { "field11", "field12", "field13", "field14", "field15", "field16", "field20", "field22", "field24", "field26", "field27", "field28", "field29", "field31", "field5", "field73" };

         private static readonly uint[] _group1FieldTags = new uint[] { 93, 98, 106, 114, 120, 130, 160, 178, 194, 213, 218, 224, 234, 250, 40, 584 };

         public static Group1 DefaultInstance {

@@ -3326,7 +3334,7 @@
         }

         

         public override Group1 DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Group1 ThisMessage {

@@ -3500,12 +3508,12 @@
         

         public const int Field31FieldNumber = 31;

         private bool hasField31;

-        private global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance;

+        private global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage field31_;

         public bool HasField31 {

           get { return hasField31; }

         }

         public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {

-          get { return field31_; }

+          get { return field31_ ?? global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance; }

         }

         

         public override bool IsInitialized {

@@ -3676,6 +3684,13 @@
         public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private Group1 MakeReadOnly() {

+          field14_.MakeReadOnly();

+          field22_.MakeReadOnly();

+          field73_.MakeReadOnly();

+          return this;

+        }

+        

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

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

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

@@ -3691,22 +3706,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Group1();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Group1 cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Group1 result;

+          private bool resultIsReadOnly;

+          private Group1 result;

           

           private Group1 PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Group1 original = result;

               result = new Group1();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -3721,13 +3736,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Group1();

-            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);

@@ -3743,14 +3758,11 @@
           }

           

           public override Group1 BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            result.field14_.MakeReadOnly();

-            result.field22_.MakeReadOnly();

-            result.field73_.MakeReadOnly();

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -4314,7 +4326,7 @@
           public Builder ClearField31() {

             PrepareBuilder();

             result.hasField31 = false;

-            result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance;

+            result.field31_ = null;

             return this;

           }

         }

@@ -4884,6 +4896,14 @@
     public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SpeedMessage2 MakeReadOnly() {

+      group1_.MakeReadOnly();

+      field128_.MakeReadOnly();

+      field127_.MakeReadOnly();

+      field130_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -4899,22 +4919,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SpeedMessage2();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SpeedMessage2 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SpeedMessage2 result;

+      private bool resultIsReadOnly;

+      private SpeedMessage2 result;

       

       private SpeedMessage2 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SpeedMessage2 original = result;

           result = new SpeedMessage2();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4929,13 +4949,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SpeedMessage2();

-        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);

@@ -4951,15 +4971,11 @@
       }

       

       public override SpeedMessage2 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.group1_.MakeReadOnly();

-        result.field128_.MakeReadOnly();

-        result.field127_.MakeReadOnly();

-        result.field130_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _speedMessage2GroupedMessageFieldNames = new string[] { "field1", "field10", "field11", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9" };

     private static readonly uint[] _speedMessage2GroupedMessageFieldTags = new uint[] { 13, 85, 88, 21, 29, 32, 40, 48, 56, 69, 72 };

     public static SpeedMessage2GroupedMessage DefaultInstance {

@@ -5916,7 +5932,7 @@
     }

     

     public override SpeedMessage2GroupedMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SpeedMessage2GroupedMessage ThisMessage {

@@ -6162,6 +6178,10 @@
     public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SpeedMessage2GroupedMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -6177,22 +6197,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SpeedMessage2GroupedMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SpeedMessage2GroupedMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SpeedMessage2GroupedMessage result;

+      private bool resultIsReadOnly;

+      private SpeedMessage2GroupedMessage result;

       

       private SpeedMessage2GroupedMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SpeedMessage2GroupedMessage original = result;

           result = new SpeedMessage2GroupedMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6207,13 +6227,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SpeedMessage2GroupedMessage();

-        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);

@@ -6229,11 +6249,11 @@
       }

       

       public override SpeedMessage2GroupedMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs
index 0df40f4..3eb3062 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs
@@ -43,7 +43,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

   public sealed partial class ImportMessageLite : pb::GeneratedMessageLite<ImportMessageLite, ImportMessageLite.Builder> {

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

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

     private static readonly string[] _importMessageLiteFieldNames = new string[] { "d" };

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

     public static ImportMessageLite DefaultInstance {

@@ -51,7 +51,7 @@
     }

     

     public override ImportMessageLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ImportMessageLite ThisMessage {

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

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

     }

+    private ImportMessageLite MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -161,22 +165,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ImportMessageLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ImportMessageLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ImportMessageLite result;

+      private bool resultIsReadOnly;

+      private ImportMessageLite result;

       

       private ImportMessageLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ImportMessageLite original = result;

           result = new ImportMessageLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -191,13 +195,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ImportMessageLite();

-        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);

@@ -209,11 +213,11 @@
       }

       

       public override ImportMessageLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
index 75e746a..6f7f59d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
@@ -71,7 +71,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _importMessageFieldNames = new string[] { "d" };

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

     public static ImportMessage DefaultInstance {

@@ -79,7 +79,7 @@
     }

     

     public override ImportMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ImportMessage ThisMessage {

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

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

     }

+    private ImportMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -180,22 +184,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ImportMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ImportMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ImportMessage result;

+      private bool resultIsReadOnly;

+      private ImportMessage result;

       

       private ImportMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ImportMessage original = result;

           result = new ImportMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -210,13 +214,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ImportMessage();

-        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);

@@ -232,11 +236,11 @@
       }

       

       public override ImportMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
index f51b2f4..333cb7a 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
@@ -103,7 +103,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

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

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

     public static TestMessageSet DefaultInstance {

@@ -111,7 +111,7 @@
     }

     

     public override TestMessageSet DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMessageSet ThisMessage {

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

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

     }

+    private TestMessageSet MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -200,22 +204,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMessageSet();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMessageSet cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMessageSet result;

+      private bool resultIsReadOnly;

+      private TestMessageSet result;

       

       private TestMessageSet PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMessageSet original = result;

           result = new TestMessageSet();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -230,13 +234,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMessageSet();

-        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);

@@ -252,11 +256,11 @@
       }

       

       public override TestMessageSet BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _testMessageSetContainerFieldNames = new string[] { "message_set" };

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

     public static TestMessageSetContainer DefaultInstance {

@@ -342,7 +346,7 @@
     }

     

     public override TestMessageSetContainer DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMessageSetContainer ThisMessage {

@@ -359,12 +363,12 @@
     

     public const int MessageSetFieldNumber = 1;

     private bool hasMessageSet;

-    private global::Google.ProtocolBuffers.TestProtos.TestMessageSet messageSet_ = global::Google.ProtocolBuffers.TestProtos.TestMessageSet.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestMessageSet messageSet_;

     public bool HasMessageSet {

       get { return hasMessageSet; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestMessageSet MessageSet {

-      get { return messageSet_; }

+      get { return messageSet_ ?? global::Google.ProtocolBuffers.TestProtos.TestMessageSet.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -428,6 +432,10 @@
     public static TestMessageSetContainer ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestMessageSetContainer MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -443,22 +451,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMessageSetContainer();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMessageSetContainer cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMessageSetContainer result;

+      private bool resultIsReadOnly;

+      private TestMessageSetContainer result;

       

       private TestMessageSetContainer PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMessageSetContainer original = result;

           result = new TestMessageSetContainer();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -473,13 +481,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMessageSetContainer();

-        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);

@@ -495,11 +503,11 @@
       }

       

       public override TestMessageSetContainer BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -615,7 +623,7 @@
       public Builder ClearMessageSet() {

         PrepareBuilder();

         result.hasMessageSet = false;

-        result.messageSet_ = global::Google.ProtocolBuffers.TestProtos.TestMessageSet.DefaultInstance;

+        result.messageSet_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _testMessageSetExtension1FieldNames = new string[] { "i" };

     private static readonly uint[] _testMessageSetExtension1FieldTags = new uint[] { 120 };

     public static TestMessageSetExtension1 DefaultInstance {

@@ -636,7 +644,7 @@
     }

     

     public override TestMessageSetExtension1 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMessageSetExtension1 ThisMessage {

@@ -724,6 +732,10 @@
     public static TestMessageSetExtension1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestMessageSetExtension1 MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -739,22 +751,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMessageSetExtension1();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMessageSetExtension1 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMessageSetExtension1 result;

+      private bool resultIsReadOnly;

+      private TestMessageSetExtension1 result;

       

       private TestMessageSetExtension1 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMessageSetExtension1 original = result;

           result = new TestMessageSetExtension1();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -769,13 +781,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMessageSetExtension1();

-        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);

@@ -791,11 +803,11 @@
       }

       

       public override TestMessageSetExtension1 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _testMessageSetExtension2FieldNames = new string[] { "str" };

     private static readonly uint[] _testMessageSetExtension2FieldTags = new uint[] { 202 };

     public static TestMessageSetExtension2 DefaultInstance {

@@ -907,7 +919,7 @@
     }

     

     public override TestMessageSetExtension2 DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMessageSetExtension2 ThisMessage {

@@ -995,6 +1007,10 @@
     public static TestMessageSetExtension2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestMessageSetExtension2 MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1010,22 +1026,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMessageSetExtension2();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMessageSetExtension2 cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMessageSetExtension2 result;

+      private bool resultIsReadOnly;

+      private TestMessageSetExtension2 result;

       

       private TestMessageSetExtension2 PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMessageSetExtension2 original = result;

           result = new TestMessageSetExtension2();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1040,13 +1056,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMessageSetExtension2();

-        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);

@@ -1062,11 +1078,11 @@
       }

       

       public override TestMessageSetExtension2 BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _rawMessageSetFieldNames = new string[] { "item" };

     private static readonly uint[] _rawMessageSetFieldTags = new uint[] { 11 };

     public static RawMessageSet DefaultInstance {

@@ -1179,7 +1195,7 @@
     }

     

     public override RawMessageSet DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override RawMessageSet ThisMessage {

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

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

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

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

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

         private static readonly string[] _itemFieldNames = new string[] { "message", "type_id" };

         private static readonly uint[] _itemFieldTags = new uint[] { 26, 16 };

         public static Item DefaultInstance {

@@ -1211,7 +1227,7 @@
         }

         

         public override Item DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Item ThisMessage {

@@ -1315,6 +1331,10 @@
         public static Item ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private Item MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

@@ -1330,22 +1350,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Item();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Item cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Item result;

+          private bool resultIsReadOnly;

+          private Item result;

           

           private Item PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Item original = result;

               result = new Item();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1360,13 +1380,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Item();

-            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);

@@ -1382,11 +1402,11 @@
           }

           

           public override Item BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -1590,6 +1610,11 @@
     public static RawMessageSet ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private RawMessageSet MakeReadOnly() {

+      item_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -1605,22 +1630,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new RawMessageSet();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(RawMessageSet cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      RawMessageSet result;

+      private bool resultIsReadOnly;

+      private RawMessageSet result;

       

       private RawMessageSet PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           RawMessageSet original = result;

           result = new RawMessageSet();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1635,13 +1660,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new RawMessageSet();

-        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);

@@ -1657,12 +1682,11 @@
       }

       

       public override RawMessageSet BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.item_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
index ca40192..3d607c8 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
@@ -81,7 +81,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

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

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

     public static TestMessage DefaultInstance {

@@ -89,7 +89,7 @@
     }

     

     public override TestMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMessage ThisMessage {

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

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

     }

+    private TestMessage MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -194,22 +198,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMessage result;

+      private bool resultIsReadOnly;

+      private TestMessage result;

       

       private TestMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMessage original = result;

           result = new TestMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -224,13 +228,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMessage();

-        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);

@@ -246,11 +250,11 @@
       }

       

       public override TestMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
index 967d549..b3c24e3 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
@@ -85,13 +85,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static TestOptimizedForSize DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestOptimizedForSize DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestOptimizedForSize ThisMessage {

@@ -122,12 +122,12 @@
     

     public const int MsgFieldNumber = 19;

     private bool hasMsg;

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

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

     public bool HasMsg {

       get { return hasMsg; }

     }

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

-      get { return msg_; }

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

     }

     

     public static TestOptimizedForSize ParseFrom(pb::ByteString data) {

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

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

     }

+    private TestOptimizedForSize MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -175,22 +179,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestOptimizedForSize();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestOptimizedForSize cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestOptimizedForSize result;

+      private bool resultIsReadOnly;

+      private TestOptimizedForSize result;

       

       private TestOptimizedForSize PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestOptimizedForSize original = result;

           result = new TestOptimizedForSize();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -205,13 +209,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestOptimizedForSize();

-        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);

@@ -227,11 +231,11 @@
       }

       

       public override TestOptimizedForSize BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -291,7 +295,7 @@
       public Builder ClearMsg() {

         PrepareBuilder();

         result.hasMsg = false;

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

+        result.msg_ = null;

         return this;

       }

     }

@@ -304,13 +308,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static TestRequiredOptimizedForSize DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestRequiredOptimizedForSize DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestRequiredOptimizedForSize ThisMessage {

@@ -365,6 +369,10 @@
     public static TestRequiredOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestRequiredOptimizedForSize MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -380,22 +388,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestRequiredOptimizedForSize();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestRequiredOptimizedForSize cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestRequiredOptimizedForSize result;

+      private bool resultIsReadOnly;

+      private TestRequiredOptimizedForSize result;

       

       private TestRequiredOptimizedForSize PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestRequiredOptimizedForSize original = result;

           result = new TestRequiredOptimizedForSize();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -410,13 +418,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestRequiredOptimizedForSize();

-        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);

@@ -432,11 +440,11 @@
       }

       

       public override TestRequiredOptimizedForSize BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -469,13 +477,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     public static TestOptionalOptimizedForSize DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestOptionalOptimizedForSize DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestOptionalOptimizedForSize ThisMessage {

@@ -492,12 +500,12 @@
     

     public const int OFieldNumber = 1;

     private bool hasO;

-    private global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize o_ = global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize o_;

     public bool HasO {

       get { return hasO; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize O {

-      get { return o_; }

+      get { return o_ ?? global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize.DefaultInstance; }

     }

     

     public static TestOptionalOptimizedForSize ParseFrom(pb::ByteString data) {

@@ -530,6 +538,10 @@
     public static TestOptionalOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestOptionalOptimizedForSize MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -545,22 +557,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestOptionalOptimizedForSize();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestOptionalOptimizedForSize cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestOptionalOptimizedForSize result;

+      private bool resultIsReadOnly;

+      private TestOptionalOptimizedForSize result;

       

       private TestOptionalOptimizedForSize PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestOptionalOptimizedForSize original = result;

           result = new TestOptionalOptimizedForSize();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -575,13 +587,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestOptionalOptimizedForSize();

-        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);

@@ -597,11 +609,11 @@
       }

       

       public override TestOptionalOptimizedForSize BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -641,7 +653,7 @@
       public Builder ClearO() {

         PrepareBuilder();

         result.hasO = false;

-        result.o_ = global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize.DefaultInstance;

+        result.o_ = null;

         return this;

       }

     }

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
index aeea673..0c66d4b 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffers.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) {

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs
index 3c5e930..c85403f 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs
@@ -83,7 +83,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _searchRequestFieldNames = new string[] { "Criteria" };

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

     public static SearchRequest DefaultInstance {

@@ -91,7 +91,7 @@
     }

     

     public override SearchRequest DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SearchRequest ThisMessage {

@@ -184,6 +184,11 @@
     public static SearchRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SearchRequest MakeReadOnly() {

+      criteria_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -199,22 +204,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SearchRequest();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SearchRequest cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SearchRequest result;

+      private bool resultIsReadOnly;

+      private SearchRequest result;

       

       private SearchRequest PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SearchRequest original = result;

           result = new SearchRequest();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -229,13 +234,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SearchRequest();

-        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);

@@ -251,12 +256,11 @@
       }

       

       public override SearchRequest BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.criteria_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _searchResponseFieldNames = new string[] { "results" };

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

     public static SearchResponse DefaultInstance {

@@ -380,7 +384,7 @@
     }

     

     public override SearchResponse DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override SearchResponse ThisMessage {

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

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

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

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

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

         private static readonly string[] _resultItemFieldNames = new string[] { "name", "url" };

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

         public static ResultItem DefaultInstance {

@@ -412,7 +416,7 @@
         }

         

         public override ResultItem DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override ResultItem ThisMessage {

@@ -515,6 +519,10 @@
         public static ResultItem ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private ResultItem MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

@@ -530,22 +538,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new ResultItem();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(ResultItem cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          ResultItem result;

+          private bool resultIsReadOnly;

+          private ResultItem result;

           

           private ResultItem PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               ResultItem original = result;

               result = new ResultItem();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -560,13 +568,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new ResultItem();

-            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);

@@ -582,11 +590,11 @@
           }

           

           public override ResultItem BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -794,6 +802,11 @@
     public static SearchResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private SearchResponse MakeReadOnly() {

+      results_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -809,22 +822,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new SearchResponse();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(SearchResponse cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      SearchResponse result;

+      private bool resultIsReadOnly;

+      private SearchResponse result;

       

       private SearchResponse PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           SearchResponse original = result;

           result = new SearchResponse();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -839,13 +852,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new SearchResponse();

-        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);

@@ -861,12 +874,11 @@
       }

       

       public override SearchResponse BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.results_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _refineSearchRequestFieldNames = new string[] { "Criteria", "previous_results" };

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

     public static RefineSearchRequest DefaultInstance {

@@ -1002,7 +1014,7 @@
     }

     

     public override RefineSearchRequest DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override RefineSearchRequest ThisMessage {

@@ -1031,12 +1043,12 @@
     

     public const int PreviousResultsFieldNumber = 2;

     private bool hasPreviousResults;

-    private global::Google.ProtocolBuffers.TestProtos.SearchResponse previousResults_ = global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.SearchResponse previousResults_;

     public bool HasPreviousResults {

       get { return hasPreviousResults; }

     }

     public global::Google.ProtocolBuffers.TestProtos.SearchResponse PreviousResults {

-      get { return previousResults_; }

+      get { return previousResults_ ?? global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -1113,6 +1125,11 @@
     public static RefineSearchRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private RefineSearchRequest MakeReadOnly() {

+      criteria_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -1128,22 +1145,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new RefineSearchRequest();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(RefineSearchRequest cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      RefineSearchRequest result;

+      private bool resultIsReadOnly;

+      private RefineSearchRequest result;

       

       private RefineSearchRequest PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           RefineSearchRequest original = result;

           result = new RefineSearchRequest();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1158,13 +1175,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new RefineSearchRequest();

-        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);

@@ -1180,12 +1197,11 @@
       }

       

       public override RefineSearchRequest BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.criteria_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -1340,7 +1356,7 @@
       public Builder ClearPreviousResults() {

         PrepareBuilder();

         result.hasPreviousResults = false;

-        result.previousResults_ = global::Google.ProtocolBuffers.TestProtos.SearchResponse.DefaultInstance;

+        result.previousResults_ = null;

         return this;

       }

     }

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
index c0e5334..e87fb1c 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
@@ -138,7 +138,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _testXmlChildFieldNames = new string[] { "binary", "options" };

     private static readonly uint[] _testXmlChildFieldTags = new uint[] { 34, 24 };

     public static TestXmlChild DefaultInstance {

@@ -146,7 +146,7 @@
     }

     

     public override TestXmlChild DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestXmlChild ThisMessage {

@@ -257,6 +257,11 @@
     public static TestXmlChild ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestXmlChild MakeReadOnly() {

+      options_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -272,22 +277,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestXmlChild();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestXmlChild cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestXmlChild result;

+      private bool resultIsReadOnly;

+      private TestXmlChild result;

       

       private TestXmlChild PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestXmlChild original = result;

           result = new TestXmlChild();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -302,13 +307,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestXmlChild();

-        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);

@@ -324,12 +329,11 @@
       }

       

       public override TestXmlChild BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.options_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static TestXmlNoFields DefaultInstance {

@@ -489,7 +493,7 @@
     }

     

     public override TestXmlNoFields DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestXmlNoFields ThisMessage {

@@ -559,6 +563,10 @@
     public static TestXmlNoFields ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestXmlNoFields MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -574,22 +582,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestXmlNoFields();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestXmlNoFields cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestXmlNoFields result;

+      private bool resultIsReadOnly;

+      private TestXmlNoFields result;

       

       private TestXmlNoFields PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestXmlNoFields original = result;

           result = new TestXmlNoFields();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -604,13 +612,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestXmlNoFields();

-        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);

@@ -626,11 +634,11 @@
       }

       

       public override TestXmlNoFields BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _testXmlRescursiveFieldNames = new string[] { "child" };

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

     public static TestXmlRescursive DefaultInstance {

@@ -715,7 +723,7 @@
     }

     

     public override TestXmlRescursive DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestXmlRescursive ThisMessage {

@@ -732,12 +740,12 @@
     

     public const int ChildFieldNumber = 1;

     private bool hasChild;

-    private global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive child_;

     public bool HasChild {

       get { return hasChild; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive Child {

-      get { return child_; }

+      get { return child_ ?? global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -801,6 +809,10 @@
     public static TestXmlRescursive ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestXmlRescursive MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -816,22 +828,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestXmlRescursive();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestXmlRescursive cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestXmlRescursive result;

+      private bool resultIsReadOnly;

+      private TestXmlRescursive result;

       

       private TestXmlRescursive PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestXmlRescursive original = result;

           result = new TestXmlRescursive();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -846,13 +858,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestXmlRescursive();

-        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);

@@ -868,11 +880,11 @@
       }

       

       public override TestXmlRescursive BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -988,7 +1000,7 @@
       public Builder ClearChild() {

         PrepareBuilder();

         result.hasChild = false;

-        result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance;

+        result.child_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _testXmlMessageFieldNames = new string[] { "child", "children", "number", "numbers", "text", "textlines", "valid" };

     private static readonly uint[] _testXmlMessageFieldTags = new uint[] { 10, 3211, 48, 16, 26, 5602, 40 };

     public static TestXmlMessage DefaultInstance {

@@ -1009,7 +1021,7 @@
     }

     

     public override TestXmlMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestXmlMessage ThisMessage {

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

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

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

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

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

         private static readonly string[] _childrenFieldNames = new string[] { "binary", "options" };

         private static readonly uint[] _childrenFieldTags = new uint[] { 34, 24 };

         public static Children DefaultInstance {

@@ -1041,7 +1053,7 @@
         }

         

         public override Children DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Children ThisMessage {

@@ -1152,6 +1164,11 @@
         public static Children ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private Children MakeReadOnly() {

+          options_.MakeReadOnly();

+          return this;

+        }

+        

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

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

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

@@ -1167,22 +1184,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Children();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Children cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Children result;

+          private bool resultIsReadOnly;

+          private Children result;

           

           private Children PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Children original = result;

               result = new Children();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1197,13 +1214,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Children();

-            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);

@@ -1219,12 +1236,11 @@
           }

           

           public override Children BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            result.options_.MakeReadOnly();

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -1431,12 +1447,12 @@
     

     public const int ChildFieldNumber = 1;

     private bool hasChild;

-    private global::Google.ProtocolBuffers.TestProtos.TestXmlChild child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestXmlChild child_;

     public bool HasChild {

       get { return hasChild; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestXmlChild Child {

-      get { return child_; }

+      get { return child_ ?? global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance; }

     }

     

     public const int ChildrenFieldNumber = 401;

@@ -1562,6 +1578,13 @@
     public static TestXmlMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestXmlMessage MakeReadOnly() {

+      numbers_.MakeReadOnly();

+      textlines_.MakeReadOnly();

+      children_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -1577,22 +1600,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestXmlMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestXmlMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestXmlMessage result;

+      private bool resultIsReadOnly;

+      private TestXmlMessage result;

       

       private TestXmlMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestXmlMessage original = result;

           result = new TestXmlMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1607,13 +1630,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestXmlMessage();

-        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);

@@ -1629,14 +1652,11 @@
       }

       

       public override TestXmlMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.numbers_.MakeReadOnly();

-        result.textlines_.MakeReadOnly();

-        result.children_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -1919,7 +1939,7 @@
       public Builder ClearChild() {

         PrepareBuilder();

         result.hasChild = false;

-        result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance;

+        result.child_ = null;

         return this;

       }

       

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

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

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

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

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

     private static readonly string[] _testXmlExtensionFieldNames = new string[] { "number" };

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

     public static TestXmlExtension DefaultInstance {

@@ -1984,7 +2004,7 @@
     }

     

     public override TestXmlExtension DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestXmlExtension ThisMessage {

@@ -2071,6 +2091,10 @@
     public static TestXmlExtension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private TestXmlExtension MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2086,22 +2110,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestXmlExtension();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestXmlExtension cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestXmlExtension result;

+      private bool resultIsReadOnly;

+      private TestXmlExtension result;

       

       private TestXmlExtension PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestXmlExtension original = result;

           result = new TestXmlExtension();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2116,13 +2140,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestXmlExtension();

-        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);

@@ -2138,11 +2162,11 @@
       }

       

       public override TestXmlExtension BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
index 0d9109a..375e888 100644
--- a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
+++ b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
@@ -125,7 +125,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _cSharpFileOptionsFieldNames = new string[] { "cls_compliance", "code_contracts", "expand_namespace_directories", "file_extension", "ignore_google_protobuf", "multiple_files", "namespace", "nest_classes", "output_directory", "public_classes", "service_generator_type", "umbrella_classname", "umbrella_namespace" };

     private static readonly uint[] _cSharpFileOptionsFieldTags = new uint[] { 64, 48, 56, 1770, 1792, 32, 10, 40, 1786, 24, 1800, 18, 1778 };

     public static CSharpFileOptions DefaultInstance {

@@ -133,7 +133,7 @@
     }

     

     public override CSharpFileOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CSharpFileOptions ThisMessage {

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

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

     }

+    private CSharpFileOptions MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -426,22 +430,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CSharpFileOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CSharpFileOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CSharpFileOptions result;

+      private bool resultIsReadOnly;

+      private CSharpFileOptions result;

       

       private CSharpFileOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CSharpFileOptions original = result;

           result = new CSharpFileOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -456,13 +460,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CSharpFileOptions();

-        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);

@@ -478,11 +482,11 @@
       }

       

       public override CSharpFileOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _cSharpFieldOptionsFieldNames = new string[] { "property_name" };

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

     public static CSharpFieldOptions DefaultInstance {

@@ -931,7 +935,7 @@
     }

     

     public override CSharpFieldOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CSharpFieldOptions ThisMessage {

@@ -1017,6 +1021,10 @@
     public static CSharpFieldOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CSharpFieldOptions MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1032,22 +1040,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CSharpFieldOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CSharpFieldOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CSharpFieldOptions result;

+      private bool resultIsReadOnly;

+      private CSharpFieldOptions result;

       

       private CSharpFieldOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CSharpFieldOptions original = result;

           result = new CSharpFieldOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1062,13 +1070,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CSharpFieldOptions();

-        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);

@@ -1084,11 +1092,11 @@
       }

       

       public override CSharpFieldOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _cSharpServiceOptionsFieldNames = new string[] { "interface_id" };

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

     public static CSharpServiceOptions DefaultInstance {

@@ -1201,7 +1209,7 @@
     }

     

     public override CSharpServiceOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CSharpServiceOptions ThisMessage {

@@ -1287,6 +1295,10 @@
     public static CSharpServiceOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CSharpServiceOptions MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1302,22 +1314,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CSharpServiceOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CSharpServiceOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CSharpServiceOptions result;

+      private bool resultIsReadOnly;

+      private CSharpServiceOptions result;

       

       private CSharpServiceOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CSharpServiceOptions original = result;

           result = new CSharpServiceOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1332,13 +1344,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CSharpServiceOptions();

-        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);

@@ -1354,11 +1366,11 @@
       }

       

       public override CSharpServiceOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _cSharpMethodOptionsFieldNames = new string[] { "dispatch_id" };

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

     public static CSharpMethodOptions DefaultInstance {

@@ -1471,7 +1483,7 @@
     }

     

     public override CSharpMethodOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override CSharpMethodOptions ThisMessage {

@@ -1557,6 +1569,10 @@
     public static CSharpMethodOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private CSharpMethodOptions MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -1572,22 +1588,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new CSharpMethodOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(CSharpMethodOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      CSharpMethodOptions result;

+      private bool resultIsReadOnly;

+      private CSharpMethodOptions result;

       

       private CSharpMethodOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           CSharpMethodOptions original = result;

           result = new CSharpMethodOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1602,13 +1618,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new CSharpMethodOptions();

-        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);

@@ -1624,11 +1640,11 @@
       }

       

       public override CSharpMethodOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

diff --git a/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs b/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
index 631ec21..82bbd01 100644
--- a/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
+++ b/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
@@ -233,7 +233,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

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

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

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

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

     private static readonly string[] _fileDescriptorSetFieldNames = new string[] { "file" };

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

     public static FileDescriptorSet DefaultInstance {

@@ -241,7 +241,7 @@
     }

     

     public override FileDescriptorSet DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FileDescriptorSet ThisMessage {

@@ -332,6 +332,11 @@
     public static FileDescriptorSet ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private FileDescriptorSet MakeReadOnly() {

+      file_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -347,22 +352,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FileDescriptorSet();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FileDescriptorSet cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FileDescriptorSet result;

+      private bool resultIsReadOnly;

+      private FileDescriptorSet result;

       

       private FileDescriptorSet PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FileDescriptorSet original = result;

           result = new FileDescriptorSet();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -377,13 +382,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FileDescriptorSet();

-        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);

@@ -399,12 +404,11 @@
       }

       

       public override FileDescriptorSet BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.file_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _fileDescriptorProtoFieldNames = new string[] { "dependency", "enum_type", "extension", "message_type", "name", "options", "package", "service" };

     private static readonly uint[] _fileDescriptorProtoFieldTags = new uint[] { 26, 42, 58, 34, 10, 66, 18, 50 };

     public static FileDescriptorProto DefaultInstance {

@@ -540,7 +544,7 @@
     }

     

     public override FileDescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FileDescriptorProto ThisMessage {

@@ -637,12 +641,12 @@
     

     public const int OptionsFieldNumber = 8;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.FileOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.FileOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.FileOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -768,6 +772,15 @@
     public static FileDescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private FileDescriptorProto MakeReadOnly() {

+      dependency_.MakeReadOnly();

+      messageType_.MakeReadOnly();

+      enumType_.MakeReadOnly();

+      service_.MakeReadOnly();

+      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(); }

@@ -783,22 +796,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FileDescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FileDescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FileDescriptorProto result;

+      private bool resultIsReadOnly;

+      private FileDescriptorProto result;

       

       private FileDescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FileDescriptorProto original = result;

           result = new FileDescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -813,13 +826,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FileDescriptorProto();

-        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);

@@ -835,16 +848,11 @@
       }

       

       public override FileDescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.dependency_.MakeReadOnly();

-        result.messageType_.MakeReadOnly();

-        result.enumType_.MakeReadOnly();

-        result.service_.MakeReadOnly();

-        result.extension_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -1259,7 +1267,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _descriptorProtoFieldNames = new string[] { "enum_type", "extension", "extension_range", "field", "name", "nested_type", "options" };

     private static readonly uint[] _descriptorProtoFieldTags = new uint[] { 34, 50, 42, 18, 10, 26, 58 };

     public static DescriptorProto DefaultInstance {

@@ -1280,7 +1288,7 @@
     }

     

     public override DescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override DescriptorProto ThisMessage {

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

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

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

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

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

         private static readonly string[] _extensionRangeFieldNames = new string[] { "end", "start" };

         private static readonly uint[] _extensionRangeFieldTags = new uint[] { 16, 8 };

         public static ExtensionRange DefaultInstance {

@@ -1312,7 +1320,7 @@
         }

         

         public override ExtensionRange DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override ExtensionRange ThisMessage {

@@ -1414,6 +1422,10 @@
         public static ExtensionRange ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

+        private ExtensionRange MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

@@ -1429,22 +1441,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new ExtensionRange();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(ExtensionRange cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          ExtensionRange result;

+          private bool resultIsReadOnly;

+          private ExtensionRange result;

           

           private ExtensionRange PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               ExtensionRange original = result;

               result = new ExtensionRange();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1459,13 +1471,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new ExtensionRange();

-            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);

@@ -1481,11 +1493,11 @@
           }

           

           public override ExtensionRange BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

@@ -1687,12 +1699,12 @@
     

     public const int OptionsFieldNumber = 7;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -1807,6 +1819,15 @@
     public static DescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private DescriptorProto MakeReadOnly() {

+      field_.MakeReadOnly();

+      extension_.MakeReadOnly();

+      nestedType_.MakeReadOnly();

+      enumType_.MakeReadOnly();

+      extensionRange_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -1822,22 +1843,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new DescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(DescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      DescriptorProto result;

+      private bool resultIsReadOnly;

+      private DescriptorProto result;

       

       private DescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           DescriptorProto original = result;

           result = new DescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1852,13 +1873,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new DescriptorProto();

-        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);

@@ -1874,16 +1895,11 @@
       }

       

       public override DescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.field_.MakeReadOnly();

-        result.extension_.MakeReadOnly();

-        result.nestedType_.MakeReadOnly();

-        result.enumType_.MakeReadOnly();

-        result.extensionRange_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -2282,7 +2298,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _fieldDescriptorProtoFieldNames = new string[] { "default_value", "extendee", "label", "name", "number", "options", "type", "type_name" };

     private static readonly uint[] _fieldDescriptorProtoFieldTags = new uint[] { 58, 18, 32, 10, 24, 66, 40, 50 };

     public static FieldDescriptorProto DefaultInstance {

@@ -2303,7 +2319,7 @@
     }

     

     public override FieldDescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FieldDescriptorProto ThisMessage {

@@ -2429,12 +2445,12 @@
     

     public const int OptionsFieldNumber = 8;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -2543,6 +2559,10 @@
     public static FieldDescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private FieldDescriptorProto MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -2558,22 +2578,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FieldDescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FieldDescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FieldDescriptorProto result;

+      private bool resultIsReadOnly;

+      private FieldDescriptorProto result;

       

       private FieldDescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FieldDescriptorProto original = result;

           result = new FieldDescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2588,13 +2608,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FieldDescriptorProto();

-        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);

@@ -2610,11 +2630,11 @@
       }

       

       public override FieldDescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -2939,7 +2959,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _enumDescriptorProtoFieldNames = new string[] { "name", "options", "value" };

     private static readonly uint[] _enumDescriptorProtoFieldTags = new uint[] { 10, 26, 18 };

     public static EnumDescriptorProto DefaultInstance {

@@ -2960,7 +2980,7 @@
     }

     

     public override EnumDescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override EnumDescriptorProto ThisMessage {

@@ -2999,12 +3019,12 @@
     

     public const int OptionsFieldNumber = 3;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -3086,6 +3106,11 @@
     public static EnumDescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private EnumDescriptorProto MakeReadOnly() {

+      value_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -3101,22 +3126,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new EnumDescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(EnumDescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      EnumDescriptorProto result;

+      private bool resultIsReadOnly;

+      private EnumDescriptorProto result;

       

       private EnumDescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           EnumDescriptorProto original = result;

           result = new EnumDescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3131,13 +3156,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new EnumDescriptorProto();

-        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);

@@ -3153,12 +3178,11 @@
       }

       

       public override EnumDescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.value_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -3353,7 +3377,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _enumValueDescriptorProtoFieldNames = new string[] { "name", "number", "options" };

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

     public static EnumValueDescriptorProto DefaultInstance {

@@ -3374,7 +3398,7 @@
     }

     

     public override EnumValueDescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override EnumValueDescriptorProto ThisMessage {

@@ -3411,12 +3435,12 @@
     

     public const int OptionsFieldNumber = 3;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -3495,6 +3519,10 @@
     public static EnumValueDescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private EnumValueDescriptorProto MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -3510,22 +3538,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new EnumValueDescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(EnumValueDescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      EnumValueDescriptorProto result;

+      private bool resultIsReadOnly;

+      private EnumValueDescriptorProto result;

       

       private EnumValueDescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           EnumValueDescriptorProto original = result;

           result = new EnumValueDescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3540,13 +3568,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new EnumValueDescriptorProto();

-        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);

@@ -3562,11 +3590,11 @@
       }

       

       public override EnumValueDescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -3737,7 +3765,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _serviceDescriptorProtoFieldNames = new string[] { "method", "name", "options" };

     private static readonly uint[] _serviceDescriptorProtoFieldTags = new uint[] { 18, 10, 26 };

     public static ServiceDescriptorProto DefaultInstance {

@@ -3758,7 +3786,7 @@
     }

     

     public override ServiceDescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ServiceDescriptorProto ThisMessage {

@@ -3797,12 +3825,12 @@
     

     public const int OptionsFieldNumber = 3;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -3884,6 +3912,11 @@
     public static ServiceDescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private ServiceDescriptorProto MakeReadOnly() {

+      method_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -3899,22 +3932,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ServiceDescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ServiceDescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ServiceDescriptorProto result;

+      private bool resultIsReadOnly;

+      private ServiceDescriptorProto result;

       

       private ServiceDescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ServiceDescriptorProto original = result;

           result = new ServiceDescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3929,13 +3962,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ServiceDescriptorProto();

-        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);

@@ -3951,12 +3984,11 @@
       }

       

       public override ServiceDescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.method_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -4151,7 +4183,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _methodDescriptorProtoFieldNames = new string[] { "input_type", "name", "options", "output_type" };

     private static readonly uint[] _methodDescriptorProtoFieldTags = new uint[] { 18, 10, 34, 26 };

     public static MethodDescriptorProto DefaultInstance {

@@ -4172,7 +4204,7 @@
     }

     

     public override MethodDescriptorProto DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override MethodDescriptorProto ThisMessage {

@@ -4219,12 +4251,12 @@
     

     public const int OptionsFieldNumber = 4;

     private bool hasOptions;

-    private global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions options_ = global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.DefaultInstance;

+    private global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions options_;

     public bool HasOptions {

       get { return hasOptions; }

     }

     public global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions Options {

-      get { return options_; }

+      get { return options_ ?? global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -4309,6 +4341,10 @@
     public static MethodDescriptorProto ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private MethodDescriptorProto MakeReadOnly() {

+      return this;

+    }

+    

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

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

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

@@ -4324,22 +4360,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new MethodDescriptorProto();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(MethodDescriptorProto cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      MethodDescriptorProto result;

+      private bool resultIsReadOnly;

+      private MethodDescriptorProto result;

       

       private MethodDescriptorProto PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           MethodDescriptorProto original = result;

           result = new MethodDescriptorProto();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4354,13 +4390,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new MethodDescriptorProto();

-        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);

@@ -4376,11 +4412,11 @@
       }

       

       public override MethodDescriptorProto BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

@@ -4580,7 +4616,7 @@
       public Builder ClearOptions() {

         PrepareBuilder();

         result.hasOptions = false;

-        result.options_ = global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.DefaultInstance;

+        result.options_ = null;

         return this;

       }

     }

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

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

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

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

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

     private static readonly string[] _fileOptionsFieldNames = new string[] { "cc_generic_services", "java_generic_services", "java_multiple_files", "java_outer_classname", "java_package", "optimize_for", "py_generic_services", "uninterpreted_option" };

     private static readonly uint[] _fileOptionsFieldTags = new uint[] { 128, 136, 80, 66, 10, 72, 144, 7994 };

     public static FileOptions DefaultInstance {

@@ -4601,7 +4637,7 @@
     }

     

     public override FileOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FileOptions ThisMessage {

@@ -4824,6 +4860,11 @@
     public static FileOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private FileOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -4839,22 +4880,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FileOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FileOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FileOptions result;

+      private bool resultIsReadOnly;

+      private FileOptions result;

       

       private FileOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FileOptions original = result;

           result = new FileOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -4869,13 +4910,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FileOptions();

-        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);

@@ -4891,12 +4932,11 @@
       }

       

       public override FileOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _messageOptionsFieldNames = new string[] { "message_set_wire_format", "no_standard_descriptor_accessor", "uninterpreted_option" };

     private static readonly uint[] _messageOptionsFieldTags = new uint[] { 8, 16, 7994 };

     public static MessageOptions DefaultInstance {

@@ -5232,7 +5272,7 @@
     }

     

     public override MessageOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override MessageOptions ThisMessage {

@@ -5359,6 +5399,11 @@
     public static MessageOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private MessageOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -5374,22 +5419,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new MessageOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(MessageOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      MessageOptions result;

+      private bool resultIsReadOnly;

+      private MessageOptions result;

       

       private MessageOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           MessageOptions original = result;

           result = new MessageOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -5404,13 +5449,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new MessageOptions();

-        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);

@@ -5426,12 +5471,11 @@
       }

       

       public override MessageOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

     private static readonly string[] _fieldOptionsFieldNames = new string[] { "ctype", "deprecated", "experimental_map_key", "packed", "uninterpreted_option" };

     private static readonly uint[] _fieldOptionsFieldTags = new uint[] { 8, 24, 74, 16, 7994 };

     public static FieldOptions DefaultInstance {

@@ -5622,7 +5666,7 @@
     }

     

     public override FieldOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override FieldOptions ThisMessage {

@@ -5797,6 +5841,11 @@
     public static FieldOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

+    private FieldOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

@@ -5812,22 +5861,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new FieldOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(FieldOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      FieldOptions result;

+      private bool resultIsReadOnly;

+      private FieldOptions result;

       

       private FieldOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           FieldOptions original = result;

           result = new FieldOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -5842,13 +5891,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new FieldOptions();

-        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);

@@ -5864,12 +5913,11 @@
       }

       

       public override FieldOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

+    private static readonly EnumOptions defaultInstance = new EnumOptions().MakeReadOnly();

     private static readonly string[] _enumOptionsFieldNames = new string[] { "uninterpreted_option" };

     private static readonly uint[] _enumOptionsFieldTags = new uint[] { 7994 };

     public static EnumOptions DefaultInstance {

@@ -6123,7 +6171,7 @@
     }

     

     public override EnumOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override EnumOptions ThisMessage {

@@ -6218,6 +6266,11 @@
     public static EnumOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private EnumOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6233,22 +6286,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new EnumOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(EnumOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      EnumOptions result;

+      private bool resultIsReadOnly;

+      private EnumOptions result;

       

       private EnumOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           EnumOptions original = result;

           result = new EnumOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6263,13 +6316,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new EnumOptions();

-        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);

@@ -6285,12 +6338,11 @@
       }

       

       public override EnumOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6419,7 +6471,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class EnumValueOptions : pb::ExtendableMessage<EnumValueOptions, EnumValueOptions.Builder> {

-    private static readonly EnumValueOptions defaultInstance = new Builder().BuildPartial();

+    private static readonly EnumValueOptions defaultInstance = new EnumValueOptions().MakeReadOnly();

     private static readonly string[] _enumValueOptionsFieldNames = new string[] { "uninterpreted_option" };

     private static readonly uint[] _enumValueOptionsFieldTags = new uint[] { 7994 };

     public static EnumValueOptions DefaultInstance {

@@ -6427,7 +6479,7 @@
     }

     

     public override EnumValueOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override EnumValueOptions ThisMessage {

@@ -6522,6 +6574,11 @@
     public static EnumValueOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private EnumValueOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6537,22 +6594,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new EnumValueOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(EnumValueOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      EnumValueOptions result;

+      private bool resultIsReadOnly;

+      private EnumValueOptions result;

       

       private EnumValueOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           EnumValueOptions original = result;

           result = new EnumValueOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6567,13 +6624,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new EnumValueOptions();

-        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);

@@ -6589,12 +6646,11 @@
       }

       

       public override EnumValueOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -6723,7 +6779,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class ServiceOptions : pb::ExtendableMessage<ServiceOptions, ServiceOptions.Builder> {

-    private static readonly ServiceOptions defaultInstance = new Builder().BuildPartial();

+    private static readonly ServiceOptions defaultInstance = new ServiceOptions().MakeReadOnly();

     private static readonly string[] _serviceOptionsFieldNames = new string[] { "uninterpreted_option" };

     private static readonly uint[] _serviceOptionsFieldTags = new uint[] { 7994 };

     public static ServiceOptions DefaultInstance {

@@ -6731,7 +6787,7 @@
     }

     

     public override ServiceOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ServiceOptions ThisMessage {

@@ -6826,6 +6882,11 @@
     public static ServiceOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private ServiceOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6841,22 +6902,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ServiceOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ServiceOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ServiceOptions result;

+      private bool resultIsReadOnly;

+      private ServiceOptions result;

       

       private ServiceOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ServiceOptions original = result;

           result = new ServiceOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6871,13 +6932,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ServiceOptions();

-        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);

@@ -6893,12 +6954,11 @@
       }

       

       public override ServiceOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -7027,7 +7087,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class MethodOptions : pb::ExtendableMessage<MethodOptions, MethodOptions.Builder> {

-    private static readonly MethodOptions defaultInstance = new Builder().BuildPartial();

+    private static readonly MethodOptions defaultInstance = new MethodOptions().MakeReadOnly();

     private static readonly string[] _methodOptionsFieldNames = new string[] { "uninterpreted_option" };

     private static readonly uint[] _methodOptionsFieldTags = new uint[] { 7994 };

     public static MethodOptions DefaultInstance {

@@ -7035,7 +7095,7 @@
     }

     

     public override MethodOptions DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override MethodOptions ThisMessage {

@@ -7130,6 +7190,11 @@
     public static MethodOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private MethodOptions MakeReadOnly() {

+      uninterpretedOption_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -7145,22 +7210,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new MethodOptions();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(MethodOptions cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      MethodOptions result;

+      private bool resultIsReadOnly;

+      private MethodOptions result;

       

       private MethodOptions PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           MethodOptions original = result;

           result = new MethodOptions();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -7175,13 +7240,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new MethodOptions();

-        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);

@@ -7197,12 +7262,11 @@
       }

       

       public override MethodOptions BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.uninterpretedOption_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -7331,7 +7395,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class UninterpretedOption : pb::GeneratedMessage<UninterpretedOption, UninterpretedOption.Builder> {

-    private static readonly UninterpretedOption defaultInstance = new Builder().BuildPartial();

+    private static readonly UninterpretedOption defaultInstance = new UninterpretedOption().MakeReadOnly();

     private static readonly string[] _uninterpretedOptionFieldNames = new string[] { "double_value", "identifier_value", "name", "negative_int_value", "positive_int_value", "string_value" };

     private static readonly uint[] _uninterpretedOptionFieldTags = new uint[] { 49, 26, 18, 40, 32, 58 };

     public static UninterpretedOption DefaultInstance {

@@ -7339,7 +7403,7 @@
     }

     

     public override UninterpretedOption DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override UninterpretedOption ThisMessage {

@@ -7363,7 +7427,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class NamePart : pb::GeneratedMessage<NamePart, NamePart.Builder> {

-        private static readonly NamePart defaultInstance = new Builder().BuildPartial();

+        private static readonly NamePart defaultInstance = new NamePart().MakeReadOnly();

         private static readonly string[] _namePartFieldNames = new string[] { "is_extension", "name_part" };

         private static readonly uint[] _namePartFieldTags = new uint[] { 16, 10 };

         public static NamePart DefaultInstance {

@@ -7371,7 +7435,7 @@
         }

         

         public override NamePart DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override NamePart ThisMessage {

@@ -7475,6 +7539,10 @@
         public static NamePart ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private NamePart MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -7490,22 +7558,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new NamePart();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(NamePart cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          NamePart result;

+          private bool resultIsReadOnly;

+          private NamePart result;

           

           private NamePart PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               NamePart original = result;

               result = new NamePart();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -7520,13 +7588,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new NamePart();

-            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);

@@ -7542,11 +7610,11 @@
           }

           

           public override NamePart BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -7834,6 +7902,11 @@
     public static UninterpretedOption ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private UninterpretedOption MakeReadOnly() {

+      name_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -7849,22 +7922,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new UninterpretedOption();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(UninterpretedOption cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      UninterpretedOption result;

+      private bool resultIsReadOnly;

+      private UninterpretedOption result;

       

       private UninterpretedOption PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           UninterpretedOption original = result;

           result = new UninterpretedOption();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -7879,13 +7952,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new UninterpretedOption();

-        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);

@@ -7901,12 +7974,11 @@
       }

       

       public override UninterpretedOption BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.name_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasFullProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasFullProtoFile.cs
index 563cea5..5267bf3 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasFullProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasFullProtoFile.cs
@@ -128,13 +128,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestInteropPerson : pb::ExtendableMessage<TestInteropPerson, TestInteropPerson.Builder> {

-    private static readonly TestInteropPerson defaultInstance = new Builder().BuildPartial();

+    private static readonly TestInteropPerson defaultInstance = new TestInteropPerson().MakeReadOnly();

     public static TestInteropPerson DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestInteropPerson DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestInteropPerson ThisMessage {

@@ -166,13 +166,13 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class PhoneNumber : pb::GeneratedMessage<PhoneNumber, PhoneNumber.Builder> {

-        private static readonly PhoneNumber defaultInstance = new Builder().BuildPartial();

+        private static readonly PhoneNumber defaultInstance = new PhoneNumber().MakeReadOnly();

         public static PhoneNumber DefaultInstance {

           get { return defaultInstance; }

         }

         

         public override PhoneNumber DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override PhoneNumber ThisMessage {

@@ -237,6 +237,10 @@
         public static PhoneNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private PhoneNumber MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -252,22 +256,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new PhoneNumber();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(PhoneNumber cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          PhoneNumber result;

+          private bool resultIsReadOnly;

+          private PhoneNumber result;

           

           private PhoneNumber PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               PhoneNumber original = result;

               result = new PhoneNumber();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -282,13 +286,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new PhoneNumber();

-            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);

@@ -304,11 +308,11 @@
           }

           

           public override PhoneNumber BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           

@@ -362,13 +366,13 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class Addresses : pb::GeneratedMessage<Addresses, Addresses.Builder> {

-        private static readonly Addresses defaultInstance = new Builder().BuildPartial();

+        private static readonly Addresses defaultInstance = new Addresses().MakeReadOnly();

         public static Addresses DefaultInstance {

           get { return defaultInstance; }

         }

         

         public override Addresses DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Addresses ThisMessage {

@@ -464,6 +468,10 @@
         public static Addresses ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private Addresses MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -479,22 +487,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Addresses();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Addresses cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Addresses result;

+          private bool resultIsReadOnly;

+          private Addresses result;

           

           private Addresses PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Addresses original = result;

               result = new Addresses();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -509,13 +517,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Addresses();

-            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);

@@ -531,11 +539,11 @@
           }

           

           public override Addresses BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           

@@ -749,6 +757,13 @@
     public static TestInteropPerson ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestInteropPerson MakeReadOnly() {

+      codes_.MakeReadOnly();

+      phone_.MakeReadOnly();

+      addresses_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -764,22 +779,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestInteropPerson();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestInteropPerson cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestInteropPerson result;

+      private bool resultIsReadOnly;

+      private TestInteropPerson result;

       

       private TestInteropPerson PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestInteropPerson original = result;

           result = new TestInteropPerson();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -794,13 +809,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestInteropPerson();

-        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);

@@ -816,14 +831,11 @@
       }

       

       public override TestInteropPerson BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.codes_.MakeReadOnly();

-        result.phone_.MakeReadOnly();

-        result.addresses_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -1016,13 +1028,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestInteropEmployeeId : pb::GeneratedMessage<TestInteropEmployeeId, TestInteropEmployeeId.Builder> {

-    private static readonly TestInteropEmployeeId defaultInstance = new Builder().BuildPartial();

+    private static readonly TestInteropEmployeeId defaultInstance = new TestInteropEmployeeId().MakeReadOnly();

     public static TestInteropEmployeeId DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestInteropEmployeeId DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestInteropEmployeeId ThisMessage {

@@ -1077,6 +1089,10 @@
     public static TestInteropEmployeeId ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestInteropEmployeeId MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1092,22 +1108,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestInteropEmployeeId();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestInteropEmployeeId cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestInteropEmployeeId result;

+      private bool resultIsReadOnly;

+      private TestInteropEmployeeId result;

       

       private TestInteropEmployeeId PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestInteropEmployeeId original = result;

           result = new TestInteropEmployeeId();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1122,13 +1138,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestInteropEmployeeId();

-        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);

@@ -1144,11 +1160,11 @@
       }

       

       public override TestInteropEmployeeId BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -1182,13 +1198,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestMissingFieldsA : pb::GeneratedMessage<TestMissingFieldsA, TestMissingFieldsA.Builder> {

-    private static readonly TestMissingFieldsA defaultInstance = new Builder().BuildPartial();

+    private static readonly TestMissingFieldsA defaultInstance = new TestMissingFieldsA().MakeReadOnly();

     public static TestMissingFieldsA DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestMissingFieldsA DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMissingFieldsA ThisMessage {

@@ -1212,13 +1228,13 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class SubA : pb::GeneratedMessage<SubA, SubA.Builder> {

-        private static readonly SubA defaultInstance = new Builder().BuildPartial();

+        private static readonly SubA defaultInstance = new SubA().MakeReadOnly();

         public static SubA DefaultInstance {

           get { return defaultInstance; }

         }

         

         public override SubA DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override SubA ThisMessage {

@@ -1285,6 +1301,11 @@
         public static SubA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private SubA MakeReadOnly() {

+          values_.MakeReadOnly();

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1300,22 +1321,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new SubA();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(SubA cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          SubA result;

+          private bool resultIsReadOnly;

+          private SubA result;

           

           private SubA PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               SubA original = result;

               result = new SubA();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1330,13 +1351,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new SubA();

-            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);

@@ -1352,12 +1373,11 @@
           }

           

           public override SubA BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            result.values_.MakeReadOnly();

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           

@@ -1453,12 +1473,12 @@
     

     public const int TestAFieldNumber = 11;

     private bool hasTestA;

-    private global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsA.Types.SubA testA_ = global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsA.Types.SubA.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsA.Types.SubA testA_;

     public bool HasTestA {

       get { return hasTestA; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsA.Types.SubA TestA {

-      get { return testA_; }

+      get { return testA_ ?? global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsA.Types.SubA.DefaultInstance; }

     }

     

     public static TestMissingFieldsA ParseFrom(pb::ByteString data) {

@@ -1491,6 +1511,10 @@
     public static TestMissingFieldsA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestMissingFieldsA MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1506,22 +1530,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMissingFieldsA();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMissingFieldsA cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMissingFieldsA result;

+      private bool resultIsReadOnly;

+      private TestMissingFieldsA result;

       

       private TestMissingFieldsA PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMissingFieldsA original = result;

           result = new TestMissingFieldsA();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1536,13 +1560,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMissingFieldsA();

-        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);

@@ -1558,11 +1582,11 @@
       }

       

       public override TestMissingFieldsA BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -1664,7 +1688,7 @@
       public Builder ClearTestA() {

         PrepareBuilder();

         result.hasTestA = false;

-        result.testA_ = global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsA.Types.SubA.DefaultInstance;

+        result.testA_ = null;

         return this;

       }

     }

@@ -1677,13 +1701,13 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestMissingFieldsB : pb::GeneratedMessage<TestMissingFieldsB, TestMissingFieldsB.Builder> {

-    private static readonly TestMissingFieldsB defaultInstance = new Builder().BuildPartial();

+    private static readonly TestMissingFieldsB defaultInstance = new TestMissingFieldsB().MakeReadOnly();

     public static TestMissingFieldsB DefaultInstance {

       get { return defaultInstance; }

     }

     

     public override TestMissingFieldsB DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestMissingFieldsB ThisMessage {

@@ -1707,13 +1731,13 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class SubB : pb::GeneratedMessage<SubB, SubB.Builder> {

-        private static readonly SubB defaultInstance = new Builder().BuildPartial();

+        private static readonly SubB defaultInstance = new SubB().MakeReadOnly();

         public static SubB DefaultInstance {

           get { return defaultInstance; }

         }

         

         public override SubB DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override SubB ThisMessage {

@@ -1770,6 +1794,11 @@
         public static SubB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private SubB MakeReadOnly() {

+          values_.MakeReadOnly();

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1785,22 +1814,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new SubB();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(SubB cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          SubB result;

+          private bool resultIsReadOnly;

+          private SubB result;

           

           private SubB PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               SubB original = result;

               result = new SubB();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -1815,13 +1844,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new SubB();

-            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);

@@ -1837,12 +1866,11 @@
           }

           

           public override SubB BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            result.values_.MakeReadOnly();

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           

@@ -1918,12 +1946,12 @@
     

     public const int TestBFieldNumber = 12;

     private bool hasTestB;

-    private global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsB.Types.SubB testB_ = global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsB.Types.SubB.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsB.Types.SubB testB_;

     public bool HasTestB {

       get { return hasTestB; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsB.Types.SubB TestB {

-      get { return testB_; }

+      get { return testB_ ?? global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsB.Types.SubB.DefaultInstance; }

     }

     

     public static TestMissingFieldsB ParseFrom(pb::ByteString data) {

@@ -1956,6 +1984,10 @@
     public static TestMissingFieldsB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestMissingFieldsB MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1971,22 +2003,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestMissingFieldsB();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestMissingFieldsB cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestMissingFieldsB result;

+      private bool resultIsReadOnly;

+      private TestMissingFieldsB result;

       

       private TestMissingFieldsB PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestMissingFieldsB original = result;

           result = new TestMissingFieldsB();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -2001,13 +2033,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestMissingFieldsB();

-        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);

@@ -2023,11 +2055,11 @@
       }

       

       public override TestMissingFieldsB BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       

@@ -2129,7 +2161,7 @@
       public Builder ClearTestB() {

         PrepareBuilder();

         result.hasTestB = false;

-        result.testB_ = global::Google.ProtocolBuffers.TestProtos.TestMissingFieldsB.Types.SubB.DefaultInstance;

+        result.testB_ = null;

         return this;

       }

     }

diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs
index cbbc50d..d070aed 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs
@@ -59,7 +59,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestRequiredLite : pb::GeneratedMessageLite<TestRequiredLite, TestRequiredLite.Builder> {

-    private static readonly TestRequiredLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestRequiredLite defaultInstance = new TestRequiredLite().MakeReadOnly();

     private static readonly string[] _testRequiredLiteFieldNames = new string[] { "d", "en" };

     private static readonly uint[] _testRequiredLiteFieldTags = new uint[] { 8, 16 };

     public static TestRequiredLite DefaultInstance {

@@ -67,7 +67,7 @@
     }

     

     public override TestRequiredLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestRequiredLite ThisMessage {

@@ -183,6 +183,10 @@
     public static TestRequiredLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestRequiredLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -198,22 +202,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestRequiredLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestRequiredLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestRequiredLite result;

+      private bool resultIsReadOnly;

+      private TestRequiredLite result;

       

       private TestRequiredLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestRequiredLite original = result;

           result = new TestRequiredLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -228,13 +232,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestRequiredLite();

-        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);

@@ -246,11 +250,11 @@
       }

       

       public override TestRequiredLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -371,7 +375,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestInteropPersonLite : pb::ExtendableMessageLite<TestInteropPersonLite, TestInteropPersonLite.Builder> {

-    private static readonly TestInteropPersonLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestInteropPersonLite defaultInstance = new TestInteropPersonLite().MakeReadOnly();

     private static readonly string[] _testInteropPersonLiteFieldNames = new string[] { "addresses", "codes", "email", "id", "name", "phone" };

     private static readonly uint[] _testInteropPersonLiteFieldTags = new uint[] { 43, 82, 26, 16, 10, 34 };

     public static TestInteropPersonLite DefaultInstance {

@@ -379,7 +383,7 @@
     }

     

     public override TestInteropPersonLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestInteropPersonLite ThisMessage {

@@ -403,7 +407,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class PhoneNumber : pb::GeneratedMessageLite<PhoneNumber, PhoneNumber.Builder> {

-        private static readonly PhoneNumber defaultInstance = new Builder().BuildPartial();

+        private static readonly PhoneNumber defaultInstance = new PhoneNumber().MakeReadOnly();

         private static readonly string[] _phoneNumberFieldNames = new string[] { "number", "type" };

         private static readonly uint[] _phoneNumberFieldTags = new uint[] { 10, 16 };

         public static PhoneNumber DefaultInstance {

@@ -411,7 +415,7 @@
         }

         

         public override PhoneNumber DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override PhoneNumber ThisMessage {

@@ -526,6 +530,10 @@
         public static PhoneNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private PhoneNumber MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -541,22 +549,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new PhoneNumber();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(PhoneNumber cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          PhoneNumber result;

+          private bool resultIsReadOnly;

+          private PhoneNumber result;

           

           private PhoneNumber PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               PhoneNumber original = result;

               result = new PhoneNumber();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -571,13 +579,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new PhoneNumber();

-            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);

@@ -589,11 +597,11 @@
           }

           

           public override PhoneNumber BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessageLite other) {

@@ -715,7 +723,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class Addresses : pb::GeneratedMessageLite<Addresses, Addresses.Builder> {

-        private static readonly Addresses defaultInstance = new Builder().BuildPartial();

+        private static readonly Addresses defaultInstance = new Addresses().MakeReadOnly();

         private static readonly string[] _addressesFieldNames = new string[] { "address", "address2", "city", "state", "zip" };

         private static readonly uint[] _addressesFieldTags = new uint[] { 10, 18, 26, 34, 45 };

         public static Addresses DefaultInstance {

@@ -723,7 +731,7 @@
         }

         

         public override Addresses DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override Addresses ThisMessage {

@@ -899,6 +907,10 @@
         public static Addresses ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

           return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

         }

+        private Addresses MakeReadOnly() {

+          return this;

+        }

+        

         public static Builder CreateBuilder() { return new Builder(); }

         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

@@ -914,22 +926,22 @@
             get { return this; }

           }

           public Builder() {

-            result = DefaultInstance ?? new Addresses();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(Addresses cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          Addresses result;

+          private bool resultIsReadOnly;

+          private Addresses result;

           

           private Addresses PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               Addresses original = result;

               result = new Addresses();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

@@ -944,13 +956,13 @@
           }

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new Addresses();

-            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);

@@ -962,11 +974,11 @@
           }

           

           public override Addresses BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

           public override Builder MergeFrom(pb::IMessageLite other) {

@@ -1388,6 +1400,13 @@
     public static TestInteropPersonLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestInteropPersonLite MakeReadOnly() {

+      codes_.MakeReadOnly();

+      phone_.MakeReadOnly();

+      addresses_.MakeReadOnly();

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1403,22 +1422,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestInteropPersonLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestInteropPersonLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestInteropPersonLite result;

+      private bool resultIsReadOnly;

+      private TestInteropPersonLite result;

       

       private TestInteropPersonLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestInteropPersonLite original = result;

           result = new TestInteropPersonLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1433,13 +1452,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestInteropPersonLite();

-        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);

@@ -1451,14 +1470,11 @@
       }

       

       public override TestInteropPersonLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.codes_.MakeReadOnly();

-        result.phone_.MakeReadOnly();

-        result.addresses_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -1745,7 +1761,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestInteropEmployeeIdLite : pb::GeneratedMessageLite<TestInteropEmployeeIdLite, TestInteropEmployeeIdLite.Builder> {

-    private static readonly TestInteropEmployeeIdLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestInteropEmployeeIdLite defaultInstance = new TestInteropEmployeeIdLite().MakeReadOnly();

     private static readonly string[] _testInteropEmployeeIdLiteFieldNames = new string[] { "number" };

     private static readonly uint[] _testInteropEmployeeIdLiteFieldTags = new uint[] { 10 };

     public static TestInteropEmployeeIdLite DefaultInstance {

@@ -1753,7 +1769,7 @@
     }

     

     public override TestInteropEmployeeIdLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestInteropEmployeeIdLite ThisMessage {

@@ -1849,6 +1865,10 @@
     public static TestInteropEmployeeIdLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestInteropEmployeeIdLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -1864,22 +1884,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestInteropEmployeeIdLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestInteropEmployeeIdLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestInteropEmployeeIdLite result;

+      private bool resultIsReadOnly;

+      private TestInteropEmployeeIdLite result;

       

       private TestInteropEmployeeIdLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestInteropEmployeeIdLite original = result;

           result = new TestInteropEmployeeIdLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -1894,13 +1914,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestInteropEmployeeIdLite();

-        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);

@@ -1912,11 +1932,11 @@
       }

       

       public override TestInteropEmployeeIdLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportLiteProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportLiteProtoFile.cs
index 0df40f4..3eb3062 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportLiteProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportLiteProtoFile.cs
@@ -43,7 +43,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class ImportMessageLite : pb::GeneratedMessageLite<ImportMessageLite, ImportMessageLite.Builder> {

-    private static readonly ImportMessageLite defaultInstance = new Builder().BuildPartial();

+    private static readonly ImportMessageLite defaultInstance = new ImportMessageLite().MakeReadOnly();

     private static readonly string[] _importMessageLiteFieldNames = new string[] { "d" };

     private static readonly uint[] _importMessageLiteFieldTags = new uint[] { 8 };

     public static ImportMessageLite DefaultInstance {

@@ -51,7 +51,7 @@
     }

     

     public override ImportMessageLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ImportMessageLite ThisMessage {

@@ -146,6 +146,10 @@
     public static ImportMessageLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private ImportMessageLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -161,22 +165,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ImportMessageLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ImportMessageLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ImportMessageLite result;

+      private bool resultIsReadOnly;

+      private ImportMessageLite result;

       

       private ImportMessageLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ImportMessageLite original = result;

           result = new ImportMessageLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -191,13 +195,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ImportMessageLite();

-        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);

@@ -209,11 +213,11 @@
       }

       

       public override ImportMessageLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportProtoFile.cs
index 75e746a..6f7f59d 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestImportProtoFile.cs
@@ -71,7 +71,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> {

-    private static readonly ImportMessage defaultInstance = new Builder().BuildPartial();

+    private static readonly ImportMessage defaultInstance = new ImportMessage().MakeReadOnly();

     private static readonly string[] _importMessageFieldNames = new string[] { "d" };

     private static readonly uint[] _importMessageFieldTags = new uint[] { 8 };

     public static ImportMessage DefaultInstance {

@@ -79,7 +79,7 @@
     }

     

     public override ImportMessage DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ImportMessage ThisMessage {

@@ -165,6 +165,10 @@
     public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private ImportMessage MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -180,22 +184,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ImportMessage();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ImportMessage cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ImportMessage result;

+      private bool resultIsReadOnly;

+      private ImportMessage result;

       

       private ImportMessage PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ImportMessage original = result;

           result = new ImportMessage();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -210,13 +214,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ImportMessage();

-        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);

@@ -232,11 +236,11 @@
       }

       

       public override ImportMessage BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteImportNonLiteProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteImportNonLiteProtoFile.cs
index 5a6033a..34ae37f 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteImportNonLiteProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteImportNonLiteProtoFile.cs
@@ -32,7 +32,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestLiteImportsNonlite : pb::GeneratedMessageLite<TestLiteImportsNonlite, TestLiteImportsNonlite.Builder> {

-    private static readonly TestLiteImportsNonlite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestLiteImportsNonlite defaultInstance = new TestLiteImportsNonlite().MakeReadOnly();

     private static readonly string[] _testLiteImportsNonliteFieldNames = new string[] { "message" };

     private static readonly uint[] _testLiteImportsNonliteFieldTags = new uint[] { 10 };

     public static TestLiteImportsNonlite DefaultInstance {

@@ -40,7 +40,7 @@
     }

     

     public override TestLiteImportsNonlite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestLiteImportsNonlite ThisMessage {

@@ -49,12 +49,12 @@
     

     public const int MessageFieldNumber = 1;

     private bool hasMessage;

-    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes message_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes message_;

     public bool HasMessage {

       get { return hasMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Message {

-      get { return message_; }

+      get { return message_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }

     }

     

     public override bool IsInitialized {

@@ -135,6 +135,10 @@
     public static TestLiteImportsNonlite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestLiteImportsNonlite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -150,22 +154,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestLiteImportsNonlite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestLiteImportsNonlite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestLiteImportsNonlite result;

+      private bool resultIsReadOnly;

+      private TestLiteImportsNonlite result;

       

       private TestLiteImportsNonlite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestLiteImportsNonlite original = result;

           result = new TestLiteImportsNonlite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -180,13 +184,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestLiteImportsNonlite();

-        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);

@@ -198,11 +202,11 @@
       }

       

       public override TestLiteImportsNonlite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -304,7 +308,7 @@
       public Builder ClearMessage() {

         PrepareBuilder();

         result.hasMessage = false;

-        result.message_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance;

+        result.message_ = null;

         return this;

       }

     }

diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteProtoFile.cs
index 2592c83..5ad7558 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestLiteProtoFile.cs
@@ -1228,7 +1228,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestAllTypesLite : pb::GeneratedMessageLite<TestAllTypesLite, TestAllTypesLite.Builder> {

-    private static readonly TestAllTypesLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestAllTypesLite defaultInstance = new TestAllTypesLite().MakeReadOnly();

     private static readonly string[] _testAllTypesLiteFieldNames = 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[] _testAllTypesLiteFieldTags = 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 TestAllTypesLite DefaultInstance {

@@ -1236,7 +1236,7 @@
     }

     

     public override TestAllTypesLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestAllTypesLite ThisMessage {

@@ -1260,7 +1260,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class NestedMessage : pb::GeneratedMessageLite<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 {

@@ -1268,7 +1268,7 @@
         }

         

         public override NestedMessage DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override NestedMessage ThisMessage {

@@ -1363,6 +1363,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(); }

@@ -1378,22 +1382,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;

@@ -1408,13 +1412,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);

@@ -1426,11 +1430,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::IMessageLite other) {

@@ -1520,7 +1524,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class OptionalGroup : pb::GeneratedMessageLite<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 {

@@ -1528,7 +1532,7 @@
         }

         

         public override OptionalGroup DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override OptionalGroup ThisMessage {

@@ -1623,6 +1627,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(); }

@@ -1638,22 +1646,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;

@@ -1668,13 +1676,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);

@@ -1686,11 +1694,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::IMessageLite other) {

@@ -1780,7 +1788,7 @@
       [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class RepeatedGroup : pb::GeneratedMessageLite<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 {

@@ -1788,7 +1796,7 @@
         }

         

         public override RepeatedGroup DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override RepeatedGroup ThisMessage {

@@ -1883,6 +1891,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(); }

@@ -1898,22 +1910,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;

@@ -1928,13 +1940,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);

@@ -1946,11 +1958,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::IMessageLite other) {

@@ -2195,42 +2207,42 @@
     

     public const int OptionalGroupFieldNumber = 16;

     private bool hasOptionalGroup;

-    private global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.OptionalGroup optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.OptionalGroup.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.OptionalGroup optionalGroup_;

     public bool HasOptionalGroup {

       get { return hasOptionalGroup; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.OptionalGroup OptionalGroup {

-      get { return optionalGroup_; }

+      get { return optionalGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.OptionalGroup.DefaultInstance; }

     }

     

     public const int OptionalNestedMessageFieldNumber = 18;

     private bool hasOptionalNestedMessage;

-    private global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage optionalNestedMessage_;

     public bool HasOptionalNestedMessage {

       get { return hasOptionalNestedMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage OptionalNestedMessage {

-      get { return optionalNestedMessage_; }

+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage.DefaultInstance; }

     }

     

     public const int OptionalForeignMessageFieldNumber = 19;

     private bool hasOptionalForeignMessage;

-    private global::Google.ProtocolBuffers.TestProtos.ForeignMessageLite optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessageLite.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessageLite optionalForeignMessage_;

     public bool HasOptionalForeignMessage {

       get { return hasOptionalForeignMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ForeignMessageLite OptionalForeignMessage {

-      get { return optionalForeignMessage_; }

+      get { return optionalForeignMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessageLite.DefaultInstance; }

     }

     

     public const int OptionalImportMessageFieldNumber = 20;

     private bool hasOptionalImportMessage;

-    private global::Google.ProtocolBuffers.TestProtos.ImportMessageLite optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance;

+    private global::Google.ProtocolBuffers.TestProtos.ImportMessageLite optionalImportMessage_;

     public bool HasOptionalImportMessage {

       get { return hasOptionalImportMessage; }

     }

     public global::Google.ProtocolBuffers.TestProtos.ImportMessageLite OptionalImportMessage {

-      get { return optionalImportMessage_; }

+      get { return optionalImportMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance; }

     }

     

     public const int OptionalNestedEnumFieldNumber = 21;

@@ -3628,6 +3640,34 @@
     public static TestAllTypesLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestAllTypesLite 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(); }

@@ -3643,22 +3683,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestAllTypesLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestAllTypesLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestAllTypesLite result;

+      private bool resultIsReadOnly;

+      private TestAllTypesLite result;

       

       private TestAllTypesLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestAllTypesLite original = result;

           result = new TestAllTypesLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -3673,13 +3713,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestAllTypesLite();

-        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);

@@ -3691,35 +3731,11 @@
       }

       

       public override TestAllTypesLite 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::IMessageLite other) {

@@ -4658,7 +4674,7 @@
       public Builder ClearOptionalGroup() {

         PrepareBuilder();

         result.hasOptionalGroup = false;

-        result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.OptionalGroup.DefaultInstance;

+        result.optionalGroup_ = null;

         return this;

       }

       

@@ -4698,7 +4714,7 @@
       public Builder ClearOptionalNestedMessage() {

         PrepareBuilder();

         result.hasOptionalNestedMessage = false;

-        result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage.DefaultInstance;

+        result.optionalNestedMessage_ = null;

         return this;

       }

       

@@ -4738,7 +4754,7 @@
       public Builder ClearOptionalForeignMessage() {

         PrepareBuilder();

         result.hasOptionalForeignMessage = false;

-        result.optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessageLite.DefaultInstance;

+        result.optionalForeignMessage_ = null;

         return this;

       }

       

@@ -4778,7 +4794,7 @@
       public Builder ClearOptionalImportMessage() {

         PrepareBuilder();

         result.hasOptionalImportMessage = false;

-        result.optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance;

+        result.optionalImportMessage_ = null;

         return this;

       }

       

@@ -6109,7 +6125,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class ForeignMessageLite : pb::GeneratedMessageLite<ForeignMessageLite, ForeignMessageLite.Builder> {

-    private static readonly ForeignMessageLite defaultInstance = new Builder().BuildPartial();

+    private static readonly ForeignMessageLite defaultInstance = new ForeignMessageLite().MakeReadOnly();

     private static readonly string[] _foreignMessageLiteFieldNames = new string[] { "c" };

     private static readonly uint[] _foreignMessageLiteFieldTags = new uint[] { 8 };

     public static ForeignMessageLite DefaultInstance {

@@ -6117,7 +6133,7 @@
     }

     

     public override ForeignMessageLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override ForeignMessageLite ThisMessage {

@@ -6212,6 +6228,10 @@
     public static ForeignMessageLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private ForeignMessageLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -6227,22 +6247,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new ForeignMessageLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(ForeignMessageLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      ForeignMessageLite result;

+      private bool resultIsReadOnly;

+      private ForeignMessageLite result;

       

       private ForeignMessageLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           ForeignMessageLite original = result;

           result = new ForeignMessageLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6257,13 +6277,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new ForeignMessageLite();

-        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);

@@ -6275,11 +6295,11 @@
       }

       

       public override ForeignMessageLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -6369,7 +6389,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestPackedTypesLite : pb::GeneratedMessageLite<TestPackedTypesLite, TestPackedTypesLite.Builder> {

-    private static readonly TestPackedTypesLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestPackedTypesLite defaultInstance = new TestPackedTypesLite().MakeReadOnly();

     private static readonly string[] _testPackedTypesLiteFieldNames = 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[] _testPackedTypesLiteFieldTags = new uint[] { 818, 810, 826, 770, 778, 802, 722, 730, 786, 794, 754, 762, 738, 746 };

     public static TestPackedTypesLite DefaultInstance {

@@ -6377,7 +6397,7 @@
     }

     

     public override TestPackedTypesLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestPackedTypesLite ThisMessage {

@@ -6910,6 +6930,24 @@
     public static TestPackedTypesLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestPackedTypesLite 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(); }

@@ -6925,22 +6963,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestPackedTypesLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestPackedTypesLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestPackedTypesLite result;

+      private bool resultIsReadOnly;

+      private TestPackedTypesLite result;

       

       private TestPackedTypesLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestPackedTypesLite original = result;

           result = new TestPackedTypesLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -6955,13 +6993,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestPackedTypesLite();

-        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);

@@ -6973,25 +7011,11 @@
       }

       

       public override TestPackedTypesLite 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::IMessageLite other) {

@@ -7607,7 +7631,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestUnpackedTypesLite : pb::GeneratedMessageLite<TestUnpackedTypesLite, TestUnpackedTypesLite.Builder> {

-    private static readonly TestUnpackedTypesLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestUnpackedTypesLite defaultInstance = new TestUnpackedTypesLite().MakeReadOnly();

     private static readonly string[] _testUnpackedTypesLiteFieldNames = 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[] _testUnpackedTypesLiteFieldTags = new uint[] { 816, 809, 824, 773, 777, 805, 720, 728, 789, 793, 752, 760, 736, 744 };

     public static TestUnpackedTypesLite DefaultInstance {

@@ -7615,7 +7639,7 @@
     }

     

     public override TestUnpackedTypesLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestUnpackedTypesLite ThisMessage {

@@ -8093,6 +8117,24 @@
     public static TestUnpackedTypesLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestUnpackedTypesLite 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(); }

@@ -8108,22 +8150,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestUnpackedTypesLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestUnpackedTypesLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestUnpackedTypesLite result;

+      private bool resultIsReadOnly;

+      private TestUnpackedTypesLite result;

       

       private TestUnpackedTypesLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestUnpackedTypesLite original = result;

           result = new TestUnpackedTypesLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -8138,13 +8180,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestUnpackedTypesLite();

-        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);

@@ -8156,25 +8198,11 @@
       }

       

       public override TestUnpackedTypesLite 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::IMessageLite other) {

@@ -8790,7 +8818,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestAllExtensionsLite : pb::ExtendableMessageLite<TestAllExtensionsLite, TestAllExtensionsLite.Builder> {

-    private static readonly TestAllExtensionsLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestAllExtensionsLite defaultInstance = new TestAllExtensionsLite().MakeReadOnly();

     private static readonly string[] _testAllExtensionsLiteFieldNames = new string[] {  };

     private static readonly uint[] _testAllExtensionsLiteFieldTags = new uint[] {  };

     public static TestAllExtensionsLite DefaultInstance {

@@ -8798,7 +8826,7 @@
     }

     

     public override TestAllExtensionsLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestAllExtensionsLite ThisMessage {

@@ -8881,6 +8909,10 @@
     public static TestAllExtensionsLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestAllExtensionsLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -8896,22 +8928,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestAllExtensionsLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestAllExtensionsLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestAllExtensionsLite result;

+      private bool resultIsReadOnly;

+      private TestAllExtensionsLite result;

       

       private TestAllExtensionsLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestAllExtensionsLite original = result;

           result = new TestAllExtensionsLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -8926,13 +8958,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestAllExtensionsLite();

-        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);

@@ -8944,11 +8976,11 @@
       }

       

       public override TestAllExtensionsLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -9012,7 +9044,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class OptionalGroup_extension_lite : pb::GeneratedMessageLite<OptionalGroup_extension_lite, OptionalGroup_extension_lite.Builder> {

-    private static readonly OptionalGroup_extension_lite defaultInstance = new Builder().BuildPartial();

+    private static readonly OptionalGroup_extension_lite defaultInstance = new OptionalGroup_extension_lite().MakeReadOnly();

     private static readonly string[] _optionalGroupExtensionLiteFieldNames = new string[] { "a" };

     private static readonly uint[] _optionalGroupExtensionLiteFieldTags = new uint[] { 136 };

     public static OptionalGroup_extension_lite DefaultInstance {

@@ -9020,7 +9052,7 @@
     }

     

     public override OptionalGroup_extension_lite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override OptionalGroup_extension_lite ThisMessage {

@@ -9115,6 +9147,10 @@
     public static OptionalGroup_extension_lite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private OptionalGroup_extension_lite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9130,22 +9166,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new OptionalGroup_extension_lite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(OptionalGroup_extension_lite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      OptionalGroup_extension_lite result;

+      private bool resultIsReadOnly;

+      private OptionalGroup_extension_lite result;

       

       private OptionalGroup_extension_lite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           OptionalGroup_extension_lite original = result;

           result = new OptionalGroup_extension_lite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9160,13 +9196,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new OptionalGroup_extension_lite();

-        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);

@@ -9178,11 +9214,11 @@
       }

       

       public override OptionalGroup_extension_lite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -9272,7 +9308,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class RepeatedGroup_extension_lite : pb::GeneratedMessageLite<RepeatedGroup_extension_lite, RepeatedGroup_extension_lite.Builder> {

-    private static readonly RepeatedGroup_extension_lite defaultInstance = new Builder().BuildPartial();

+    private static readonly RepeatedGroup_extension_lite defaultInstance = new RepeatedGroup_extension_lite().MakeReadOnly();

     private static readonly string[] _repeatedGroupExtensionLiteFieldNames = new string[] { "a" };

     private static readonly uint[] _repeatedGroupExtensionLiteFieldTags = new uint[] { 376 };

     public static RepeatedGroup_extension_lite DefaultInstance {

@@ -9280,7 +9316,7 @@
     }

     

     public override RepeatedGroup_extension_lite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override RepeatedGroup_extension_lite ThisMessage {

@@ -9375,6 +9411,10 @@
     public static RepeatedGroup_extension_lite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private RepeatedGroup_extension_lite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9390,22 +9430,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new RepeatedGroup_extension_lite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(RepeatedGroup_extension_lite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      RepeatedGroup_extension_lite result;

+      private bool resultIsReadOnly;

+      private RepeatedGroup_extension_lite result;

       

       private RepeatedGroup_extension_lite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           RepeatedGroup_extension_lite original = result;

           result = new RepeatedGroup_extension_lite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9420,13 +9460,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new RepeatedGroup_extension_lite();

-        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);

@@ -9438,11 +9478,11 @@
       }

       

       public override RepeatedGroup_extension_lite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -9532,7 +9572,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestPackedExtensionsLite : pb::ExtendableMessageLite<TestPackedExtensionsLite, TestPackedExtensionsLite.Builder> {

-    private static readonly TestPackedExtensionsLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestPackedExtensionsLite defaultInstance = new TestPackedExtensionsLite().MakeReadOnly();

     private static readonly string[] _testPackedExtensionsLiteFieldNames = new string[] {  };

     private static readonly uint[] _testPackedExtensionsLiteFieldTags = new uint[] {  };

     public static TestPackedExtensionsLite DefaultInstance {

@@ -9540,7 +9580,7 @@
     }

     

     public override TestPackedExtensionsLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestPackedExtensionsLite ThisMessage {

@@ -9623,6 +9663,10 @@
     public static TestPackedExtensionsLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestPackedExtensionsLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9638,22 +9682,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestPackedExtensionsLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestPackedExtensionsLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestPackedExtensionsLite result;

+      private bool resultIsReadOnly;

+      private TestPackedExtensionsLite result;

       

       private TestPackedExtensionsLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestPackedExtensionsLite original = result;

           result = new TestPackedExtensionsLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9668,13 +9712,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestPackedExtensionsLite();

-        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);

@@ -9686,11 +9730,11 @@
       }

       

       public override TestPackedExtensionsLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -9754,7 +9798,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestUnpackedExtensionsLite : pb::ExtendableMessageLite<TestUnpackedExtensionsLite, TestUnpackedExtensionsLite.Builder> {

-    private static readonly TestUnpackedExtensionsLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestUnpackedExtensionsLite defaultInstance = new TestUnpackedExtensionsLite().MakeReadOnly();

     private static readonly string[] _testUnpackedExtensionsLiteFieldNames = new string[] {  };

     private static readonly uint[] _testUnpackedExtensionsLiteFieldTags = new uint[] {  };

     public static TestUnpackedExtensionsLite DefaultInstance {

@@ -9762,7 +9806,7 @@
     }

     

     public override TestUnpackedExtensionsLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestUnpackedExtensionsLite ThisMessage {

@@ -9845,6 +9889,10 @@
     public static TestUnpackedExtensionsLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestUnpackedExtensionsLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -9860,22 +9908,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestUnpackedExtensionsLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestUnpackedExtensionsLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestUnpackedExtensionsLite result;

+      private bool resultIsReadOnly;

+      private TestUnpackedExtensionsLite result;

       

       private TestUnpackedExtensionsLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestUnpackedExtensionsLite original = result;

           result = new TestUnpackedExtensionsLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -9890,13 +9938,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestUnpackedExtensionsLite();

-        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);

@@ -9908,11 +9956,11 @@
       }

       

       public override TestUnpackedExtensionsLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -9976,7 +10024,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestNestedExtensionLite : pb::GeneratedMessageLite<TestNestedExtensionLite, TestNestedExtensionLite.Builder> {

-    private static readonly TestNestedExtensionLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestNestedExtensionLite defaultInstance = new TestNestedExtensionLite().MakeReadOnly();

     private static readonly string[] _testNestedExtensionLiteFieldNames = new string[] {  };

     private static readonly uint[] _testNestedExtensionLiteFieldTags = new uint[] {  };

     public static TestNestedExtensionLite DefaultInstance {

@@ -9984,7 +10032,7 @@
     }

     

     public override TestNestedExtensionLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestNestedExtensionLite ThisMessage {

@@ -10062,6 +10110,10 @@
     public static TestNestedExtensionLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestNestedExtensionLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -10077,22 +10129,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestNestedExtensionLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestNestedExtensionLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestNestedExtensionLite result;

+      private bool resultIsReadOnly;

+      private TestNestedExtensionLite result;

       

       private TestNestedExtensionLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestNestedExtensionLite original = result;

           result = new TestNestedExtensionLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -10107,13 +10159,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestNestedExtensionLite();

-        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);

@@ -10125,11 +10177,11 @@
       }

       

       public override TestNestedExtensionLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

@@ -10192,7 +10244,7 @@
   [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class TestDeprecatedLite : pb::GeneratedMessageLite<TestDeprecatedLite, TestDeprecatedLite.Builder> {

-    private static readonly TestDeprecatedLite defaultInstance = new Builder().BuildPartial();

+    private static readonly TestDeprecatedLite defaultInstance = new TestDeprecatedLite().MakeReadOnly();

     private static readonly string[] _testDeprecatedLiteFieldNames = new string[] { "deprecated_field" };

     private static readonly uint[] _testDeprecatedLiteFieldTags = new uint[] { 8 };

     public static TestDeprecatedLite DefaultInstance {

@@ -10200,7 +10252,7 @@
     }

     

     public override TestDeprecatedLite DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override TestDeprecatedLite ThisMessage {

@@ -10295,6 +10347,10 @@
     public static TestDeprecatedLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

       return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();

     }

+    private TestDeprecatedLite MakeReadOnly() {

+      return this;

+    }

+    

     public static Builder CreateBuilder() { return new Builder(); }

     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

@@ -10310,22 +10366,22 @@
         get { return this; }

       }

       public Builder() {

-        result = DefaultInstance ?? new TestDeprecatedLite();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(TestDeprecatedLite cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      TestDeprecatedLite result;

+      private bool resultIsReadOnly;

+      private TestDeprecatedLite result;

       

       private TestDeprecatedLite PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           TestDeprecatedLite original = result;

           result = new TestDeprecatedLite();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

@@ -10340,13 +10396,13 @@
       }

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new TestDeprecatedLite();

-        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);

@@ -10358,11 +10414,11 @@
       }

       

       public override TestDeprecatedLite BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

       public override Builder MergeFrom(pb::IMessageLite other) {

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) {