Extracted ICodedInputStream interface
diff --git a/src/ProtocolBuffers.Test/AbstractMessageTest.cs b/src/ProtocolBuffers.Test/AbstractMessageTest.cs
index e300ac9..f1dbda3 100644
--- a/src/ProtocolBuffers.Test/AbstractMessageTest.cs
+++ b/src/ProtocolBuffers.Test/AbstractMessageTest.cs
@@ -465,7 +465,7 @@
                     return this;

                 }

 

-                public override Builder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry)

+                public override Builder MergeFrom(ICodedInputStream input, ExtensionRegistry extensionRegistry)

                 {

                     wrappedBuilder.WeakMergeFrom(input, extensionRegistry);

                     return this;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
index 55f52f7..ae057e0 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
@@ -175,10 +175,10 @@
     public static OptionsMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static OptionsMessage ParseFrom(pb::CodedInputStream input) {

+    public static OptionsMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static OptionsMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static OptionsMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -253,11 +253,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
index 96c8a76..b133581 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
@@ -498,10 +498,10 @@
     public static TestMessageWithCustomOptions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMessageWithCustomOptions ParseFrom(pb::CodedInputStream input) {

+    public static TestMessageWithCustomOptions ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMessageWithCustomOptions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMessageWithCustomOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -570,11 +570,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -707,10 +707,10 @@
     public static CustomOptionFooRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static CustomOptionFooRequest ParseFrom(pb::CodedInputStream input) {

+    public static CustomOptionFooRequest ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static CustomOptionFooRequest ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static CustomOptionFooRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -776,11 +776,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -890,10 +890,10 @@
     public static CustomOptionFooResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static CustomOptionFooResponse ParseFrom(pb::CodedInputStream input) {

+    public static CustomOptionFooResponse ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static CustomOptionFooResponse ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static CustomOptionFooResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -959,11 +959,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1088,10 +1088,10 @@
     public static DummyMessageContainingEnum ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static DummyMessageContainingEnum ParseFrom(pb::CodedInputStream input) {

+    public static DummyMessageContainingEnum ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static DummyMessageContainingEnum ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static DummyMessageContainingEnum ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1157,11 +1157,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1271,10 +1271,10 @@
     public static DummyMessageInvalidAsOptionType ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static DummyMessageInvalidAsOptionType ParseFrom(pb::CodedInputStream input) {

+    public static DummyMessageInvalidAsOptionType ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static DummyMessageInvalidAsOptionType ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static DummyMessageInvalidAsOptionType ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1340,11 +1340,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1454,10 +1454,10 @@
     public static CustomOptionMinIntegerValues ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static CustomOptionMinIntegerValues ParseFrom(pb::CodedInputStream input) {

+    public static CustomOptionMinIntegerValues ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static CustomOptionMinIntegerValues ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static CustomOptionMinIntegerValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1523,11 +1523,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1637,10 +1637,10 @@
     public static CustomOptionMaxIntegerValues ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static CustomOptionMaxIntegerValues ParseFrom(pb::CodedInputStream input) {

+    public static CustomOptionMaxIntegerValues ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static CustomOptionMaxIntegerValues ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static CustomOptionMaxIntegerValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1706,11 +1706,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1820,10 +1820,10 @@
     public static CustomOptionOtherValues ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static CustomOptionOtherValues ParseFrom(pb::CodedInputStream input) {

+    public static CustomOptionOtherValues ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static CustomOptionOtherValues ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static CustomOptionOtherValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1889,11 +1889,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2003,10 +2003,10 @@
     public static SettingRealsFromPositiveInts ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SettingRealsFromPositiveInts ParseFrom(pb::CodedInputStream input) {

+    public static SettingRealsFromPositiveInts ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SettingRealsFromPositiveInts ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SettingRealsFromPositiveInts ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -2072,11 +2072,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2186,10 +2186,10 @@
     public static SettingRealsFromNegativeInts ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SettingRealsFromNegativeInts ParseFrom(pb::CodedInputStream input) {

+    public static SettingRealsFromNegativeInts ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SettingRealsFromNegativeInts ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SettingRealsFromNegativeInts ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -2255,11 +2255,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2421,10 +2421,10 @@
     public static ComplexOptionType1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ComplexOptionType1 ParseFrom(pb::CodedInputStream input) {

+    public static ComplexOptionType1 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ComplexOptionType1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ComplexOptionType1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -2500,11 +2500,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2728,10 +2728,10 @@
         public static ComplexOptionType4 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static ComplexOptionType4 ParseFrom(pb::CodedInputStream input) {

+        public static ComplexOptionType4 ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static ComplexOptionType4 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static ComplexOptionType4 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -2800,11 +2800,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -2969,10 +2969,10 @@
     public static ComplexOptionType2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ComplexOptionType2 ParseFrom(pb::CodedInputStream input) {

+    public static ComplexOptionType2 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ComplexOptionType2 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ComplexOptionType2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -3048,11 +3048,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -3320,10 +3320,10 @@
         public static ComplexOptionType5 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static ComplexOptionType5 ParseFrom(pb::CodedInputStream input) {

+        public static ComplexOptionType5 ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static ComplexOptionType5 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static ComplexOptionType5 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -3392,11 +3392,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -3538,10 +3538,10 @@
     public static ComplexOptionType3 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ComplexOptionType3 ParseFrom(pb::CodedInputStream input) {

+    public static ComplexOptionType3 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ComplexOptionType3 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ComplexOptionType3 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -3613,11 +3613,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -3810,10 +3810,10 @@
     public static ComplexOpt6 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ComplexOpt6 ParseFrom(pb::CodedInputStream input) {

+    public static ComplexOpt6 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ComplexOpt6 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ComplexOpt6 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -3882,11 +3882,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -4018,10 +4018,10 @@
     public static VariousComplexOptions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static VariousComplexOptions ParseFrom(pb::CodedInputStream input) {

+    public static VariousComplexOptions ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static VariousComplexOptions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static VariousComplexOptions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -4087,11 +4087,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
index 9993960..60a8b8d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
@@ -171,10 +171,10 @@
     public static TestEmbedOptimizedForSize ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestEmbedOptimizedForSize ParseFrom(pb::CodedInputStream input) {

+    public static TestEmbedOptimizedForSize ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestEmbedOptimizedForSize ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestEmbedOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -247,11 +247,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
index a4d24b9..1e9033f 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
@@ -594,10 +594,10 @@
     public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SizeMessage1 ParseFrom(pb::CodedInputStream input) {

+    public static SizeMessage1 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SizeMessage1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SizeMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1685,10 +1685,10 @@
     public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SizeMessage1SubMessage ParseFrom(pb::CodedInputStream input) {

+    public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SizeMessage1SubMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -2361,10 +2361,10 @@
         public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static Group1 ParseFrom(pb::CodedInputStream input) {

+        public static Group1 ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static Group1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -3101,10 +3101,10 @@
     public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SizeMessage2 ParseFrom(pb::CodedInputStream input) {

+    public static SizeMessage2 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SizeMessage2 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SizeMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -3915,10 +3915,10 @@
     public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SizeMessage2GroupedMessage ParseFrom(pb::CodedInputStream input) {

+    public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SizeMessage2GroupedMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
index 757ecff..5bb6df0 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
@@ -870,10 +870,10 @@
     public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SpeedMessage1 ParseFrom(pb::CodedInputStream input) {

+    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SpeedMessage1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1063,11 +1063,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2447,10 +2447,10 @@
     public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SpeedMessage1SubMessage ParseFrom(pb::CodedInputStream input) {

+    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SpeedMessage1SubMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -2576,11 +2576,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -3450,10 +3450,10 @@
         public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static Group1 ParseFrom(pb::CodedInputStream input) {

+        public static Group1 ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static Group1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -3570,11 +3570,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -4576,10 +4576,10 @@
     public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SpeedMessage2 ParseFrom(pb::CodedInputStream input) {

+    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SpeedMessage2 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -4739,11 +4739,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -5740,10 +5740,10 @@
     public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SpeedMessage2GroupedMessage ParseFrom(pb::CodedInputStream input) {

+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SpeedMessage2GroupedMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -5842,11 +5842,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs
index 0e890f3..19d8989 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportLiteProtoFile.cs
@@ -135,10 +135,10 @@
     public static ImportMessageLite ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ImportMessageLite ParseFrom(pb::CodedInputStream input) {

+    public static ImportMessageLite ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ImportMessageLite ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ImportMessageLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -202,11 +202,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         uint tag;

         string field_name;

         while (input.ReadTag(out tag, out field_name)) {

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
index cbd6cea..7fd6259 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
@@ -154,10 +154,10 @@
     public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ImportMessage ParseFrom(pb::CodedInputStream input) {

+    public static ImportMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ImportMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -226,11 +226,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
index b41a15d..7023d75 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
@@ -174,10 +174,10 @@
     public static TestMessageSet ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMessageSet ParseFrom(pb::CodedInputStream input) {

+    public static TestMessageSet ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMessageSet ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMessageSet ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -244,11 +244,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -374,10 +374,10 @@
     public static TestMessageSetContainer ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMessageSetContainer ParseFrom(pb::CodedInputStream input) {

+    public static TestMessageSetContainer ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMessageSetContainer ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMessageSetContainer ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -446,11 +446,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -623,10 +623,10 @@
     public static TestMessageSetExtension1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMessageSetExtension1 ParseFrom(pb::CodedInputStream input) {

+    public static TestMessageSetExtension1 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMessageSetExtension1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMessageSetExtension1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -695,11 +695,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -849,10 +849,10 @@
     public static TestMessageSetExtension2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMessageSetExtension2 ParseFrom(pb::CodedInputStream input) {

+    public static TestMessageSetExtension2 ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMessageSetExtension2 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMessageSetExtension2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -921,11 +921,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1122,10 +1122,10 @@
         public static Item ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static Item ParseFrom(pb::CodedInputStream input) {

+        public static Item ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static Item ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static Item ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -1197,11 +1197,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1352,10 +1352,10 @@
     public static RawMessageSet ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static RawMessageSet ParseFrom(pb::CodedInputStream input) {

+    public static RawMessageSet ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static RawMessageSet ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static RawMessageSet ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1425,11 +1425,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
index f72688b..99bcf3b 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
@@ -168,10 +168,10 @@
     public static TestMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMessage ParseFrom(pb::CodedInputStream input) {

+    public static TestMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -241,11 +241,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
index fbbcad9..53fe9ef 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
@@ -152,10 +152,10 @@
     public static TestOptimizedForSize ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestOptimizedForSize ParseFrom(pb::CodedInputStream input) {

+    public static TestOptimizedForSize ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestOptimizedForSize ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -325,10 +325,10 @@
     public static TestRequiredOptimizedForSize ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestRequiredOptimizedForSize ParseFrom(pb::CodedInputStream input) {

+    public static TestRequiredOptimizedForSize ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestRequiredOptimizedForSize ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestRequiredOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -462,10 +462,10 @@
     public static TestOptionalOptimizedForSize ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestOptionalOptimizedForSize ParseFrom(pb::CodedInputStream input) {

+    public static TestOptionalOptimizedForSize ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestOptionalOptimizedForSize ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestOptionalOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
index d564a02..5da244d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
@@ -1151,10 +1151,10 @@
         public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static NestedMessage ParseFrom(pb::CodedInputStream input) {

+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static NestedMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -1223,11 +1223,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1375,10 +1375,10 @@
         public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static OptionalGroup ParseFrom(pb::CodedInputStream input) {

+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static OptionalGroup ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -1447,11 +1447,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1599,10 +1599,10 @@
         public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static RepeatedGroup ParseFrom(pb::CodedInputStream input) {

+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static RepeatedGroup ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -1671,11 +1671,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -3029,10 +3029,10 @@
     public static TestAllTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestAllTypes ParseFrom(pb::CodedInputStream input) {

+    public static TestAllTypes ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestAllTypes ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestAllTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -3326,11 +3326,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -5411,10 +5411,10 @@
     public static TestDeprecatedFields ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestDeprecatedFields ParseFrom(pb::CodedInputStream input) {

+    public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestDeprecatedFields ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -5483,11 +5483,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -5635,10 +5635,10 @@
     public static ForeignMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static ForeignMessage ParseFrom(pb::CodedInputStream input) {

+    public static ForeignMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static ForeignMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static ForeignMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -5707,11 +5707,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -5847,10 +5847,10 @@
     public static TestAllExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestAllExtensions ParseFrom(pb::CodedInputStream input) {

+    public static TestAllExtensions ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestAllExtensions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestAllExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -5917,11 +5917,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6047,10 +6047,10 @@
     public static OptionalGroup_extension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static OptionalGroup_extension ParseFrom(pb::CodedInputStream input) {

+    public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static OptionalGroup_extension ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -6119,11 +6119,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6271,10 +6271,10 @@
     public static RepeatedGroup_extension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static RepeatedGroup_extension ParseFrom(pb::CodedInputStream input) {

+    public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static RepeatedGroup_extension ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -6343,11 +6343,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -6481,10 +6481,10 @@
     public static TestNestedExtension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestNestedExtension ParseFrom(pb::CodedInputStream input) {

+    public static TestNestedExtension ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestNestedExtension ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestNestedExtension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -6550,11 +6550,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -7199,10 +7199,10 @@
     public static TestRequired ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestRequired ParseFrom(pb::CodedInputStream input) {

+    public static TestRequired ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestRequired ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestRequired ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -7367,11 +7367,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -8263,10 +8263,10 @@
     public static TestRequiredForeign ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestRequiredForeign ParseFrom(pb::CodedInputStream input) {

+    public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestRequiredForeign ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -8342,11 +8342,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -8581,10 +8581,10 @@
     public static TestForeignNested ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestForeignNested ParseFrom(pb::CodedInputStream input) {

+    public static TestForeignNested ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestForeignNested ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestForeignNested ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -8653,11 +8653,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -8812,10 +8812,10 @@
     public static TestEmptyMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestEmptyMessage ParseFrom(pb::CodedInputStream input) {

+    public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestEmptyMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -8881,11 +8881,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -8999,10 +8999,10 @@
     public static TestEmptyMessageWithExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestEmptyMessageWithExtensions ParseFrom(pb::CodedInputStream input) {

+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestEmptyMessageWithExtensions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -9069,11 +9069,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9189,10 +9189,10 @@
     public static TestMultipleExtensionRanges ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMultipleExtensionRanges ParseFrom(pb::CodedInputStream input) {

+    public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMultipleExtensionRanges ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -9259,11 +9259,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9405,10 +9405,10 @@
     public static TestReallyLargeTagNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestReallyLargeTagNumber ParseFrom(pb::CodedInputStream input) {

+    public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestReallyLargeTagNumber ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -9480,11 +9480,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9670,10 +9670,10 @@
     public static TestRecursiveMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestRecursiveMessage ParseFrom(pb::CodedInputStream input) {

+    public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestRecursiveMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -9745,11 +9745,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -9942,10 +9942,10 @@
     public static TestMutualRecursionA ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMutualRecursionA ParseFrom(pb::CodedInputStream input) {

+    public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMutualRecursionA ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -10014,11 +10014,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -10205,10 +10205,10 @@
     public static TestMutualRecursionB ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestMutualRecursionB ParseFrom(pb::CodedInputStream input) {

+    public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestMutualRecursionB ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -10280,11 +10280,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -10507,10 +10507,10 @@
         public static Foo ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static Foo ParseFrom(pb::CodedInputStream input) {

+        public static Foo ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static Foo ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static Foo ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -10579,11 +10579,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -10731,10 +10731,10 @@
         public static Bar ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static Bar ParseFrom(pb::CodedInputStream input) {

+        public static Bar ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static Bar ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static Bar ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -10803,11 +10803,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -10965,10 +10965,10 @@
     public static TestDupFieldNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestDupFieldNumber ParseFrom(pb::CodedInputStream input) {

+    public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestDupFieldNumber ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -11043,11 +11043,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -11340,10 +11340,10 @@
         public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static NestedMessage ParseFrom(pb::CodedInputStream input) {

+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static NestedMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -11417,11 +11417,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -11597,10 +11597,10 @@
     public static TestNestedMessageHasBits ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestNestedMessageHasBits ParseFrom(pb::CodedInputStream input) {

+    public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestNestedMessageHasBits ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -11669,11 +11669,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -12059,10 +12059,10 @@
     public static TestCamelCaseFieldNames ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestCamelCaseFieldNames ParseFrom(pb::CodedInputStream input) {

+    public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestCamelCaseFieldNames ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -12170,11 +12170,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -12710,10 +12710,10 @@
     public static TestFieldOrderings ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestFieldOrderings ParseFrom(pb::CodedInputStream input) {

+    public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestFieldOrderings ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -12789,11 +12789,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -13276,10 +13276,10 @@
     public static TestExtremeDefaultValues ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestExtremeDefaultValues ParseFrom(pb::CodedInputStream input) {

+    public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestExtremeDefaultValues ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -13402,11 +13402,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -13956,10 +13956,10 @@
     public static OneString ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static OneString ParseFrom(pb::CodedInputStream input) {

+    public static OneString ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static OneString ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static OneString ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -14028,11 +14028,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -14181,10 +14181,10 @@
     public static OneBytes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static OneBytes ParseFrom(pb::CodedInputStream input) {

+    public static OneBytes ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static OneBytes ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static OneBytes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -14253,11 +14253,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -14763,10 +14763,10 @@
     public static TestPackedTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestPackedTypes ParseFrom(pb::CodedInputStream input) {

+    public static TestPackedTypes ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestPackedTypes ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestPackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -14888,11 +14888,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -15769,10 +15769,10 @@
     public static TestUnpackedTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestUnpackedTypes ParseFrom(pb::CodedInputStream input) {

+    public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestUnpackedTypes ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -15894,11 +15894,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -16461,10 +16461,10 @@
     public static TestPackedExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestPackedExtensions ParseFrom(pb::CodedInputStream input) {

+    public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestPackedExtensions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -16531,11 +16531,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -16699,10 +16699,10 @@
         public static DynamicMessageType ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static DynamicMessageType ParseFrom(pb::CodedInputStream input) {

+        public static DynamicMessageType ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static DynamicMessageType ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static DynamicMessageType ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -16771,11 +16771,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -17016,10 +17016,10 @@
     public static TestDynamicExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestDynamicExtensions ParseFrom(pb::CodedInputStream input) {

+    public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestDynamicExtensions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -17108,11 +17108,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -17596,10 +17596,10 @@
     public static TestRepeatedScalarDifferentTagSizes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::CodedInputStream input) {

+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -17689,11 +17689,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -17998,10 +17998,10 @@
     public static FooRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static FooRequest ParseFrom(pb::CodedInputStream input) {

+    public static FooRequest ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static FooRequest ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static FooRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -18067,11 +18067,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -18181,10 +18181,10 @@
     public static FooResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static FooResponse ParseFrom(pb::CodedInputStream input) {

+    public static FooResponse ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static FooResponse ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static FooResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -18250,11 +18250,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -18364,10 +18364,10 @@
     public static BarRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static BarRequest ParseFrom(pb::CodedInputStream input) {

+    public static BarRequest ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static BarRequest ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static BarRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -18433,11 +18433,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -18547,10 +18547,10 @@
     public static BarResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static BarResponse ParseFrom(pb::CodedInputStream input) {

+    public static BarResponse ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static BarResponse ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static BarResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -18616,11 +18616,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs
index 58ceef7..149bb28 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestRpcInterop.cs
@@ -173,10 +173,10 @@
     public static SearchRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SearchRequest ParseFrom(pb::CodedInputStream input) {

+    public static SearchRequest ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SearchRequest ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SearchRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -246,11 +246,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -455,10 +455,10 @@
         public static ResultItem ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static ResultItem ParseFrom(pb::CodedInputStream input) {

+        public static ResultItem ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static ResultItem ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static ResultItem ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -530,11 +530,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -689,10 +689,10 @@
     public static SearchResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static SearchResponse ParseFrom(pb::CodedInputStream input) {

+    public static SearchResponse ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static SearchResponse ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static SearchResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -762,11 +762,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -959,10 +959,10 @@
     public static RefineSearchRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static RefineSearchRequest ParseFrom(pb::CodedInputStream input) {

+    public static RefineSearchRequest ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static RefineSearchRequest ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static RefineSearchRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1035,11 +1035,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
index 2476cf1..fc705fd 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
@@ -238,10 +238,10 @@
     public static TestXmlChild ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestXmlChild ParseFrom(pb::CodedInputStream input) {

+    public static TestXmlChild ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestXmlChild ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestXmlChild ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -314,11 +314,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -490,10 +490,10 @@
     public static TestXmlNoFields ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestXmlNoFields ParseFrom(pb::CodedInputStream input) {

+    public static TestXmlNoFields ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestXmlNoFields ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestXmlNoFields ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -559,11 +559,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -744,10 +744,10 @@
         public static Children ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

           return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

         }

-        public static Children ParseFrom(pb::CodedInputStream input) {

+        public static Children ParseFrom(pb::ICodedInputStream input) {

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

         }

-        public static Children ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        public static Children ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

         }

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

@@ -820,11 +820,11 @@
             return this;

           }

           

-          public override Builder MergeFrom(pb::CodedInputStream input) {

+          public override Builder MergeFrom(pb::ICodedInputStream input) {

             return MergeFrom(input, pb::ExtensionRegistry.Empty);

           }

           

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

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

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -1106,10 +1106,10 @@
     public static TestXmlMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestXmlMessage ParseFrom(pb::CodedInputStream input) {

+    public static TestXmlMessage ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestXmlMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestXmlMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1200,11 +1200,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1547,10 +1547,10 @@
     public static TestXmlExtension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {

       return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();

     }

-    public static TestXmlExtension ParseFrom(pb::CodedInputStream input) {

+    public static TestXmlExtension ParseFrom(pb::ICodedInputStream input) {

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

     }

-    public static TestXmlExtension ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+    public static TestXmlExtension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

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

     }

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

@@ -1619,11 +1619,11 @@
         return this;

       }

       

-      public override Builder MergeFrom(pb::CodedInputStream input) {

+      public override Builder MergeFrom(pb::ICodedInputStream input) {

         return MergeFrom(input, pb::ExtensionRegistry.Empty);

       }

       

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

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

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;