First pass at implementation and testing of reusable builders.
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
index 3d818a6..c0e5334 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
@@ -261,7 +261,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestXmlChild prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -271,21 +271,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestXmlChild();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestXmlChild cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestXmlChild result = new TestXmlChild();

+      bool builderIsReadOnly;

+      TestXmlChild result;

+      

+      private TestXmlChild PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestXmlChild original = result;

+          result = new TestXmlChild();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestXmlChild MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestXmlChild();

+        result = DefaultInstance ?? new TestXmlChild();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -297,13 +324,12 @@
       }

       

       public override TestXmlChild BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.options_.MakeReadOnly();

-        TestXmlChild returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -317,6 +343,7 @@
       

       public override Builder MergeFrom(TestXmlChild other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.options_.Count != 0) {

           base.AddRange(other.options_, result.options_);

         }

@@ -332,6 +359,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -394,7 +422,7 @@
       

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> OptionsList {

-        get { return result.options_; }

+        get { return PrepareBuilder().options_; }

       }

       public int OptionsCount {

         get { return result.OptionsCount; }

@@ -403,18 +431,22 @@
         return result.GetOptions(index);

       }

       public Builder SetOptions(int index, global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {

+        PrepareBuilder();

         result.options_[index] = value;

         return this;

       }

       public Builder AddOptions(global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {

+        PrepareBuilder();

         result.options_.Add(value);

         return this;

       }

       public Builder AddRangeOptions(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.EnumOptions> values) {

+        PrepareBuilder();

         base.AddRange(values, result.options_);

         return this;

       }

       public Builder ClearOptions() {

+        PrepareBuilder();

         result.options_.Clear();

         return this;

       }

@@ -428,11 +460,13 @@
       }

       public Builder SetBinary(pb::ByteString value) {

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

+        PrepareBuilder();

         result.hasBinary = true;

         result.binary_ = value;

         return this;

       }

       public Builder ClearBinary() {

+        PrepareBuilder();

         result.hasBinary = false;

         result.binary_ = pb::ByteString.Empty;

         return this;

@@ -529,7 +563,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestXmlNoFields prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -539,21 +573,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestXmlNoFields();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestXmlNoFields cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestXmlNoFields result = new TestXmlNoFields();

+      bool builderIsReadOnly;

+      TestXmlNoFields result;

+      

+      private TestXmlNoFields PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestXmlNoFields original = result;

+          result = new TestXmlNoFields();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestXmlNoFields MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestXmlNoFields();

+        result = DefaultInstance ?? new TestXmlNoFields();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -565,12 +626,11 @@
       }

       

       public override TestXmlNoFields BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestXmlNoFields returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -584,6 +644,7 @@
       

       public override Builder MergeFrom(TestXmlNoFields other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -593,6 +654,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -743,7 +805,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestXmlRescursive prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -753,21 +815,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestXmlRescursive();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestXmlRescursive cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestXmlRescursive result = new TestXmlRescursive();

+      bool builderIsReadOnly;

+      TestXmlRescursive result;

+      

+      private TestXmlRescursive PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestXmlRescursive original = result;

+          result = new TestXmlRescursive();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestXmlRescursive MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestXmlRescursive();

+        result = DefaultInstance ?? new TestXmlRescursive();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -779,12 +868,11 @@
       }

       

       public override TestXmlRescursive BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestXmlRescursive returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -798,6 +886,7 @@
       

       public override Builder MergeFrom(TestXmlRescursive other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasChild) {

           MergeChild(other.Child);

         }

@@ -810,6 +899,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -871,18 +961,21 @@
       }

       public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive value) {

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

+        PrepareBuilder();

         result.hasChild = true;

         result.child_ = value;

         return this;

       }

       public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasChild = true;

         result.child_ = builderForValue.Build();

         return this;

       }

       public Builder MergeChild(global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive value) {

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

+        PrepareBuilder();

         if (result.hasChild &&

             result.child_ != global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance) {

             result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.CreateBuilder(result.child_).MergeFrom(value).BuildPartial();

@@ -893,6 +986,7 @@
         return this;

       }

       public Builder ClearChild() {

+        PrepareBuilder();

         result.hasChild = false;

         result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance;

         return this;

@@ -1062,7 +1156,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

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

         public static Builder CreateBuilder(Children prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

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

@@ -1072,21 +1166,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new Children();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(Children cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          Children result = new Children();

+          bool builderIsReadOnly;

+          Children result;

+          

+          private Children PrepareBuilder() {

+            if (builderIsReadOnly) {

+              Children original = result;

+              result = new Children();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override Children MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new Children();

+            result = DefaultInstance ?? new Children();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

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

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

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

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -1098,13 +1219,12 @@
           }

           

           public override Children BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

             result.options_.MakeReadOnly();

-            Children returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

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

@@ -1118,6 +1238,7 @@
           

           public override Builder MergeFrom(Children other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.options_.Count != 0) {

               base.AddRange(other.options_, result.options_);

             }

@@ -1133,6 +1254,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1195,7 +1317,7 @@
           

           

           public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> OptionsList {

-            get { return result.options_; }

+            get { return PrepareBuilder().options_; }

           }

           public int OptionsCount {

             get { return result.OptionsCount; }

@@ -1204,18 +1326,22 @@
             return result.GetOptions(index);

           }

           public Builder SetOptions(int index, global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {

+            PrepareBuilder();

             result.options_[index] = value;

             return this;

           }

           public Builder AddOptions(global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {

+            PrepareBuilder();

             result.options_.Add(value);

             return this;

           }

           public Builder AddRangeOptions(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.EnumOptions> values) {

+            PrepareBuilder();

             base.AddRange(values, result.options_);

             return this;

           }

           public Builder ClearOptions() {

+            PrepareBuilder();

             result.options_.Clear();

             return this;

           }

@@ -1229,11 +1355,13 @@
           }

           public Builder SetBinary(pb::ByteString value) {

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

+            PrepareBuilder();

             result.hasBinary = true;

             result.binary_ = value;

             return this;

           }

           public Builder ClearBinary() {

+            PrepareBuilder();

             result.hasBinary = false;

             result.binary_ = pb::ByteString.Empty;

             return this;

@@ -1438,7 +1566,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestXmlMessage prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -1448,21 +1576,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestXmlMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestXmlMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestXmlMessage result = new TestXmlMessage();

+      bool builderIsReadOnly;

+      TestXmlMessage result;

+      

+      private TestXmlMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestXmlMessage original = result;

+          result = new TestXmlMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestXmlMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestXmlMessage();

+        result = DefaultInstance ?? new TestXmlMessage();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1474,15 +1629,14 @@
       }

       

       public override TestXmlMessage BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

         result.numbers_.MakeReadOnly();

         result.textlines_.MakeReadOnly();

         result.children_.MakeReadOnly();

-        TestXmlMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -1496,6 +1650,7 @@
       

       public override Builder MergeFrom(TestXmlMessage other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasNumber) {

           Number = other.Number;

         }

@@ -1527,6 +1682,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1612,18 +1768,20 @@
         set { SetNumber(value); }

       }

       public Builder SetNumber(long value) {

+        PrepareBuilder();

         result.hasNumber = true;

         result.number_ = value;

         return this;

       }

       public Builder ClearNumber() {

+        PrepareBuilder();

         result.hasNumber = false;

         result.number_ = 0L;

         return this;

       }

       

       public pbc::IPopsicleList<int> NumbersList {

-        get { return result.numbers_; }

+        get { return PrepareBuilder().numbers_; }

       }

       public int NumbersCount {

         get { return result.NumbersCount; }

@@ -1632,18 +1790,22 @@
         return result.GetNumbers(index);

       }

       public Builder SetNumbers(int index, int value) {

+        PrepareBuilder();

         result.numbers_[index] = value;

         return this;

       }

       public Builder AddNumbers(int value) {

+        PrepareBuilder();

         result.numbers_.Add(value);

         return this;

       }

       public Builder AddRangeNumbers(scg::IEnumerable<int> values) {

+        PrepareBuilder();

         base.AddRange(values, result.numbers_);

         return this;

       }

       public Builder ClearNumbers() {

+        PrepareBuilder();

         result.numbers_.Clear();

         return this;

       }

@@ -1657,18 +1819,20 @@
       }

       public Builder SetText(string value) {

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

+        PrepareBuilder();

         result.hasText = true;

         result.text_ = value;

         return this;

       }

       public Builder ClearText() {

+        PrepareBuilder();

         result.hasText = false;

         result.text_ = "";

         return this;

       }

       

       public pbc::IPopsicleList<string> TextlinesList {

-        get { return result.textlines_; }

+        get { return PrepareBuilder().textlines_; }

       }

       public int TextlinesCount {

         get { return result.TextlinesCount; }

@@ -1678,19 +1842,23 @@
       }

       public Builder SetTextlines(int index, string value) {

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

+        PrepareBuilder();

         result.textlines_[index] = value;

         return this;

       }

       public Builder AddTextlines(string value) {

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

+        PrepareBuilder();

         result.textlines_.Add(value);

         return this;

       }

       public Builder AddRangeTextlines(scg::IEnumerable<string> values) {

+        PrepareBuilder();

         base.AddRange(values, result.textlines_);

         return this;

       }

       public Builder ClearTextlines() {

+        PrepareBuilder();

         result.textlines_.Clear();

         return this;

       }

@@ -1703,11 +1871,13 @@
         set { SetValid(value); }

       }

       public Builder SetValid(bool value) {

+        PrepareBuilder();

         result.hasValid = true;

         result.valid_ = value;

         return this;

       }

       public Builder ClearValid() {

+        PrepareBuilder();

         result.hasValid = false;

         result.valid_ = false;

         return this;

@@ -1722,18 +1892,21 @@
       }

       public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild value) {

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

+        PrepareBuilder();

         result.hasChild = true;

         result.child_ = value;

         return this;

       }

       public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasChild = true;

         result.child_ = builderForValue.Build();

         return this;

       }

       public Builder MergeChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild value) {

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

+        PrepareBuilder();

         if (result.hasChild &&

             result.child_ != global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance) {

             result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.CreateBuilder(result.child_).MergeFrom(value).BuildPartial();

@@ -1744,13 +1917,14 @@
         return this;

       }

       public Builder ClearChild() {

+        PrepareBuilder();

         result.hasChild = false;

         result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance;

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children> ChildrenList {

-        get { return result.children_; }

+        get { return PrepareBuilder().children_; }

       }

       public int ChildrenCount {

         get { return result.ChildrenCount; }

@@ -1760,29 +1934,35 @@
       }

       public Builder SetChildren(int index, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children value) {

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

+        PrepareBuilder();

         result.children_[index] = value;

         return this;

       }

       public Builder SetChildren(int index, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder builderForValue) {

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

+        PrepareBuilder();

         result.children_[index] = builderForValue.Build();

         return this;

       }

       public Builder AddChildren(global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children value) {

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

+        PrepareBuilder();

         result.children_.Add(value);

         return this;

       }

       public Builder AddChildren(global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder builderForValue) {

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

+        PrepareBuilder();

         result.children_.Add(builderForValue.Build());

         return this;

       }

       public Builder AddRangeChildren(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children> values) {

+        PrepareBuilder();

         base.AddRange(values, result.children_);

         return this;

       }

       public Builder ClearChildren() {

+        PrepareBuilder();

         result.children_.Clear();

         return this;

       }

@@ -1895,7 +2075,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(TestXmlExtension prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

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

@@ -1905,21 +2085,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestXmlExtension();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestXmlExtension cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestXmlExtension result = new TestXmlExtension();

+      bool builderIsReadOnly;

+      TestXmlExtension result;

+      

+      private TestXmlExtension PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestXmlExtension original = result;

+          result = new TestXmlExtension();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestXmlExtension MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestXmlExtension();

+        result = DefaultInstance ?? new TestXmlExtension();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

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

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

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

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1931,12 +2138,11 @@
       }

       

       public override TestXmlExtension BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestXmlExtension returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -1950,6 +2156,7 @@
       

       public override Builder MergeFrom(TestXmlExtension other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasNumber) {

           Number = other.Number;

         }

@@ -1962,6 +2169,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2017,11 +2225,13 @@
         set { SetNumber(value); }

       }

       public Builder SetNumber(int value) {

+        PrepareBuilder();

         result.hasNumber = true;

         result.number_ = value;

         return this;

       }

       public Builder ClearNumber() {

+        PrepareBuilder();

         result.hasNumber = false;

         result.number_ = 0;

         return this;