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

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

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

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

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

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

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

     public static Person DefaultInstance {

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

     

     public override Person DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override Person ThisMessage {

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

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

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

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

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

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

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

         public static PhoneNumber DefaultInstance {

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

         

         public override PhoneNumber DefaultInstanceForType {

-          get { return defaultInstance; }

+          get { return DefaultInstance; }

         }

         

         protected override PhoneNumber ThisMessage {

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

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

         }

+        private PhoneNumber MakeReadOnly() {

+          return this;

+        }

+        

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

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

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

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

           }

           public Builder() {

-            result = DefaultInstance ?? new PhoneNumber();

-            builderIsReadOnly = result == DefaultInstance;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

           }

           internal Builder(PhoneNumber cloneFrom) {

             result = cloneFrom;

-            builderIsReadOnly = true;

+            resultIsReadOnly = true;

           }

           

-          bool builderIsReadOnly;

-          PhoneNumber result;

+          private bool resultIsReadOnly;

+          private PhoneNumber result;

           

           private PhoneNumber PrepareBuilder() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               PhoneNumber original = result;

               result = new PhoneNumber();

-              builderIsReadOnly = false;

+              resultIsReadOnly = false;

               MergeFrom(original);

             }

             return result;

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

           

           public override Builder Clear() {

-            result = DefaultInstance ?? new PhoneNumber();

-            builderIsReadOnly = true;

+            result = DefaultInstance;

+            resultIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return new Builder(result);

             } else {

               return new Builder().MergeFrom(result);

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

           

           public override PhoneNumber BuildPartial() {

-            if (builderIsReadOnly) {

+            if (resultIsReadOnly) {

               return result;

             }

-            builderIsReadOnly = true;

-            return result;

+            resultIsReadOnly = true;

+            return result.MakeReadOnly();

           }

           

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

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

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

     }

+    private Person MakeReadOnly() {

+      phone_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

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

       }

       public Builder() {

-        result = DefaultInstance ?? new Person();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(Person cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      Person result;

+      private bool resultIsReadOnly;

+      private Person result;

       

       private Person PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           Person original = result;

           result = new Person();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

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

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new Person();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

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

       

       public override Person BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.phone_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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

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

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

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

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

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

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

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

     public static AddressBook DefaultInstance {

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

     

     public override AddressBook DefaultInstanceForType {

-      get { return defaultInstance; }

+      get { return DefaultInstance; }

     }

     

     protected override AddressBook ThisMessage {

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

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

     }

+    private AddressBook MakeReadOnly() {

+      person_.MakeReadOnly();

+      return this;

+    }

+    

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

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

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

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

       }

       public Builder() {

-        result = DefaultInstance ?? new AddressBook();

-        builderIsReadOnly = result == DefaultInstance;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

       }

       internal Builder(AddressBook cloneFrom) {

         result = cloneFrom;

-        builderIsReadOnly = true;

+        resultIsReadOnly = true;

       }

       

-      bool builderIsReadOnly;

-      AddressBook result;

+      private bool resultIsReadOnly;

+      private AddressBook result;

       

       private AddressBook PrepareBuilder() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           AddressBook original = result;

           result = new AddressBook();

-          builderIsReadOnly = false;

+          resultIsReadOnly = false;

           MergeFrom(original);

         }

         return result;

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

       

       public override Builder Clear() {

-        result = DefaultInstance ?? new AddressBook();

-        builderIsReadOnly = true;

+        result = DefaultInstance;

+        resultIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return new Builder(result);

         } else {

           return new Builder().MergeFrom(result);

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

       

       public override AddressBook BuildPartial() {

-        if (builderIsReadOnly) {

+        if (resultIsReadOnly) {

           return result;

         }

-        result.person_.MakeReadOnly();

-        builderIsReadOnly = true;

-        return result;

+        resultIsReadOnly = true;

+        return result.MakeReadOnly();

       }

       

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