Working split for lite interfaces
diff --git a/src/ProtocolBuffers/AbstractBuilder.cs b/src/ProtocolBuffers/AbstractBuilder.cs
index 2ba9855..4db89c6 100644
--- a/src/ProtocolBuffers/AbstractBuilder.cs
+++ b/src/ProtocolBuffers/AbstractBuilder.cs
@@ -173,10 +173,6 @@
     }
 
     public virtual TBuilder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) {
-      return MergeFrom(input, (ExtensionRegistryLite)extensionRegistry);
-    }
-
-    public virtual TBuilder MergeFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry) {
       UnknownFieldSet.Builder unknownFields = UnknownFieldSet.CreateBuilder(UnknownFields);
       unknownFields.MergeFrom(input, extensionRegistry, this);
       UnknownFields = unknownFields.Build();
@@ -198,10 +194,6 @@
     }
 
     public virtual TBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry) {
-      return MergeFrom(data, (ExtensionRegistryLite)extensionRegistry);
-    }
-
-    public virtual TBuilder MergeFrom(ByteString data, ExtensionRegistryLite extensionRegistry) {
       CodedInputStream input = data.CreateCodedInput();
       MergeFrom(input, extensionRegistry);
       input.CheckLastTagWas(0);
@@ -216,10 +208,6 @@
     }
 
     public virtual TBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry) {
-      return MergeFrom(data, (ExtensionRegistryLite)extensionRegistry);
-    }
-
-    public virtual TBuilder MergeFrom(byte[] data, ExtensionRegistryLite extensionRegistry) {
       CodedInputStream input = CodedInputStream.CreateInstance(data);
       MergeFrom(input, extensionRegistry);
       input.CheckLastTagWas(0);
@@ -234,10 +222,6 @@
     }
 
     public virtual TBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry) {
-      return MergeFrom(input, (ExtensionRegistryLite)extensionRegistry);
-    }
-
-    public virtual TBuilder MergeFrom(Stream input, ExtensionRegistryLite extensionRegistry) {
       CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
       MergeFrom(codedInput, extensionRegistry);
       codedInput.CheckLastTagWas(0);
@@ -245,7 +229,7 @@
     }
 
     public TBuilder MergeDelimitedFrom(Stream input, ExtensionRegistry extensionRegistry) {
-      return MergeDelimitedFrom(input, (ExtensionRegistryLite)extensionRegistry);
+      return Lite.MergeDelimitedFrom(input, extensionRegistry);
     }
 
     public TBuilder MergeDelimitedFrom(Stream input, ExtensionRegistryLite extensionRegistry) {
@@ -266,9 +250,81 @@
     public virtual IBuilder SetRepeatedField(FieldDescriptor field, int index, object value) {
       this[field, index] = value;
       return ThisBuilder;
-    }
+	  }
+
 
     /// <summary>
+    /// used internally to explicitly resolve lite edition methods
+    /// </summary>
+    protected IBuilderLite<TMessage, TBuilder> Lite { get { return this; } }
+
+    public virtual TBuilder MergeFrom(IMessageLite other) {
+#warning Not implemented for Lite edition
+      return MergeFrom((IMessage)other);
+    }
+
+    public TBuilder MergeFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry) {
+#warning Not implemented for Lite edition
+      return MergeFrom(input, (ExtensionRegistry)extensionRegistry);
+    }
+
+    public virtual TBuilder MergeFrom(ByteString data, ExtensionRegistryLite extensionRegistry) {
+#warning Not implemented for Lite edition
+      return MergeFrom(data, (ExtensionRegistry)extensionRegistry);
+    }
+
+    public virtual TBuilder MergeFrom(byte[] data, ExtensionRegistryLite extensionRegistry) {
+#warning Not implemented for Lite edition
+      return MergeFrom(data, (ExtensionRegistry)extensionRegistry);
+    }
+
+    public virtual TBuilder MergeFrom(Stream input, ExtensionRegistryLite extensionRegistry) {
+#warning Not implemented for Lite edition
+      return MergeFrom(input, (ExtensionRegistry)extensionRegistry);
+    }
+
+    IBuilderLite IBuilderLite.WeakClear() {
+      return WeakClear();
+    }
+
+    public IBuilderLite WeakMergeFrom(IMessageLite message) {
+      return MergeFrom(message);
+    }
+
+    IBuilderLite IBuilderLite.WeakMergeFrom(ByteString data) {
+      return WeakMergeFrom(data); 
+    }
+
+    IBuilderLite IBuilderLite.WeakMergeFrom(ByteString data, ExtensionRegistryLite registry) {
+      return WeakMergeFrom(data, registry);
+    }
+
+    IBuilderLite IBuilderLite.WeakMergeFrom(CodedInputStream input) {
+      return WeakMergeFrom(input);
+    }
+
+    IBuilderLite IBuilderLite.WeakMergeFrom(CodedInputStream input, ExtensionRegistryLite registry) {
+      return WeakMergeFrom(input, registry);
+    }
+
+    IMessageLite IBuilderLite.WeakBuild() {
+      return WeakBuild(); 
+    }
+
+    IMessageLite IBuilderLite.WeakBuildPartial() {
+      return WeakBuildPartial(); 
+    }
+
+    IBuilderLite IBuilderLite.WeakClone() {
+      return WeakClone(); 
+    }
+
+    IMessageLite IBuilderLite.WeakDefaultInstanceForType {
+      get { return WeakDefaultInstanceForType; }
+    }
+
+	#region LimitedInputStream
+	/// <summary>
     /// Stream implementation which proxies another stream, only allowing a certain amount
     /// of data to be read. Note that this is only used to read delimited streams, so it
     /// doesn't attempt to implement everything.
