Index: InversionOfControl/Castle.MicroKernel.Tests/Bugs/IoC_141.cs
===================================================================
--- InversionOfControl/Castle.MicroKernel.Tests/Bugs/IoC_141.cs	(revision 0)
+++ InversionOfControl/Castle.MicroKernel.Tests/Bugs/IoC_141.cs	(revision 0)
@@ -0,0 +1,69 @@
+using Castle.MicroKernel.Handlers;
+using NUnit.Framework;
+
+namespace Castle.MicroKernel.Tests.Bugs
+{
+	[TestFixture]
+	public class IoC_141
+	{
+		[Test]
+		public void Can_resolve_open_generic_service_with_closed_generic_parameter()
+		{
+			var kernel = new DefaultKernel();
+			kernel.AddComponent("processor", typeof(IProcessor<>), typeof(DefaultProcessor<>));
+			kernel.AddComponent("assembler", typeof(IAssembler<object>), typeof(ObjectAssembler));
+			Assert.IsInstanceOfType(typeof(DefaultProcessor<object>), kernel.Resolve<IProcessor<object>>());
+		}
+
+		[Test]
+		public void Can_resolve_service_with_open_generic_parameter_with_closed_generic_parameter()
+		{
+			var kernel = new DefaultKernel();
+			kernel.AddComponent("service1", typeof(IService), typeof(Service1));
+			kernel.AddComponent("processor", typeof(IProcessor<>), typeof(DefaultProcessor<>));
+			kernel.AddComponent("assembler", typeof(IAssembler<object>), typeof(ObjectAssembler));
+			Assert.IsInstanceOfType(typeof(Service1), kernel.Resolve<IService>());
+		}
+
+		[Test]
+		[ExpectedException(typeof(HandlerException))]
+		public void Throws_right_exception_when_not_found_matching_generic_service()
+		{
+			var kernel = new DefaultKernel();
+			kernel.AddComponent("processor", typeof(IProcessor<>), typeof(DefaultProcessor<>));
+			kernel.AddComponent("assembler", typeof(IAssembler<object>), typeof(ObjectAssembler));
+			kernel.Resolve<IProcessor<int>>();
+		}
+
+		public interface IService
+		{
+		}
+
+		public interface IProcessor<T>
+		{
+		}
+
+		public interface IAssembler<T>
+		{
+		}
+
+		public class Service1 : IService
+		{
+			public Service1(IProcessor<object> processor)
+			{
+			}
+		}
+
+		public class DefaultProcessor<T> : IProcessor<T>
+		{
+			public DefaultProcessor(IAssembler<T> assembler)
+			{
+			}
+		}
+
+		public class ObjectAssembler : IAssembler<object>
+		{
+		}
+	}
+
+}
\ No newline at end of file
Index: InversionOfControl/Castle.MicroKernel.Tests/Castle.MicroKernel.Tests-vs2008.csproj
===================================================================
--- InversionOfControl/Castle.MicroKernel.Tests/Castle.MicroKernel.Tests-vs2008.csproj	(revision 5511)
+++ InversionOfControl/Castle.MicroKernel.Tests/Castle.MicroKernel.Tests-vs2008.csproj	(working copy)
@@ -119,6 +119,7 @@
     <Compile Include="Bugs\Ioc113\IoC_113.cs" />
     <Compile Include="Bugs\Ioc113\SdiComponentMethods.cs" />
     <Compile Include="Bugs\Ioc113\StartableDisposableAndInitializableComponent.cs" />
+    <Compile Include="Bugs\IoC_141.cs" />
     <Compile Include="ClassComponents\BaseComponent.cs" />
     <Compile Include="ClassComponents\ClassWithArrayConstructor.cs" />
     <Compile Include="ClassComponents\ClassWithListConstructor.cs">
Index: InversionOfControl/Castle.MicroKernel/Handlers/AbstractHandler.cs
===================================================================
--- InversionOfControl/Castle.MicroKernel/Handlers/AbstractHandler.cs	(revision 5511)
+++ InversionOfControl/Castle.MicroKernel/Handlers/AbstractHandler.cs	(working copy)
@@ -243,7 +243,7 @@
 
 					if (handler == null)
 					{
-						sb.AppendFormat("- {0} which was not registered. \r\n", type.FullName);
+						sb.AppendFormat("- {0} which was not registered. \r\n", type.FullName ?? type.Name);
 					}
 					else if (handler == this)
 					{
Index: InversionOfControl/Castle.MicroKernel/Handlers/DefaultHandler.cs
===================================================================
--- InversionOfControl/Castle.MicroKernel/Handlers/DefaultHandler.cs	(revision 5511)
+++ InversionOfControl/Castle.MicroKernel/Handlers/DefaultHandler.cs	(working copy)
@@ -42,7 +42,10 @@
 		{
 			if (!context.HasAdditionalParameters)
 			{
-				AssertNotWaitingForDependency();
+				if (CurrentState != HandlerState.Valid && !CanResolvePendingDependencies(context))
+				{
+					AssertNotWaitingForDependency();
+				}
 			}
 
 			using(CreationContext.ResolutionContext resCtx = context.EnterResolutionContext(this))
@@ -57,6 +60,29 @@
 			}
 		}
 
+		private bool CanResolvePendingDependencies(CreationContext context)
+		{
+			// detect circular dependencies
+			if (context.HandlerIsCurrentlyBeingResolved(this))
+				return false;
+
+			foreach (DictionaryEntry kvp in new Hashtable(DependenciesByService))
+			{
+				Type service = (Type)kvp.Key;
+
+				// a self-dependency is not allowed
+				var handler = Kernel.GetHandler(service);
+				if (handler == this)
+					return false;
+
+				// ask the kernel
+				if (!Kernel.HasComponent(service))
+					return false;
+			}
+			
+			return DependenciesByKey.Count == 0;
+		}
+
 		/// <summary>
 		/// disposes the component instance (or recycle it)
 		/// </summary>
