diff --git a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java
index 7ab41a4..20b6566 100644
--- a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -2566,7 +2566,7 @@
     {
         // First, get all exporters of the package.
         ExportedPackage[] pkgs = null;
-        IModule[] exporters = m_policyCore.getInUseExporters(new R4Import(name, null, null));
+        IModule[] exporters = m_policyCore.getInUseExporters(new R4Import(name, null, null), true);
         if (exporters != null)
         {
             pkgs = new ExportedPackage[exporters.length];
@@ -2682,7 +2682,7 @@
                     // "in use" exporters of the package.
                     IModule[] inUseModules =
                         m_policyCore.getInUseExporters(
-                            new R4Import(exports[expIdx].getName(), null, null));
+                            new R4Import(exports[expIdx].getName(), null, null), true);
                     // Search through the current providers to find the target
                     // module.
                     for (int i = 0; (inUseModules != null) && (i < inUseModules.length); i++)
diff --git a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
index 30020d3..7b6694c 100755
--- a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
+++ b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
@@ -557,8 +557,7 @@
                 // Select the first candidate that successfully resolves.
 
                 // First check already resolved exports for a match.
-                IModule[] candidates = getCompatibleExporters(
-                    (IModule[]) m_inUsePkgMap.get(impMatch.getName()), impMatch, false);
+                IModule[] candidates = getInUseExporters(impMatch, false);
                 // If there is an "in use" candidate, just take the first one.
                 if (candidates.length > 0)
                 {
@@ -569,8 +568,7 @@
                 // candidates.
                 if (candidate == null)
                 {
-                    candidates = getCompatibleExporters(
-                        (IModule[]) m_availPkgMap.get(impMatch.getName()), impMatch, false);
+                    candidates = getAvailableExporters(impMatch, false);
                     for (int candIdx = 0;
                         (candidate == null) && (candIdx < candidates.length);
                         candIdx++)
@@ -684,25 +682,25 @@
         return null;
     }
 
-    public IModule[] getAvailableExporters(R4Import pkg)
+    public IModule[] getAvailableExporters(R4Import pkg, boolean includeRemovalPending)
     {
         // Synchronized on the module manager to make sure that no
         // modules are added, removed, or resolved.
         synchronized (m_factory)
         {
             return getCompatibleExporters(
-                (IModule[]) m_availPkgMap.get(pkg.getName()), pkg, false);
+                (IModule[]) m_availPkgMap.get(pkg.getName()), pkg, includeRemovalPending);
         }
     }
 
-    public IModule[] getInUseExporters(R4Import pkg)
+    public IModule[] getInUseExporters(R4Import pkg, boolean includeRemovalPending)
     {
         // Synchronized on the module manager to make sure that no
         // modules are added, removed, or resolved.
         synchronized (m_factory)
         {
             return getCompatibleExporters(
-                (IModule[]) m_inUsePkgMap.get(pkg.getName()), pkg, true);
+                (IModule[]) m_inUsePkgMap.get(pkg.getName()), pkg, includeRemovalPending);
         }
     }
 
@@ -811,12 +809,8 @@
             // package maps. Candidates "in use" have higher priority
             // than "available" ones, so put the "in use" candidates
             // at the front of the list of candidates.
-            IModule[] inuse = getCompatibleExporters(
-                (IModule[]) m_inUsePkgMap.get(
-                    imports[impIdx].getName()), imports[impIdx], false);
-            IModule[] available = getCompatibleExporters(
-                (IModule[]) m_availPkgMap.get(
-                    imports[impIdx].getName()), imports[impIdx], false);
+            IModule[] inuse = getInUseExporters(imports[impIdx], false);
+            IModule[] available = getAvailableExporters(imports[impIdx], false);
             IModule[] candidates = new IModule[inuse.length + available.length];
             System.arraycopy(inuse, 0, candidates, 0, inuse.length);
             System.arraycopy(available, 0, candidates, inuse.length, available.length);
@@ -1700,13 +1694,13 @@
                     // Try to see if there is an exporter available. It may be
                     // the case that the package is exported, but the attributes
                     // do not match, so check that case too.
-                    IModule[] exporters = getInUseExporters(imports[i]);
+                    IModule[] exporters = getInUseExporters(imports[i], true);
                     exporters = (exporters.length == 0)
-                        ? getAvailableExporters(imports[i]) : exporters;
+                        ? getAvailableExporters(imports[i], true) : exporters;
                     exporters = (exporters.length == 0)
-                        ? getInUseExporters(new R4Import(pkgName, null, null)) : exporters;
+                        ? getInUseExporters(new R4Import(pkgName, null, null), true) : exporters;
                     exporters = (exporters.length == 0)
-                        ? getAvailableExporters(new R4Import(pkgName, null, null)) : exporters;
+                        ? getAvailableExporters(new R4Import(pkgName, null, null), true) : exporters;
                     long expId = (exporters.length == 0)
                         ? -1 : Util.getBundleIdFromModuleId(exporters[0].getId());
 
@@ -1755,13 +1749,13 @@
                 // Try to see if there is an exporter available. It may be
                 // the case that the package is exported, but the attributes
                 // do not match, so check that case too.
-                IModule[] exporters = getInUseExporters(imp);
+                IModule[] exporters = getInUseExporters(imp, true);
                 exporters = (exporters.length == 0)
-                    ? getAvailableExporters(imp) : exporters;
+                    ? getAvailableExporters(imp, true) : exporters;
                 exporters = (exporters.length == 0)
-                    ? getInUseExporters(new R4Import(pkgName, null, null)) : exporters;
+                    ? getInUseExporters(new R4Import(pkgName, null, null), true) : exporters;
                 exporters = (exporters.length == 0)
-                    ? getAvailableExporters(new R4Import(pkgName, null, null)) : exporters;
+                    ? getAvailableExporters(new R4Import(pkgName, null, null), true) : exporters;
                 long expId = (exporters.length == 0)
                     ? -1 : Util.getBundleIdFromModuleId(exporters[0].getId());
 
@@ -1793,9 +1787,9 @@
         // see if there is an exporter for the package.
         if (!imported)
         {
-            IModule[] exporters = getInUseExporters(new R4Import(pkgName, null, null));
+            IModule[] exporters = getInUseExporters(new R4Import(pkgName, null, null), true);
             exporters = (exporters.length == 0)
-                ? getAvailableExporters(new R4Import(pkgName, null, null)) : exporters;
+                ? getAvailableExporters(new R4Import(pkgName, null, null), true) : exporters;
             if (exporters.length > 0)
             {
                 exported = true;