@@ -331,50 +387,7 @@
       public override void Write(byte[] buffer, int offset, int count) {
         throw new NotSupportedException();
       }
-    }
-
-    IBuilderLite IBuilderLite.WeakClear() {
-      return WeakClear();
-    }
-
-    public IBuilderLite WeakMergeFrom(IMessageLite message) {
-      return MergeFrom(message);
-    }
-
-    IBuilderLite IBuilderLite.WeakMergeFrom(ByteString data) {
-      return WeakMergeFrom(data); 
-    }
-
-    IBuilderLite IBuilderLite.WeakMergeFrom(ByteString data, ExtensionRegistryLite registry) {
-      throw new NotImplementedException();
-    }
-
-    IBuilderLite IBuilderLite.WeakMergeFrom(CodedInputStream input) {
-      return WeakMergeFrom(input);
-    }
-
-    IBuilderLite IBuilderLite.WeakMergeFrom(CodedInputStream input, ExtensionRegistryLite registry) {
-      throw new NotImplementedException();
-    }
-
-    IMessageLite IBuilderLite.WeakBuild() {
-      return WeakBuild(); 
-    }
-
-    IMessageLite IBuilderLite.WeakBuildPartial() {
-      return WeakBuildPartial(); 
-    }
-
-    IBuilderLite IBuilderLite.WeakClone() {
-      return WeakClone(); 
-    }
-
-    IMessageLite IBuilderLite.WeakDefaultInstanceForType {
-      get { return WeakDefaultInstanceForType; }
-    }
-
-    public TBuilder MergeFrom(IMessageLite other) {
-      throw new NotImplementedException();
-    }
+	}
+	#endregion
   }
 }
diff --git a/src/ProtocolBuffers/DynamicMessage.cs b/src/ProtocolBuffers/DynamicMessage.cs
index 0653fcf..12f2186 100644
--- a/src/ProtocolBuffers/DynamicMessage.cs
+++ b/src/ProtocolBuffers/DynamicMessage.cs
@@ -338,7 +338,7 @@
           get { return fields.IsInitializedWithRespectTo(type); }
       }
 
-      public override Builder MergeFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry) {
+      public override Builder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) {
         UnknownFieldSet.Builder unknownFieldsBuilder = UnknownFieldSet.CreateBuilder(unknownFields);
         unknownFieldsBuilder.MergeFrom(input, extensionRegistry, this);
         unknownFields = unknownFieldsBuilder.Build();
diff --git a/src/ProtocolBuffers/ExtensionRegistry.cs b/src/ProtocolBuffers/ExtensionRegistry.cs
index 32408b0..02c751a 100644
--- a/src/ProtocolBuffers/ExtensionRegistry.cs
+++ b/src/ProtocolBuffers/ExtensionRegistry.cs
@@ -107,7 +107,7 @@
     /// <summary>
     /// Construct a new, empty instance.
     /// </summary>
-    public static new ExtensionRegistry CreateInstance() {
+    public static ExtensionRegistry CreateInstance() {
       return new ExtensionRegistry(new Dictionary<string, ExtensionInfo>(),
         new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(), false);
     }
@@ -115,7 +115,7 @@
     /// <summary>
     /// Get the unmodifiable singleton empty instance.
     /// </summary>
-    public new static ExtensionRegistry Empty {
+    public static ExtensionRegistry Empty {
       get { return empty; }
     }
 
diff --git a/src/ProtocolBuffers/ExtensionRegistryLite.cs b/src/ProtocolBuffers/ExtensionRegistryLite.cs
index b054823..8518cd1 100644
--- a/src/ProtocolBuffers/ExtensionRegistryLite.cs
+++ b/src/ProtocolBuffers/ExtensionRegistryLite.cs
@@ -103,7 +103,7 @@
       this.extensionsByNumber = extensionsByNumber;
       this.readOnly = readOnly;
     }
-
+#if LITE
     /// <summary>
     /// Construct a new, empty instance.
     /// </summary>
@@ -118,7 +118,7 @@
     public static ExtensionRegistryLite Empty {
       get { return empty; }
     }
-
+#endif
     public ExtensionRegistryLite AsReadOnly() {
       return MakeReadOnly();
     }
diff --git a/src/ProtocolBuffers/GeneratedExtensionLite.cs b/src/ProtocolBuffers/GeneratedExtensionLite.cs
index 2679451..9b3cf50 100644
--- a/src/ProtocolBuffers/GeneratedExtensionLite.cs
+++ b/src/ProtocolBuffers/GeneratedExtensionLite.cs
@@ -7,18 +7,4 @@
     object ContainingType { get; }
     IMessageLite MessageDefaultInstance { get; }
   }
-
-  public class GeneratedExtensionLite : IGeneratedExtensionLite {
-    public int Number {
-      get { throw new NotImplementedException(); }
-    }
-
-    public object ContainingType {
-      get { throw new NotImplementedException(); }
-    }
-
-    public IMessageLite MessageDefaultInstance {
-      get { throw new NotImplementedException(); }
-    }
-  }
 }
\ No newline at end of file
diff --git a/src/ProtocolBuffers/UnknownFieldSet.cs b/src/ProtocolBuffers/UnknownFieldSet.cs
index e982e31..476a875 100644
--- a/src/ProtocolBuffers/UnknownFieldSet.cs
+++ b/src/ProtocolBuffers/UnknownFieldSet.cs
@@ -504,7 +504,7 @@
             break;
           }
 
-          ExtensionRegistry extensionRegistry = (extensionRegistryLite as ExtensionRegistry) ?? ExtensionRegistry.CreateInstance();
+          ExtensionRegistry extensionRegistry = (ExtensionRegistry)extensionRegistryLite;
           if (!MergeFieldFrom(input, extensionRegistry, builder, tag)) {
             // end group tag
             break;