Regenerated code with changes
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) {