Index: Castle.MicroKernel.Tests/Castle.MicroKernel.Tests-vs2008.csproj
===================================================================
--- Castle.MicroKernel.Tests/Castle.MicroKernel.Tests-vs2008.csproj	(revision 5355)
+++ Castle.MicroKernel.Tests/Castle.MicroKernel.Tests-vs2008.csproj	(working copy)
@@ -1,7 +1,7 @@
 ﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
   <PropertyGroup>
     <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{EF9313A4-C6E0-40F7-9E3F-530D547D3AEF}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -130,10 +130,14 @@
     <Compile Include="ClassComponents\CommonServiceUser2.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="ClassComponents\CommonSub1Impl.cs" />
+    <Compile Include="ClassComponents\CommonSub2Impl.cs" />
     <Compile Include="ClassComponents\ComponentFactory.cs">
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="ClassComponents\CommonImplWithDependancy.cs" />
+    <Compile Include="ClassComponents\ICommonSub1.cs" />
+    <Compile Include="ClassComponents\ICommonSub2.cs" />
     <Compile Include="ClassComponents\NonPublicComponent.cs" />
     <Compile Include="ClassComponents\CustomerValidator.cs" />
     <Compile Include="ClassComponents\IValidator.cs" />
Index: Castle.MicroKernel.Tests/ClassComponents/CommonSub1Impl.cs
===================================================================
--- Castle.MicroKernel.Tests/ClassComponents/CommonSub1Impl.cs	(revision 0)
+++ Castle.MicroKernel.Tests/ClassComponents/CommonSub1Impl.cs	(revision 0)
@@ -0,0 +1,6 @@
+namespace Castle.MicroKernel.Tests.ClassComponents
+{
+    public class CommonSub1Impl : ICommonSub1
+    {
+    }
+}
\ No newline at end of file
Index: Castle.MicroKernel.Tests/ClassComponents/CommonSub2Impl.cs
===================================================================
--- Castle.MicroKernel.Tests/ClassComponents/CommonSub2Impl.cs	(revision 0)
+++ Castle.MicroKernel.Tests/ClassComponents/CommonSub2Impl.cs	(revision 0)
@@ -0,0 +1,6 @@
+namespace Castle.MicroKernel.Tests.ClassComponents
+{
+    public class CommonSub2Impl : ICommonSub2
+    {
+    }
+}
\ No newline at end of file
Index: Castle.MicroKernel.Tests/ClassComponents/ICommonSub1.cs
===================================================================
--- Castle.MicroKernel.Tests/ClassComponents/ICommonSub1.cs	(revision 0)
+++ Castle.MicroKernel.Tests/ClassComponents/ICommonSub1.cs	(revision 0)
@@ -0,0 +1,6 @@
+namespace Castle.MicroKernel.Tests.ClassComponents
+{
+    public interface ICommonSub1 : ICommon
+    {
+    }
+}
\ No newline at end of file
Index: Castle.MicroKernel.Tests/ClassComponents/ICommonSub2.cs
===================================================================
--- Castle.MicroKernel.Tests/ClassComponents/ICommonSub2.cs	(revision 0)
+++ Castle.MicroKernel.Tests/ClassComponents/ICommonSub2.cs	(revision 0)
@@ -0,0 +1,6 @@
+namespace Castle.MicroKernel.Tests.ClassComponents
+{
+    public interface ICommonSub2 : ICommon
+    {
+    }
+}
\ No newline at end of file
Index: Castle.MicroKernel.Tests/Registration/AllTypesTestCase.cs
===================================================================
--- Castle.MicroKernel.Tests/Registration/AllTypesTestCase.cs	(revision 5355)
+++ Castle.MicroKernel.Tests/Registration/AllTypesTestCase.cs	(working copy)
@@ -80,6 +80,30 @@
 			Assert.AreNotEqual(0, handlers.Length);
 		}
 
+        [Test]
+        public void RegisterAssemblyTypes_LookupInterfaceService_RegisteredInContainer()
+        {
+            kernel.Register(AllTypes.Of<ICommon>()
+                .FromAssembly(Assembly.GetExecutingAssembly())
+                .WithService.FromInterface(typeof(ICommon))
+                );
+
+            IHandler[] handlers = kernel.GetHandlers(typeof(ICommon));
+            Assert.AreEqual(0, handlers.Length);
+
+            handlers = kernel.GetHandlers(typeof(ICommonSub1));
+            Assert.AreNotEqual(0, handlers.Length);
+
+            handlers = kernel.GetAssignableHandlers(typeof(ICommonSub1));
+            Assert.AreNotEqual(0, handlers.Length);
+
+            handlers = kernel.GetHandlers(typeof(ICommonSub2));
+            Assert.AreNotEqual(0, handlers.Length);
+
+            handlers = kernel.GetAssignableHandlers(typeof(ICommonSub2));
+            Assert.AreNotEqual(0, handlers.Length);
+        }
+
 		[Test]
 		public void RegisterAssemblyTypes_DefaultService_RegisteredInContainer()
 		{
Index: Castle.MicroKernel/Registration/Strategies/ServiceDescriptor.cs
===================================================================
--- Castle.MicroKernel/Registration/Strategies/ServiceDescriptor.cs	(revision 5355)
+++ Castle.MicroKernel/Registration/Strategies/ServiceDescriptor.cs	(working copy)
@@ -70,6 +70,35 @@
 				return (first != null) ? new Type[] { first } : null;
 			});
 		}
+
+        /// <summary>
+        /// Uses <paramref name="implements"/> to lookup the sub interface.
+        /// For example: if you have IService and 
+        /// IProductService : ISomeInterface, IService, ISomeOtherInterface.
+        /// When you call FromInterface(typeof(IService)) then IProductService
+        /// will be used. Useful when you want to register _all_ your services
+        /// and but not want to specify all of them.
+        /// </summary>
+        /// <param name="implements"></param>
+        /// <returns></returns>
+        public BasedOnDescriptor FromInterface(Type implements)
+        {
+            useBaseType = false;
+            return Select(delegate(Type type, Type baseType)
+            {
+                Type first = null;
+                Type[] interfaces = type.GetInterfaces();
+                foreach (Type theInterface in interfaces)
+                {
+                    if (theInterface.GetInterface(implements.FullName) != null)
+                    {
+                        first = theInterface;
+                        break;
+                    }
+                }
+                return (first != null) ? new Type[] { first } : null;
+            });
+        }
 		
 		/// <summary>
 		/// Assigns a custom service selection strategy.
