Lite feature complete.
diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs
index 07314f8..8249216 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs
@@ -26,6 +26,7 @@
       Descriptor = null;
       global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.EmployeeIdLite = 
         new pb::GeneratedExtensionLite<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite, global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite>(
+          "protobuf_unittest_extra.employee_id_lite",
           global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.DefaultInstance,
           null,
           global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite.DefaultInstance,
@@ -117,6 +118,28 @@
       }
     }
     
+    #region Lite runtime methods
+    public override int GetHashCode() {
+      int hash = GetType().GetHashCode();
+      if (hasD) hash ^= d_.GetHashCode();
+      if (hasEn) hash ^= en_.GetHashCode();
+      return hash;
+    }
+    
+    public override bool Equals(object obj) {
+      TestRequiredLite other = obj as TestRequiredLite;
+      if (other == null) return false;
+      if (hasD != other.hasD || (hasD && !d_.Equals(other.d_))) return false;
+      if (hasEn != other.hasEn || (hasEn && !en_.Equals(other.en_))) return false;
+      return true;
+    }
+    
+    public override void PrintTo(global::System.IO.TextWriter writer) {
+      PrintField("d", hasD, d_, writer);
+      PrintField("en", hasEn, en_, writer);
+    }
+    #endregion
+    
     public static TestRequiredLite ParseFrom(pb::ByteString data) {
       return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
     }
@@ -375,6 +398,28 @@
           }
         }
         
+        #region Lite runtime methods
+        public override int GetHashCode() {
+          int hash = GetType().GetHashCode();
+          if (hasNumber) hash ^= number_.GetHashCode();
+          if (hasType) hash ^= type_.GetHashCode();
+          return hash;
+        }
+        
+        public override bool Equals(object obj) {
+          PhoneNumber other = obj as PhoneNumber;
+          if (other == null) return false;
+          if (hasNumber != other.hasNumber || (hasNumber && !number_.Equals(other.number_))) return false;
+          if (hasType != other.hasType || (hasType && !type_.Equals(other.type_))) return false;
+          return true;
+        }
+        
+        public override void PrintTo(global::System.IO.TextWriter writer) {
+          PrintField("number", hasNumber, number_, writer);
+          PrintField("type", hasType, type_, writer);
+        }
+        #endregion
+        
         public static PhoneNumber ParseFrom(pb::ByteString data) {
           return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
         }
@@ -664,6 +709,37 @@
           }
         }
         
+        #region Lite runtime methods
+        public override int GetHashCode() {
+          int hash = GetType().GetHashCode();
+          if (hasAddress) hash ^= address_.GetHashCode();
+          if (hasAddress2) hash ^= address2_.GetHashCode();
+          if (hasCity) hash ^= city_.GetHashCode();
+          if (hasState) hash ^= state_.GetHashCode();
+          if (hasZip) hash ^= zip_.GetHashCode();
+          return hash;
+        }
+        
+        public override bool Equals(object obj) {
+          Addresses other = obj as Addresses;
+          if (other == null) return false;
+          if (hasAddress != other.hasAddress || (hasAddress && !address_.Equals(other.address_))) return false;
+          if (hasAddress2 != other.hasAddress2 || (hasAddress2 && !address2_.Equals(other.address2_))) return false;
+          if (hasCity != other.hasCity || (hasCity && !city_.Equals(other.city_))) return false;
+          if (hasState != other.hasState || (hasState && !state_.Equals(other.state_))) return false;
+          if (hasZip != other.hasZip || (hasZip && !zip_.Equals(other.zip_))) return false;
+          return true;
+        }
+        
+        public override void PrintTo(global::System.IO.TextWriter writer) {
+          PrintField("address", hasAddress, address_, writer);
+          PrintField("address2", hasAddress2, address2_, writer);
+          PrintField("city", hasCity, city_, writer);
+          PrintField("state", hasState, state_, writer);
+          PrintField("zip", hasZip, zip_, writer);
+        }
+        #endregion
+        
         public static Addresses ParseFrom(pb::ByteString data) {
           return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
         }
@@ -1057,6 +1133,52 @@
       }
     }
     
+    #region Lite runtime methods
+    public override int GetHashCode() {
+      int hash = GetType().GetHashCode();
+      if (hasName) hash ^= name_.GetHashCode();
+      if (hasId) hash ^= id_.GetHashCode();
+      if (hasEmail) hash ^= email_.GetHashCode();
+      foreach(int i in codes_)
+        hash ^= i.GetHashCode();
+      foreach(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber i in phone_)
+        hash ^= i.GetHashCode();
+      foreach(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses i in addresses_)
+        hash ^= i.GetHashCode();
+      hash ^= base.GetHashCode();
+      return hash;
+    }
+    
+    public override bool Equals(object obj) {
+      TestInteropPersonLite other = obj as TestInteropPersonLite;
+      if (other == null) return false;
+      if (hasName != other.hasName || (hasName && !name_.Equals(other.name_))) return false;
+      if (hasId != other.hasId || (hasId && !id_.Equals(other.id_))) return false;
+      if (hasEmail != other.hasEmail || (hasEmail && !email_.Equals(other.email_))) return false;
+      if(codes_.Count != other.codes_.Count) return false;
+      for(int ix=0; ix < codes_.Count; ix++)
+        if(!codes_[ix].Equals(other.codes_[ix])) return false;
+      if(phone_.Count != other.phone_.Count) return false;
+      for(int ix=0; ix < phone_.Count; ix++)
+        if(!phone_[ix].Equals(other.phone_[ix])) return false;
+      if(addresses_.Count != other.addresses_.Count) return false;
+      for(int ix=0; ix < addresses_.Count; ix++)
+        if(!addresses_[ix].Equals(other.addresses_[ix])) return false;
+      if (!base.Equals(other)) return false;
+      return true;
+    }
+    
+    public override void PrintTo(global::System.IO.TextWriter writer) {
+      PrintField("name", hasName, name_, writer);
+      PrintField("id", hasId, id_, writer);
+      PrintField("email", hasEmail, email_, writer);
+      PrintField("phone", phone_, writer);
+      PrintField("Addresses", addresses_, writer);
+      PrintField("codes", codes_, writer);
+      base.PrintTo(writer);
+    }
+    #endregion
+    
     public static TestInteropPersonLite ParseFrom(pb::ByteString data) {
       return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
     }
@@ -1436,6 +1558,25 @@
       }
     }
     
+    #region Lite runtime methods
+    public override int GetHashCode() {
+      int hash = GetType().GetHashCode();
+      if (hasNumber) hash ^= number_.GetHashCode();
+      return hash;
+    }
+    
+    public override bool Equals(object obj) {
+      TestInteropEmployeeIdLite other = obj as TestInteropEmployeeIdLite;
+      if (other == null) return false;
+      if (hasNumber != other.hasNumber || (hasNumber && !number_.Equals(other.number_))) return false;
+      return true;
+    }
+    
+    public override void PrintTo(global::System.IO.TextWriter writer) {
+      PrintField("number", hasNumber, number_, writer);
+    }
+    #endregion
+    
     public static TestInteropEmployeeIdLite ParseFrom(pb::ByteString data) {
       return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
     }