First pass at implementation and testing of reusable builders.
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
index 918be64..379a86f 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
@@ -885,7 +885,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(SpeedMessage1 prototype) {

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

+      return new Builder(prototype);

     }

     

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

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

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new SpeedMessage1();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(SpeedMessage1 cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      SpeedMessage1 result = new SpeedMessage1();

+      bool builderIsReadOnly;

+      SpeedMessage1 result;

+      

+      private SpeedMessage1 PrepareBuilder() {

+        if (builderIsReadOnly) {

+          SpeedMessage1 original = result;

+          result = new SpeedMessage1();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override SpeedMessage1 MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new SpeedMessage1();

+        result = DefaultInstance ?? new SpeedMessage1();

+        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 {

@@ -921,13 +948,12 @@
       }

       

       public override SpeedMessage1 BuildPartial() {

-        if (result == null) {

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

+        if (builderIsReadOnly) {

+          return result;

         }

         result.field5_.MakeReadOnly();

-        SpeedMessage1 returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -941,6 +967,7 @@
       

       public override Builder MergeFrom(SpeedMessage1 other) {

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

+        PrepareBuilder();

         if (other.HasField1) {

           Field1 = other.Field1;

         }

@@ -1073,6 +1100,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1295,11 +1323,13 @@
       }

       public Builder SetField1(string value) {

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

+        PrepareBuilder();

         result.hasField1 = true;

         result.field1_ = value;

         return this;

       }

       public Builder ClearField1() {

+        PrepareBuilder();

         result.hasField1 = false;

         result.field1_ = "";

         return this;

@@ -1314,11 +1344,13 @@
       }

       public Builder SetField9(string value) {

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

+        PrepareBuilder();

         result.hasField9 = true;

         result.field9_ = value;

         return this;

       }

       public Builder ClearField9() {

+        PrepareBuilder();

         result.hasField9 = false;

         result.field9_ = "";

         return this;

@@ -1333,11 +1365,13 @@
       }

       public Builder SetField18(string value) {

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

+        PrepareBuilder();

         result.hasField18 = true;

         result.field18_ = value;

         return this;

       }

       public Builder ClearField18() {

+        PrepareBuilder();

         result.hasField18 = false;

         result.field18_ = "";

         return this;

@@ -1351,11 +1385,13 @@
         set { SetField80(value); }

       }

       public Builder SetField80(bool value) {

+        PrepareBuilder();

         result.hasField80 = true;

         result.field80_ = value;

         return this;

       }

       public Builder ClearField80() {

+        PrepareBuilder();

         result.hasField80 = false;

         result.field80_ = false;

         return this;

@@ -1369,11 +1405,13 @@
         set { SetField81(value); }

       }

       public Builder SetField81(bool value) {

+        PrepareBuilder();

         result.hasField81 = true;

         result.field81_ = value;

         return this;

       }

       public Builder ClearField81() {

+        PrepareBuilder();

         result.hasField81 = false;

         result.field81_ = true;

         return this;

@@ -1387,11 +1425,13 @@
         set { SetField2(value); }

       }

       public Builder SetField2(int value) {

+        PrepareBuilder();

         result.hasField2 = true;

         result.field2_ = value;

         return this;

       }

       public Builder ClearField2() {

+        PrepareBuilder();

         result.hasField2 = false;

         result.field2_ = 0;

         return this;

@@ -1405,11 +1445,13 @@
         set { SetField3(value); }

       }

       public Builder SetField3(int value) {

+        PrepareBuilder();

         result.hasField3 = true;

         result.field3_ = value;

         return this;

       }

       public Builder ClearField3() {

+        PrepareBuilder();

         result.hasField3 = false;

         result.field3_ = 0;

         return this;

@@ -1423,11 +1465,13 @@
         set { SetField280(value); }

       }

       public Builder SetField280(int value) {

+        PrepareBuilder();

         result.hasField280 = true;

         result.field280_ = value;

         return this;

       }

       public Builder ClearField280() {

+        PrepareBuilder();

         result.hasField280 = false;

         result.field280_ = 0;

         return this;

@@ -1441,11 +1485,13 @@
         set { SetField6(value); }

       }

       public Builder SetField6(int value) {

+        PrepareBuilder();

         result.hasField6 = true;

         result.field6_ = value;

         return this;

       }

       public Builder ClearField6() {

+        PrepareBuilder();

         result.hasField6 = false;

         result.field6_ = 0;

         return this;

@@ -1459,11 +1505,13 @@
         set { SetField22(value); }

       }

       public Builder SetField22(long value) {

+        PrepareBuilder();

         result.hasField22 = true;

         result.field22_ = value;

         return this;

       }

       public Builder ClearField22() {

+        PrepareBuilder();

         result.hasField22 = false;

         result.field22_ = 0L;

         return this;

@@ -1478,11 +1526,13 @@
       }

       public Builder SetField4(string value) {

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

+        PrepareBuilder();

         result.hasField4 = true;

         result.field4_ = value;

         return this;

       }

       public Builder ClearField4() {

+        PrepareBuilder();

         result.hasField4 = false;

         result.field4_ = "";

         return this;

@@ -1490,7 +1540,7 @@
       

       [global::System.CLSCompliant(false)]

       public pbc::IPopsicleList<ulong> Field5List {

-        get { return result.field5_; }

+        get { return PrepareBuilder().field5_; }

       }

       public int Field5Count {

         get { return result.Field5Count; }

@@ -1501,20 +1551,24 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetField5(int index, ulong value) {

+        PrepareBuilder();

         result.field5_[index] = value;

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddField5(ulong value) {

+        PrepareBuilder();

         result.field5_.Add(value);

         return this;

       }

       [global::System.CLSCompliant(false)]

       public Builder AddRangeField5(scg::IEnumerable<ulong> values) {

+        PrepareBuilder();

         base.AddRange(values, result.field5_);

         return this;

       }

       public Builder ClearField5() {

+        PrepareBuilder();

         result.field5_.Clear();

         return this;

       }

@@ -1527,11 +1581,13 @@
         set { SetField59(value); }

       }

       public Builder SetField59(bool value) {

+        PrepareBuilder();

         result.hasField59 = true;

         result.field59_ = value;

         return this;

       }

       public Builder ClearField59() {

+        PrepareBuilder();

         result.hasField59 = false;

         result.field59_ = false;

         return this;

@@ -1546,11 +1602,13 @@
       }

       public Builder SetField7(string value) {

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

+        PrepareBuilder();

         result.hasField7 = true;

         result.field7_ = value;

         return this;

       }

       public Builder ClearField7() {

+        PrepareBuilder();

         result.hasField7 = false;

         result.field7_ = "";

         return this;

@@ -1564,11 +1622,13 @@
         set { SetField16(value); }

       }

       public Builder SetField16(int value) {

+        PrepareBuilder();

         result.hasField16 = true;

         result.field16_ = value;

         return this;

       }

       public Builder ClearField16() {

+        PrepareBuilder();

         result.hasField16 = false;

         result.field16_ = 0;

         return this;

@@ -1582,11 +1642,13 @@
         set { SetField130(value); }

       }

       public Builder SetField130(int value) {

+        PrepareBuilder();

         result.hasField130 = true;

         result.field130_ = value;

         return this;

       }

       public Builder ClearField130() {

+        PrepareBuilder();

         result.hasField130 = false;

         result.field130_ = 0;

         return this;

@@ -1600,11 +1662,13 @@
         set { SetField12(value); }

       }

       public Builder SetField12(bool value) {

+        PrepareBuilder();

         result.hasField12 = true;

         result.field12_ = value;

         return this;

       }

       public Builder ClearField12() {

+        PrepareBuilder();

         result.hasField12 = false;

         result.field12_ = true;

         return this;

@@ -1618,11 +1682,13 @@
         set { SetField17(value); }

       }

       public Builder SetField17(bool value) {

+        PrepareBuilder();

         result.hasField17 = true;

         result.field17_ = value;

         return this;

       }

       public Builder ClearField17() {

+        PrepareBuilder();

         result.hasField17 = false;

         result.field17_ = true;

         return this;

@@ -1636,11 +1702,13 @@
         set { SetField13(value); }

       }

       public Builder SetField13(bool value) {

+        PrepareBuilder();

         result.hasField13 = true;

         result.field13_ = value;

         return this;

       }

       public Builder ClearField13() {

+        PrepareBuilder();

         result.hasField13 = false;

         result.field13_ = true;

         return this;

@@ -1654,11 +1722,13 @@
         set { SetField14(value); }

       }

       public Builder SetField14(bool value) {

+        PrepareBuilder();

         result.hasField14 = true;

         result.field14_ = value;

         return this;

       }

       public Builder ClearField14() {

+        PrepareBuilder();

         result.hasField14 = false;

         result.field14_ = true;

         return this;

@@ -1672,11 +1742,13 @@
         set { SetField104(value); }

       }

       public Builder SetField104(int value) {

+        PrepareBuilder();

         result.hasField104 = true;

         result.field104_ = value;

         return this;

       }

       public Builder ClearField104() {

+        PrepareBuilder();

         result.hasField104 = false;

         result.field104_ = 0;

         return this;

@@ -1690,11 +1762,13 @@
         set { SetField100(value); }

       }

       public Builder SetField100(int value) {

+        PrepareBuilder();

         result.hasField100 = true;

         result.field100_ = value;

         return this;

       }

       public Builder ClearField100() {

+        PrepareBuilder();

         result.hasField100 = false;

         result.field100_ = 0;

         return this;

@@ -1708,11 +1782,13 @@
         set { SetField101(value); }

       }

       public Builder SetField101(int value) {

+        PrepareBuilder();

         result.hasField101 = true;

         result.field101_ = value;

         return this;

       }

       public Builder ClearField101() {

+        PrepareBuilder();

         result.hasField101 = false;

         result.field101_ = 0;

         return this;

@@ -1727,11 +1803,13 @@
       }

       public Builder SetField102(string value) {

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

+        PrepareBuilder();

         result.hasField102 = true;

         result.field102_ = value;

         return this;

       }

       public Builder ClearField102() {

+        PrepareBuilder();

         result.hasField102 = false;

         result.field102_ = "";

         return this;

@@ -1746,11 +1824,13 @@
       }

       public Builder SetField103(string value) {

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

+        PrepareBuilder();

         result.hasField103 = true;

         result.field103_ = value;

         return this;

       }

       public Builder ClearField103() {

+        PrepareBuilder();

         result.hasField103 = false;

         result.field103_ = "";

         return this;

@@ -1764,11 +1844,13 @@
         set { SetField29(value); }

       }

       public Builder SetField29(int value) {

+        PrepareBuilder();

         result.hasField29 = true;

         result.field29_ = value;

         return this;

       }

       public Builder ClearField29() {

+        PrepareBuilder();

         result.hasField29 = false;

         result.field29_ = 0;

         return this;

@@ -1782,11 +1864,13 @@
         set { SetField30(value); }

       }

       public Builder SetField30(bool value) {

+        PrepareBuilder();

         result.hasField30 = true;

         result.field30_ = value;

         return this;

       }

       public Builder ClearField30() {

+        PrepareBuilder();

         result.hasField30 = false;

         result.field30_ = false;

         return this;

@@ -1800,11 +1884,13 @@
         set { SetField60(value); }

       }

       public Builder SetField60(int value) {

+        PrepareBuilder();

         result.hasField60 = true;

         result.field60_ = value;

         return this;

       }

       public Builder ClearField60() {

+        PrepareBuilder();

         result.hasField60 = false;

         result.field60_ = -1;

         return this;

@@ -1818,11 +1904,13 @@
         set { SetField271(value); }

       }

       public Builder SetField271(int value) {

+        PrepareBuilder();

         result.hasField271 = true;

         result.field271_ = value;

         return this;

       }

       public Builder ClearField271() {

+        PrepareBuilder();

         result.hasField271 = false;

         result.field271_ = -1;

         return this;

@@ -1836,11 +1924,13 @@
         set { SetField272(value); }

       }

       public Builder SetField272(int value) {

+        PrepareBuilder();

         result.hasField272 = true;

         result.field272_ = value;

         return this;

       }

       public Builder ClearField272() {

+        PrepareBuilder();

         result.hasField272 = false;

         result.field272_ = -1;

         return this;

@@ -1854,11 +1944,13 @@
         set { SetField150(value); }

       }

       public Builder SetField150(int value) {

+        PrepareBuilder();

         result.hasField150 = true;

         result.field150_ = value;

         return this;

       }

       public Builder ClearField150() {

+        PrepareBuilder();

         result.hasField150 = false;

         result.field150_ = 0;

         return this;

@@ -1872,11 +1964,13 @@
         set { SetField23(value); }

       }

       public Builder SetField23(int value) {

+        PrepareBuilder();

         result.hasField23 = true;

         result.field23_ = value;

         return this;

       }

       public Builder ClearField23() {

+        PrepareBuilder();

         result.hasField23 = false;

         result.field23_ = 0;

         return this;

@@ -1890,11 +1984,13 @@
         set { SetField24(value); }

       }

       public Builder SetField24(bool value) {

+        PrepareBuilder();

         result.hasField24 = true;

         result.field24_ = value;

         return this;

       }

       public Builder ClearField24() {

+        PrepareBuilder();

         result.hasField24 = false;

         result.field24_ = false;

         return this;

@@ -1908,11 +2004,13 @@
         set { SetField25(value); }

       }

       public Builder SetField25(int value) {

+        PrepareBuilder();

         result.hasField25 = true;

         result.field25_ = value;

         return this;

       }

       public Builder ClearField25() {

+        PrepareBuilder();

         result.hasField25 = false;

         result.field25_ = 0;

         return this;

@@ -1927,18 +2025,21 @@
       }

       public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {

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

+        PrepareBuilder();

         result.hasField15 = true;

         result.field15_ = value;

         return this;

       }

       public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder builderForValue) {

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

+        PrepareBuilder();

         result.hasField15 = true;

         result.field15_ = builderForValue.Build();

         return this;

       }

       public Builder MergeField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {

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

+        PrepareBuilder();

         if (result.hasField15 &&

             result.field15_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) {

             result.field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();

@@ -1949,6 +2050,7 @@
         return this;

       }

       public Builder ClearField15() {

+        PrepareBuilder();

         result.hasField15 = false;

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

         return this;

@@ -1962,11 +2064,13 @@
         set { SetField78(value); }

       }

       public Builder SetField78(bool value) {

+        PrepareBuilder();

         result.hasField78 = true;

         result.field78_ = value;

         return this;

       }

       public Builder ClearField78() {

+        PrepareBuilder();

         result.hasField78 = false;

         result.field78_ = false;

         return this;

@@ -1980,11 +2084,13 @@
         set { SetField67(value); }

       }

       public Builder SetField67(int value) {

+        PrepareBuilder();

         result.hasField67 = true;

         result.field67_ = value;

         return this;

       }

       public Builder ClearField67() {

+        PrepareBuilder();

         result.hasField67 = false;

         result.field67_ = 0;

         return this;

@@ -1998,11 +2104,13 @@
         set { SetField68(value); }

       }

       public Builder SetField68(int value) {

+        PrepareBuilder();

         result.hasField68 = true;

         result.field68_ = value;

         return this;

       }

       public Builder ClearField68() {

+        PrepareBuilder();

         result.hasField68 = false;

         result.field68_ = 0;

         return this;

@@ -2016,11 +2124,13 @@
         set { SetField128(value); }

       }

       public Builder SetField128(int value) {

+        PrepareBuilder();

         result.hasField128 = true;

         result.field128_ = value;

         return this;

       }

       public Builder ClearField128() {

+        PrepareBuilder();

         result.hasField128 = false;

         result.field128_ = 0;

         return this;

@@ -2035,11 +2145,13 @@
       }

       public Builder SetField129(string value) {

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

+        PrepareBuilder();

         result.hasField129 = true;

         result.field129_ = value;

         return this;

       }

       public Builder ClearField129() {

+        PrepareBuilder();

         result.hasField129 = false;

         result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";

         return this;

@@ -2053,11 +2165,13 @@
         set { SetField131(value); }

       }

       public Builder SetField131(int value) {

+        PrepareBuilder();

         result.hasField131 = true;

         result.field131_ = value;

         return this;

       }

       public Builder ClearField131() {

+        PrepareBuilder();

         result.hasField131 = false;

         result.field131_ = 0;

         return this;

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

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

     public static Builder CreateBuilder(SpeedMessage1SubMessage prototype) {

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

+      return new Builder(prototype);

     }

     

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

@@ -2488,21 +2602,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new SpeedMessage1SubMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(SpeedMessage1SubMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      SpeedMessage1SubMessage result = new SpeedMessage1SubMessage();

+      bool builderIsReadOnly;

+      SpeedMessage1SubMessage result;

+      

+      private SpeedMessage1SubMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          SpeedMessage1SubMessage original = result;

+          result = new SpeedMessage1SubMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override SpeedMessage1SubMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new SpeedMessage1SubMessage();

+        result = DefaultInstance ?? new SpeedMessage1SubMessage();

+        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 {

@@ -2514,12 +2655,11 @@
       }

       

       public override SpeedMessage1SubMessage BuildPartial() {

-        if (result == null) {

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

+        if (builderIsReadOnly) {

+          return result;

         }

-        SpeedMessage1SubMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -2533,6 +2673,7 @@
       

       public override Builder MergeFrom(SpeedMessage1SubMessage other) {

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

+        PrepareBuilder();

         if (other.HasField1) {

           Field1 = other.Field1;

         }

@@ -2602,6 +2743,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2733,11 +2875,13 @@
         set { SetField1(value); }

       }

       public Builder SetField1(int value) {

+        PrepareBuilder();

         result.hasField1 = true;

         result.field1_ = value;

         return this;

       }

       public Builder ClearField1() {

+        PrepareBuilder();

         result.hasField1 = false;

         result.field1_ = 0;

         return this;

@@ -2751,11 +2895,13 @@
         set { SetField2(value); }

       }

       public Builder SetField2(int value) {

+        PrepareBuilder();

         result.hasField2 = true;

         result.field2_ = value;

         return this;

       }

       public Builder ClearField2() {

+        PrepareBuilder();

         result.hasField2 = false;

         result.field2_ = 0;

         return this;

@@ -2769,11 +2915,13 @@
         set { SetField3(value); }

       }

       public Builder SetField3(int value) {

+        PrepareBuilder();

         result.hasField3 = true;

         result.field3_ = value;

         return this;

       }

       public Builder ClearField3() {

+        PrepareBuilder();

         result.hasField3 = false;

         result.field3_ = 0;

         return this;

@@ -2788,11 +2936,13 @@
       }

       public Builder SetField15(string value) {

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

+        PrepareBuilder();

         result.hasField15 = true;

         result.field15_ = value;

         return this;

       }

       public Builder ClearField15() {

+        PrepareBuilder();

         result.hasField15 = false;

         result.field15_ = "";

         return this;

@@ -2806,11 +2956,13 @@
         set { SetField12(value); }

       }

       public Builder SetField12(bool value) {

+        PrepareBuilder();

         result.hasField12 = true;

         result.field12_ = value;

         return this;

       }

       public Builder ClearField12() {

+        PrepareBuilder();

         result.hasField12 = false;

         result.field12_ = true;

         return this;

@@ -2824,11 +2976,13 @@
         set { SetField13(value); }

       }

       public Builder SetField13(long value) {

+        PrepareBuilder();

         result.hasField13 = true;

         result.field13_ = value;

         return this;

       }

       public Builder ClearField13() {

+        PrepareBuilder();

         result.hasField13 = false;

         result.field13_ = 0L;

         return this;

@@ -2842,11 +2996,13 @@
         set { SetField14(value); }

       }

       public Builder SetField14(long value) {

+        PrepareBuilder();

         result.hasField14 = true;

         result.field14_ = value;

         return this;

       }

       public Builder ClearField14() {

+        PrepareBuilder();

         result.hasField14 = false;

         result.field14_ = 0L;

         return this;

@@ -2860,11 +3016,13 @@
         set { SetField16(value); }

       }

       public Builder SetField16(int value) {

+        PrepareBuilder();

         result.hasField16 = true;

         result.field16_ = value;

         return this;

       }

       public Builder ClearField16() {

+        PrepareBuilder();

         result.hasField16 = false;

         result.field16_ = 0;

         return this;

@@ -2878,11 +3036,13 @@
         set { SetField19(value); }

       }

       public Builder SetField19(int value) {

+        PrepareBuilder();

         result.hasField19 = true;

         result.field19_ = value;

         return this;

       }

       public Builder ClearField19() {

+        PrepareBuilder();

         result.hasField19 = false;

         result.field19_ = 2;

         return this;

@@ -2896,11 +3056,13 @@
         set { SetField20(value); }

       }

       public Builder SetField20(bool value) {

+        PrepareBuilder();

         result.hasField20 = true;

         result.field20_ = value;

         return this;

       }

       public Builder ClearField20() {

+        PrepareBuilder();

         result.hasField20 = false;

         result.field20_ = true;

         return this;

@@ -2914,11 +3076,13 @@
         set { SetField28(value); }

       }

       public Builder SetField28(bool value) {

+        PrepareBuilder();

         result.hasField28 = true;

         result.field28_ = value;

         return this;

       }

       public Builder ClearField28() {

+        PrepareBuilder();

         result.hasField28 = false;

         result.field28_ = true;

         return this;

@@ -2934,11 +3098,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetField21(ulong value) {

+        PrepareBuilder();

         result.hasField21 = true;

         result.field21_ = value;

         return this;

       }

       public Builder ClearField21() {

+        PrepareBuilder();

         result.hasField21 = false;

         result.field21_ = 0;

         return this;

@@ -2952,11 +3118,13 @@
         set { SetField22(value); }

       }

       public Builder SetField22(int value) {

+        PrepareBuilder();

         result.hasField22 = true;

         result.field22_ = value;

         return this;

       }

       public Builder ClearField22() {

+        PrepareBuilder();

         result.hasField22 = false;

         result.field22_ = 0;

         return this;

@@ -2970,11 +3138,13 @@
         set { SetField23(value); }

       }

       public Builder SetField23(bool value) {

+        PrepareBuilder();

         result.hasField23 = true;

         result.field23_ = value;

         return this;

       }

       public Builder ClearField23() {

+        PrepareBuilder();

         result.hasField23 = false;

         result.field23_ = false;

         return this;

@@ -2988,11 +3158,13 @@
         set { SetField206(value); }

       }

       public Builder SetField206(bool value) {

+        PrepareBuilder();

         result.hasField206 = true;

         result.field206_ = value;

         return this;

       }

       public Builder ClearField206() {

+        PrepareBuilder();

         result.hasField206 = false;

         result.field206_ = false;

         return this;

@@ -3008,11 +3180,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetField203(uint value) {

+        PrepareBuilder();

         result.hasField203 = true;

         result.field203_ = value;

         return this;

       }

       public Builder ClearField203() {

+        PrepareBuilder();

         result.hasField203 = false;

         result.field203_ = 0;

         return this;

@@ -3026,11 +3200,13 @@
         set { SetField204(value); }

       }

       public Builder SetField204(int value) {

+        PrepareBuilder();

         result.hasField204 = true;

         result.field204_ = value;

         return this;

       }

       public Builder ClearField204() {

+        PrepareBuilder();

         result.hasField204 = false;

         result.field204_ = 0;

         return this;

@@ -3045,11 +3221,13 @@
       }

       public Builder SetField205(string value) {

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

+        PrepareBuilder();

         result.hasField205 = true;

         result.field205_ = value;

         return this;

       }

       public Builder ClearField205() {

+        PrepareBuilder();

         result.hasField205 = false;

         result.field205_ = "";

         return this;

@@ -3065,11 +3243,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetField207(ulong value) {

+        PrepareBuilder();

         result.hasField207 = true;

         result.field207_ = value;

         return this;

       }

       public Builder ClearField207() {

+        PrepareBuilder();

         result.hasField207 = false;

         result.field207_ = 0UL;

         return this;

@@ -3085,11 +3265,13 @@
       }

       [global::System.CLSCompliant(false)]

       public Builder SetField300(ulong value) {

+        PrepareBuilder();

         result.hasField300 = true;

         result.field300_ = value;

         return this;

       }

       public Builder ClearField300() {

+        PrepareBuilder();

         result.hasField300 = false;

         result.field300_ = 0UL;

         return this;

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

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

         public static Builder CreateBuilder(Group1 prototype) {

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

+          return new Builder(prototype);

         }

         

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

@@ -3508,21 +3690,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new Group1();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(Group1 cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          Group1 result = new Group1();

+          bool builderIsReadOnly;

+          Group1 result;

+          

+          private Group1 PrepareBuilder() {

+            if (builderIsReadOnly) {

+              Group1 original = result;

+              result = new Group1();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override Group1 MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new Group1();

+            result = DefaultInstance ?? new Group1();

+            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 {

@@ -3534,15 +3743,14 @@
           }

           

           public override Group1 BuildPartial() {

-            if (result == null) {

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

+            if (builderIsReadOnly) {

+              return result;

             }

             result.field14_.MakeReadOnly();

             result.field22_.MakeReadOnly();

             result.field73_.MakeReadOnly();

-            Group1 returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

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

@@ -3556,6 +3764,7 @@
           

           public override Builder MergeFrom(Group1 other) {

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

+            PrepareBuilder();

             if (other.HasField11) {

               Field11 = other.Field11;

             }

@@ -3613,6 +3822,7 @@
           }

           

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

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -3734,11 +3944,13 @@
             set { SetField11(value); }

           }

           public Builder SetField11(float value) {

+            PrepareBuilder();

             result.hasField11 = true;

             result.field11_ = value;

             return this;

           }

           public Builder ClearField11() {

+            PrepareBuilder();

             result.hasField11 = false;

             result.field11_ = 0F;

             return this;

@@ -3752,11 +3964,13 @@
             set { SetField26(value); }

           }

           public Builder SetField26(float value) {

+            PrepareBuilder();

             result.hasField26 = true;

             result.field26_ = value;

             return this;

           }

           public Builder ClearField26() {

+            PrepareBuilder();

             result.hasField26 = false;

             result.field26_ = 0F;

             return this;

@@ -3771,11 +3985,13 @@
           }

           public Builder SetField12(string value) {

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

+            PrepareBuilder();

             result.hasField12 = true;

             result.field12_ = value;

             return this;

           }

           public Builder ClearField12() {

+            PrepareBuilder();

             result.hasField12 = false;

             result.field12_ = "";

             return this;

@@ -3790,18 +4006,20 @@
           }

           public Builder SetField13(string value) {

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

+            PrepareBuilder();

             result.hasField13 = true;

             result.field13_ = value;

             return this;

           }

           public Builder ClearField13() {

+            PrepareBuilder();

             result.hasField13 = false;

             result.field13_ = "";

             return this;

           }

           

           public pbc::IPopsicleList<string> Field14List {

-            get { return result.field14_; }

+            get { return PrepareBuilder().field14_; }

           }

           public int Field14Count {

             get { return result.Field14Count; }

@@ -3811,19 +4029,23 @@
           }

           public Builder SetField14(int index, string value) {

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

+            PrepareBuilder();

             result.field14_[index] = value;

             return this;

           }

           public Builder AddField14(string value) {

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

+            PrepareBuilder();

             result.field14_.Add(value);

             return this;

           }

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

+            PrepareBuilder();

             base.AddRange(values, result.field14_);

             return this;

           }

           public Builder ClearField14() {

+            PrepareBuilder();

             result.field14_.Clear();

             return this;

           }

@@ -3838,11 +4060,13 @@
           }

           [global::System.CLSCompliant(false)]

           public Builder SetField15(ulong value) {

+            PrepareBuilder();

             result.hasField15 = true;

             result.field15_ = value;

             return this;

           }

           public Builder ClearField15() {

+            PrepareBuilder();

             result.hasField15 = false;

             result.field15_ = 0UL;

             return this;

@@ -3856,11 +4080,13 @@
             set { SetField5(value); }

           }

           public Builder SetField5(int value) {

+            PrepareBuilder();

             result.hasField5 = true;

             result.field5_ = value;

             return this;

           }

           public Builder ClearField5() {

+            PrepareBuilder();

             result.hasField5 = false;

             result.field5_ = 0;

             return this;

@@ -3875,11 +4101,13 @@
           }

           public Builder SetField27(string value) {

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

+            PrepareBuilder();

             result.hasField27 = true;

             result.field27_ = value;

             return this;

           }

           public Builder ClearField27() {

+            PrepareBuilder();

             result.hasField27 = false;

             result.field27_ = "";

             return this;

@@ -3893,11 +4121,13 @@
             set { SetField28(value); }

           }

           public Builder SetField28(int value) {

+            PrepareBuilder();

             result.hasField28 = true;

             result.field28_ = value;

             return this;

           }

           public Builder ClearField28() {

+            PrepareBuilder();

             result.hasField28 = false;

             result.field28_ = 0;

             return this;

@@ -3912,11 +4142,13 @@
           }

           public Builder SetField29(string value) {

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

+            PrepareBuilder();

             result.hasField29 = true;

             result.field29_ = value;

             return this;

           }

           public Builder ClearField29() {

+            PrepareBuilder();

             result.hasField29 = false;

             result.field29_ = "";

             return this;

@@ -3931,18 +4163,20 @@
           }

           public Builder SetField16(string value) {

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

+            PrepareBuilder();

             result.hasField16 = true;

             result.field16_ = value;

             return this;

           }

           public Builder ClearField16() {

+            PrepareBuilder();

             result.hasField16 = false;

             result.field16_ = "";

             return this;

           }

           

           public pbc::IPopsicleList<string> Field22List {

-            get { return result.field22_; }

+            get { return PrepareBuilder().field22_; }

           }

           public int Field22Count {

             get { return result.Field22Count; }

@@ -3952,25 +4186,29 @@
           }

           public Builder SetField22(int index, string value) {

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

+            PrepareBuilder();

             result.field22_[index] = value;

             return this;

           }

           public Builder AddField22(string value) {

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

+            PrepareBuilder();

             result.field22_.Add(value);

             return this;

           }

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

+            PrepareBuilder();

             base.AddRange(values, result.field22_);

             return this;

           }

           public Builder ClearField22() {

+            PrepareBuilder();

             result.field22_.Clear();

             return this;

           }

           

           public pbc::IPopsicleList<int> Field73List {

-            get { return result.field73_; }

+            get { return PrepareBuilder().field73_; }

           }

           public int Field73Count {

             get { return result.Field73Count; }

@@ -3979,18 +4217,22 @@
             return result.GetField73(index);

           }

           public Builder SetField73(int index, int value) {

+            PrepareBuilder();

             result.field73_[index] = value;

             return this;

           }

           public Builder AddField73(int value) {

+            PrepareBuilder();

             result.field73_.Add(value);

             return this;

           }

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

+            PrepareBuilder();

             base.AddRange(values, result.field73_);

             return this;

           }

           public Builder ClearField73() {

+            PrepareBuilder();

             result.field73_.Clear();

             return this;

           }

@@ -4003,11 +4245,13 @@
             set { SetField20(value); }

           }

           public Builder SetField20(int value) {

+            PrepareBuilder();

             result.hasField20 = true;

             result.field20_ = value;

             return this;

           }

           public Builder ClearField20() {

+            PrepareBuilder();

             result.hasField20 = false;

             result.field20_ = 0;

             return this;

@@ -4022,11 +4266,13 @@
           }

           public Builder SetField24(string value) {

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

+            PrepareBuilder();

             result.hasField24 = true;

             result.field24_ = value;

             return this;

           }

           public Builder ClearField24() {

+            PrepareBuilder();

             result.hasField24 = false;

             result.field24_ = "";

             return this;

@@ -4041,18 +4287,21 @@
           }

           public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {

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

+            PrepareBuilder();

             result.hasField31 = true;

             result.field31_ = value;

             return this;

           }

           public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder builderForValue) {

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

+            PrepareBuilder();

             result.hasField31 = true;

             result.field31_ = builderForValue.Build();

             return this;

           }

           public Builder MergeField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {

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

+            PrepareBuilder();

             if (result.hasField31 &&

                 result.field31_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) {

                 result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();

@@ -4063,6 +4312,7 @@
             return this;

           }

           public Builder ClearField31() {

+            PrepareBuilder();

             result.hasField31 = false;

             result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance;

             return this;

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

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

     public static Builder CreateBuilder(SpeedMessage2 prototype) {

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

+      return new Builder(prototype);

     }

     

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

@@ -4648,21 +4898,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new SpeedMessage2();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(SpeedMessage2 cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      SpeedMessage2 result = new SpeedMessage2();

+      bool builderIsReadOnly;

+      SpeedMessage2 result;

+      

+      private SpeedMessage2 PrepareBuilder() {

+        if (builderIsReadOnly) {

+          SpeedMessage2 original = result;

+          result = new SpeedMessage2();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override SpeedMessage2 MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new SpeedMessage2();

+        result = DefaultInstance ?? new SpeedMessage2();

+        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 {

@@ -4674,16 +4951,15 @@
       }

       

       public override SpeedMessage2 BuildPartial() {

-        if (result == null) {

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

+        if (builderIsReadOnly) {

+          return result;

         }

         result.group1_.MakeReadOnly();

         result.field128_.MakeReadOnly();

         result.field127_.MakeReadOnly();

         result.field130_.MakeReadOnly();

-        SpeedMessage2 returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -4697,6 +4973,7 @@
       

       public override Builder MergeFrom(SpeedMessage2 other) {

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

+        PrepareBuilder();

         if (other.HasField1) {

           Field1 = other.Field1;

         }

@@ -4796,6 +5073,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -4969,11 +5247,13 @@
       }

       public Builder SetField1(string value) {

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

+        PrepareBuilder();

         result.hasField1 = true;

         result.field1_ = value;

         return this;

       }

       public Builder ClearField1() {

+        PrepareBuilder();

         result.hasField1 = false;

         result.field1_ = "";

         return this;

@@ -4987,11 +5267,13 @@
         set { SetField3(value); }

       }

       public Builder SetField3(long value) {

+        PrepareBuilder();

         result.hasField3 = true;

         result.field3_ = value;

         return this;

       }

       public Builder ClearField3() {

+        PrepareBuilder();

         result.hasField3 = false;

         result.field3_ = 0L;

         return this;

@@ -5005,11 +5287,13 @@
         set { SetField4(value); }

       }

       public Builder SetField4(long value) {

+        PrepareBuilder();

         result.hasField4 = true;

         result.field4_ = value;

         return this;

       }

       public Builder ClearField4() {

+        PrepareBuilder();

         result.hasField4 = false;

         result.field4_ = 0L;

         return this;

@@ -5023,11 +5307,13 @@
         set { SetField30(value); }

       }

       public Builder SetField30(long value) {

+        PrepareBuilder();

         result.hasField30 = true;

         result.field30_ = value;

         return this;

       }

       public Builder ClearField30() {

+        PrepareBuilder();

         result.hasField30 = false;

         result.field30_ = 0L;

         return this;

@@ -5041,11 +5327,13 @@
         set { SetField75(value); }

       }

       public Builder SetField75(bool value) {

+        PrepareBuilder();

         result.hasField75 = true;

         result.field75_ = value;

         return this;

       }

       public Builder ClearField75() {

+        PrepareBuilder();

         result.hasField75 = false;

         result.field75_ = false;

         return this;

@@ -5060,11 +5348,13 @@
       }

       public Builder SetField6(string value) {

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

+        PrepareBuilder();

         result.hasField6 = true;

         result.field6_ = value;

         return this;

       }

       public Builder ClearField6() {

+        PrepareBuilder();

         result.hasField6 = false;

         result.field6_ = "";

         return this;

@@ -5079,11 +5369,13 @@
       }

       public Builder SetField2(pb::ByteString value) {

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

+        PrepareBuilder();

         result.hasField2 = true;

         result.field2_ = value;

         return this;

       }

       public Builder ClearField2() {

+        PrepareBuilder();

         result.hasField2 = false;

         result.field2_ = pb::ByteString.Empty;

         return this;

@@ -5097,11 +5389,13 @@
         set { SetField21(value); }

       }

       public Builder SetField21(int value) {

+        PrepareBuilder();

         result.hasField21 = true;

         result.field21_ = value;

         return this;

       }

       public Builder ClearField21() {

+        PrepareBuilder();

         result.hasField21 = false;

         result.field21_ = 0;

         return this;

@@ -5115,11 +5409,13 @@
         set { SetField71(value); }

       }

       public Builder SetField71(int value) {

+        PrepareBuilder();

         result.hasField71 = true;

         result.field71_ = value;

         return this;

       }

       public Builder ClearField71() {

+        PrepareBuilder();

         result.hasField71 = false;

         result.field71_ = 0;

         return this;

@@ -5133,11 +5429,13 @@
         set { SetField25(value); }

       }

       public Builder SetField25(float value) {

+        PrepareBuilder();

         result.hasField25 = true;

         result.field25_ = value;

         return this;

       }

       public Builder ClearField25() {

+        PrepareBuilder();

         result.hasField25 = false;

         result.field25_ = 0F;

         return this;

@@ -5151,11 +5449,13 @@
         set { SetField109(value); }

       }

       public Builder SetField109(int value) {

+        PrepareBuilder();

         result.hasField109 = true;

         result.field109_ = value;

         return this;

       }

       public Builder ClearField109() {

+        PrepareBuilder();

         result.hasField109 = false;

         result.field109_ = 0;

         return this;

@@ -5169,11 +5469,13 @@
         set { SetField210(value); }

       }

       public Builder SetField210(int value) {

+        PrepareBuilder();

         result.hasField210 = true;

         result.field210_ = value;

         return this;

       }

       public Builder ClearField210() {

+        PrepareBuilder();

         result.hasField210 = false;

         result.field210_ = 0;

         return this;

@@ -5187,11 +5489,13 @@
         set { SetField211(value); }

       }

       public Builder SetField211(int value) {

+        PrepareBuilder();

         result.hasField211 = true;

         result.field211_ = value;

         return this;

       }

       public Builder ClearField211() {

+        PrepareBuilder();

         result.hasField211 = false;

         result.field211_ = 0;

         return this;

@@ -5205,11 +5509,13 @@
         set { SetField212(value); }

       }

       public Builder SetField212(int value) {

+        PrepareBuilder();

         result.hasField212 = true;

         result.field212_ = value;

         return this;

       }

       public Builder ClearField212() {

+        PrepareBuilder();

         result.hasField212 = false;

         result.field212_ = 0;

         return this;

@@ -5223,11 +5529,13 @@
         set { SetField213(value); }

       }

       public Builder SetField213(int value) {

+        PrepareBuilder();

         result.hasField213 = true;

         result.field213_ = value;

         return this;

       }

       public Builder ClearField213() {

+        PrepareBuilder();

         result.hasField213 = false;

         result.field213_ = 0;

         return this;

@@ -5241,11 +5549,13 @@
         set { SetField216(value); }

       }

       public Builder SetField216(int value) {

+        PrepareBuilder();

         result.hasField216 = true;

         result.field216_ = value;

         return this;

       }

       public Builder ClearField216() {

+        PrepareBuilder();

         result.hasField216 = false;

         result.field216_ = 0;

         return this;

@@ -5259,11 +5569,13 @@
         set { SetField217(value); }

       }

       public Builder SetField217(int value) {

+        PrepareBuilder();

         result.hasField217 = true;

         result.field217_ = value;

         return this;

       }

       public Builder ClearField217() {

+        PrepareBuilder();

         result.hasField217 = false;

         result.field217_ = 0;

         return this;

@@ -5277,11 +5589,13 @@
         set { SetField218(value); }

       }

       public Builder SetField218(int value) {

+        PrepareBuilder();

         result.hasField218 = true;

         result.field218_ = value;

         return this;

       }

       public Builder ClearField218() {

+        PrepareBuilder();

         result.hasField218 = false;

         result.field218_ = 0;

         return this;

@@ -5295,11 +5609,13 @@
         set { SetField220(value); }

       }

       public Builder SetField220(int value) {

+        PrepareBuilder();

         result.hasField220 = true;

         result.field220_ = value;

         return this;

       }

       public Builder ClearField220() {

+        PrepareBuilder();

         result.hasField220 = false;

         result.field220_ = 0;

         return this;

@@ -5313,11 +5629,13 @@
         set { SetField221(value); }

       }

       public Builder SetField221(int value) {

+        PrepareBuilder();

         result.hasField221 = true;

         result.field221_ = value;

         return this;

       }

       public Builder ClearField221() {

+        PrepareBuilder();

         result.hasField221 = false;

         result.field221_ = 0;

         return this;

@@ -5331,11 +5649,13 @@
         set { SetField222(value); }

       }

       public Builder SetField222(float value) {

+        PrepareBuilder();

         result.hasField222 = true;

         result.field222_ = value;

         return this;

       }

       public Builder ClearField222() {

+        PrepareBuilder();

         result.hasField222 = false;

         result.field222_ = 0F;

         return this;

@@ -5349,18 +5669,20 @@
         set { SetField63(value); }

       }

       public Builder SetField63(int value) {

+        PrepareBuilder();

         result.hasField63 = true;

         result.field63_ = value;

         return this;

       }

       public Builder ClearField63() {

+        PrepareBuilder();

         result.hasField63 = false;

         result.field63_ = 0;

         return this;

       }

       

       public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {

-        get { return result.group1_; }

+        get { return PrepareBuilder().group1_; }

       }

       public int Group1Count {

         get { return result.Group1Count; }

@@ -5370,35 +5692,41 @@
       }

       public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {

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

+        PrepareBuilder();

         result.group1_[index] = value;

         return this;

       }

       public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {

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

+        PrepareBuilder();

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

         return this;

       }

       public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {

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

+        PrepareBuilder();

         result.group1_.Add(value);

         return this;

       }

       public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {

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

+        PrepareBuilder();

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

         return this;

       }

       public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> values) {

+        PrepareBuilder();

         base.AddRange(values, result.group1_);

         return this;

       }

       public Builder ClearGroup1() {

+        PrepareBuilder();

         result.group1_.Clear();

         return this;

       }

       

       public pbc::IPopsicleList<string> Field128List {

-        get { return result.field128_; }

+        get { return PrepareBuilder().field128_; }

       }

       public int Field128Count {

         get { return result.Field128Count; }

@@ -5408,19 +5736,23 @@
       }

       public Builder SetField128(int index, string value) {

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

+        PrepareBuilder();

         result.field128_[index] = value;

         return this;

       }

       public Builder AddField128(string value) {

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

+        PrepareBuilder();

         result.field128_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.field128_);

         return this;

       }

       public Builder ClearField128() {

+        PrepareBuilder();

         result.field128_.Clear();

         return this;

       }

@@ -5433,18 +5765,20 @@
         set { SetField131(value); }

       }

       public Builder SetField131(long value) {

+        PrepareBuilder();

         result.hasField131 = true;

         result.field131_ = value;

         return this;

       }

       public Builder ClearField131() {

+        PrepareBuilder();

         result.hasField131 = false;

         result.field131_ = 0L;

         return this;

       }

       

       public pbc::IPopsicleList<string> Field127List {

-        get { return result.field127_; }

+        get { return PrepareBuilder().field127_; }

       }

       public int Field127Count {

         get { return result.Field127Count; }

@@ -5454,19 +5788,23 @@
       }

       public Builder SetField127(int index, string value) {

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

+        PrepareBuilder();

         result.field127_[index] = value;

         return this;

       }

       public Builder AddField127(string value) {

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

+        PrepareBuilder();

         result.field127_.Add(value);

         return this;

       }

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

+        PrepareBuilder();

         base.AddRange(values, result.field127_);

         return this;

       }

       public Builder ClearField127() {

+        PrepareBuilder();

         result.field127_.Clear();

         return this;

       }

@@ -5479,18 +5817,20 @@
         set { SetField129(value); }

       }

       public Builder SetField129(int value) {

+        PrepareBuilder();

         result.hasField129 = true;

         result.field129_ = value;

         return this;

       }

       public Builder ClearField129() {

+        PrepareBuilder();

         result.hasField129 = false;

         result.field129_ = 0;

         return this;

       }

       

       public pbc::IPopsicleList<long> Field130List {

-        get { return result.field130_; }

+        get { return PrepareBuilder().field130_; }

       }

       public int Field130Count {

         get { return result.Field130Count; }

@@ -5499,18 +5839,22 @@
         return result.GetField130(index);

       }

       public Builder SetField130(int index, long value) {

+        PrepareBuilder();

         result.field130_[index] = value;

         return this;

       }

       public Builder AddField130(long value) {

+        PrepareBuilder();

         result.field130_.Add(value);

         return this;

       }

       public Builder AddRangeField130(scg::IEnumerable<long> values) {

+        PrepareBuilder();

         base.AddRange(values, result.field130_);

         return this;

       }

       public Builder ClearField130() {

+        PrepareBuilder();

         result.field130_.Clear();

         return this;

       }

@@ -5523,11 +5867,13 @@
         set { SetField205(value); }

       }

       public Builder SetField205(bool value) {

+        PrepareBuilder();

         result.hasField205 = true;

         result.field205_ = value;

         return this;

       }

       public Builder ClearField205() {

+        PrepareBuilder();

         result.hasField205 = false;

         result.field205_ = false;

         return this;

@@ -5541,11 +5887,13 @@
         set { SetField206(value); }

       }

       public Builder SetField206(bool value) {

+        PrepareBuilder();

         result.hasField206 = true;

         result.field206_ = value;

         return this;

       }

       public Builder ClearField206() {

+        PrepareBuilder();

         result.hasField206 = false;

         result.field206_ = false;

         return this;

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

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

     public static Builder CreateBuilder(SpeedMessage2GroupedMessage prototype) {

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

+      return new Builder(prototype);

     }

     

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

@@ -5828,21 +6176,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new SpeedMessage2GroupedMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(SpeedMessage2GroupedMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      SpeedMessage2GroupedMessage result = new SpeedMessage2GroupedMessage();

+      bool builderIsReadOnly;

+      SpeedMessage2GroupedMessage result;

+      

+      private SpeedMessage2GroupedMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          SpeedMessage2GroupedMessage original = result;

+          result = new SpeedMessage2GroupedMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override SpeedMessage2GroupedMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new SpeedMessage2GroupedMessage();

+        result = DefaultInstance ?? new SpeedMessage2GroupedMessage();

+        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 {

@@ -5854,12 +6229,11 @@
       }

       

       public override SpeedMessage2GroupedMessage BuildPartial() {

-        if (result == null) {

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

+        if (builderIsReadOnly) {

+          return result;

         }

-        SpeedMessage2GroupedMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -5873,6 +6247,7 @@
       

       public override Builder MergeFrom(SpeedMessage2GroupedMessage other) {

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

+        PrepareBuilder();

         if (other.HasField1) {

           Field1 = other.Field1;

         }

@@ -5915,6 +6290,7 @@
       }

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6010,11 +6386,13 @@
         set { SetField1(value); }

       }

       public Builder SetField1(float value) {

+        PrepareBuilder();

         result.hasField1 = true;

         result.field1_ = value;

         return this;

       }

       public Builder ClearField1() {

+        PrepareBuilder();

         result.hasField1 = false;

         result.field1_ = 0F;

         return this;

@@ -6028,11 +6406,13 @@
         set { SetField2(value); }

       }

       public Builder SetField2(float value) {

+        PrepareBuilder();

         result.hasField2 = true;

         result.field2_ = value;

         return this;

       }

       public Builder ClearField2() {

+        PrepareBuilder();

         result.hasField2 = false;

         result.field2_ = 0F;

         return this;

@@ -6046,11 +6426,13 @@
         set { SetField3(value); }

       }

       public Builder SetField3(float value) {

+        PrepareBuilder();

         result.hasField3 = true;

         result.field3_ = value;

         return this;

       }

       public Builder ClearField3() {

+        PrepareBuilder();

         result.hasField3 = false;

         result.field3_ = 0F;

         return this;

@@ -6064,11 +6446,13 @@
         set { SetField4(value); }

       }

       public Builder SetField4(bool value) {

+        PrepareBuilder();

         result.hasField4 = true;

         result.field4_ = value;

         return this;

       }

       public Builder ClearField4() {

+        PrepareBuilder();

         result.hasField4 = false;

         result.field4_ = false;

         return this;

@@ -6082,11 +6466,13 @@
         set { SetField5(value); }

       }

       public Builder SetField5(bool value) {

+        PrepareBuilder();

         result.hasField5 = true;

         result.field5_ = value;

         return this;

       }

       public Builder ClearField5() {

+        PrepareBuilder();

         result.hasField5 = false;

         result.field5_ = false;

         return this;

@@ -6100,11 +6486,13 @@
         set { SetField6(value); }

       }

       public Builder SetField6(bool value) {

+        PrepareBuilder();

         result.hasField6 = true;

         result.field6_ = value;

         return this;

       }

       public Builder ClearField6() {

+        PrepareBuilder();

         result.hasField6 = false;

         result.field6_ = true;

         return this;

@@ -6118,11 +6506,13 @@
         set { SetField7(value); }

       }

       public Builder SetField7(bool value) {

+        PrepareBuilder();

         result.hasField7 = true;

         result.field7_ = value;

         return this;

       }

       public Builder ClearField7() {

+        PrepareBuilder();

         result.hasField7 = false;

         result.field7_ = false;

         return this;

@@ -6136,11 +6526,13 @@
         set { SetField8(value); }

       }

       public Builder SetField8(float value) {

+        PrepareBuilder();

         result.hasField8 = true;

         result.field8_ = value;

         return this;

       }

       public Builder ClearField8() {

+        PrepareBuilder();

         result.hasField8 = false;

         result.field8_ = 0F;

         return this;

@@ -6154,11 +6546,13 @@
         set { SetField9(value); }

       }

       public Builder SetField9(bool value) {

+        PrepareBuilder();

         result.hasField9 = true;

         result.field9_ = value;

         return this;

       }

       public Builder ClearField9() {

+        PrepareBuilder();

         result.hasField9 = false;

         result.field9_ = false;

         return this;

@@ -6172,11 +6566,13 @@
         set { SetField10(value); }

       }

       public Builder SetField10(float value) {

+        PrepareBuilder();

         result.hasField10 = true;

         result.field10_ = value;

         return this;

       }

       public Builder ClearField10() {

+        PrepareBuilder();

         result.hasField10 = false;

         result.field10_ = 0F;

         return this;

@@ -6190,11 +6586,13 @@
         set { SetField11(value); }

       }

       public Builder SetField11(long value) {

+        PrepareBuilder();

         result.hasField11 = true;

         result.field11_ = value;

         return this;

       }

       public Builder ClearField11() {

+        PrepareBuilder();

         result.hasField11 = false;

         result.field11_ = 0L;

         return this;