diff --git a/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java b/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java
index 613512d..701212a 100644
--- a/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java
+++ b/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java
@@ -468,45 +468,9 @@
 
             try
             {
-                int[] priorities = repositoryManager.getPriorityLevels();
-
-                outer: for ( int i = 0; i < priorities.length; i++ )
+                if ( !findInContext( requirement, ctx ) ) 
                 {
-                    List<ISigilBundle> providers = findProvidersAtPriority( priorities[i], requirement, ctx );
-
-                    if ( !providers.isEmpty() && !ctx.monitor.isCanceled() )
-                    {
-                        if ( providers.size() > 1 )
-                        {
-                            Collections.sort( providers, new BundleOrderComparator( requirement ) );
-                        }
-
-                        for ( ISigilBundle provider : providers )
-                        {
-                            // reset validity - if there's another provider it can still be solved
-                            ctx.setValid( true );
-                            if ( ctx.resolution.addProvider( requirement, provider ) )
-                            {
-                                if ( ctx.config.isDependents() )
-                                {
-                                    resolveElement( provider, ctx );
-                                }
-
-                                if ( ctx.isValid() )
-                                {
-                                    break outer;
-                                }
-                                else
-                                {
-                                    ctx.resolution.removeProvider( requirement, provider );
-                                }
-                            }
-                            else
-                            {
-                                break outer;
-                            }
-                        }
-                    }
+                    findInRepositories( requirement, ctx );
                 }
             }
             finally
@@ -517,6 +481,75 @@
     }
 
 
+    private boolean findInContext(final IRequirementModelElement requirement,
+        final ResolutionContext ctx)
+    {
+        for ( final ISigilBundle b : ctx.resolution.providees.keySet() ) 
+        {
+            b.visit( new IModelWalker() 
+            {
+                public boolean visit(IModelElement element)
+                {
+                    if ( requirement.accepts(element) ) {
+                        ctx.resolution.addProvider( requirement, b );
+                        return false;
+                    }
+                    return !ctx.monitor.isCanceled();
+                }
+                
+            });
+        }
+        
+        return ctx.resolution.getProvider(requirement) != null;
+    }
+
+
+    private void findInRepositories(IRequirementModelElement requirement,
+        ResolutionContext ctx) throws ResolutionException
+    {
+        int[] priorities = repositoryManager.getPriorityLevels();
+
+        outer: for ( int i = 0; i < priorities.length; i++ )
+        {
+            List<ISigilBundle> providers = findProvidersAtPriority( priorities[i], requirement, ctx );
+
+            if ( !providers.isEmpty() && !ctx.monitor.isCanceled() )
+            {
+                if ( providers.size() > 1 )
+                {
+                    Collections.sort( providers, new BundleOrderComparator( requirement ) );
+                }
+
+                for ( ISigilBundle provider : providers )
+                {
+                    // reset validity - if there's another provider it can still be solved
+                    ctx.setValid( true );
+                    if ( ctx.resolution.addProvider( requirement, provider ) )
+                    {
+                        if ( ctx.config.isDependents() )
+                        {
+                            resolveElement( provider, ctx );
+                        }
+
+                        if ( ctx.isValid() )
+                        {
+                            break outer;
+                        }
+                        else
+                        {
+                            ctx.resolution.removeProvider( requirement, provider );
+                        }
+                    }
+                    else
+                    {
+                        break outer;
+                    }
+                }
+            }
+        }
+    }
+
+
     private List<ISigilBundle> findProvidersAtPriority( int i, IRequirementModelElement requirement, ResolutionContext ctx )
         throws ResolutionException
     {
