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