diff --git a/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java b/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
index 404daa3..ca7365a 100644
--- a/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
@@ -76,14 +76,11 @@
 
                 ResolveException rethrow = null;
 
-                Map<Capability, Set<Requirement>> capDepSet = new HashMap();
-
                 do
                 {
                     rethrow = null;
 
                     modulePkgMap.clear();
-                    capDepSet.clear();
                     m_packageSourcesCache.clear();
 
                     candidateMap = (m_usesPermutations.size() > 0)
@@ -93,7 +90,7 @@
 
                     calculatePackageSpaces(
                         module, candidateMap, modulePkgMap,
-                        capDepSet, new HashMap(), new HashSet());
+                        new HashMap(), new HashSet());
 //System.out.println("+++ PACKAGE SPACES START +++");
 //dumpModulePkgMap(modulePkgMap);
 //System.out.println("+++ PACKAGE SPACES END +++");
@@ -101,7 +98,7 @@
                     try
                     {
                         checkPackageSpaceConsistency(
-                            module, candidateMap, modulePkgMap, capDepSet, new HashMap());
+                            module, candidateMap, modulePkgMap, new HashMap());
                     }
                     catch (ResolveException ex)
                     {
@@ -161,14 +158,11 @@
 
                 ResolveException rethrow = null;
 
-                Map<Capability, Set<Requirement>> capDepSet = new HashMap();
-
                 do
                 {
                     rethrow = null;
 
                     modulePkgMap.clear();
-                    capDepSet.clear();
 
                     candidateMap = (m_usesPermutations.size() > 0)
                         ? m_usesPermutations.remove(0)
@@ -176,13 +170,12 @@
 
                     calculatePackageSpaces(
                         module, candidateMap, modulePkgMap,
-                        capDepSet, new HashMap(), new HashSet());
+                        new HashMap(), new HashSet());
 
                     try
                     {
                         checkPackageSpaceConsistency(
-                            module, candidateMap, modulePkgMap,
-                            capDepSet, new HashMap());
+                            module, candidateMap, modulePkgMap, new HashMap());
                     }
                     catch (ResolveException ex)
                     {
@@ -537,7 +530,6 @@
         Module module,
         Map<Requirement, Set<Capability>> candidateMap,
         Map<Module, Packages> modulePkgMap,
-        Map<Capability, Set<Requirement>> capDepSet,
         Map<Capability, List<Module>> usesCycleMap,
         Set<Module> cycle)
     {
@@ -610,7 +602,6 @@
             Capability cap = caps.get(i);
             calculateExportedPackages(cap.getModule(), modulePkgMap);
             mergeCandidatePackages(module, req, cap, modulePkgMap, candidateMap);
-            addCapabilityDependency(cap, req, capDepSet);
         }
 
         // Third, ask our candidates to calculate their package spaces.
@@ -618,7 +609,7 @@
         {
             calculatePackageSpaces(
                 caps.get(i).getModule(), candidateMap, modulePkgMap,
-                capDepSet, usesCycleMap, cycle);
+                usesCycleMap, cycle);
         }
 
         // Fourth, add all of the uses constraints implied by our imported
@@ -767,18 +758,6 @@
         }
     }
 
-    private static void addCapabilityDependency(
-        Capability cap, Requirement req, Map<Capability, Set<Requirement>> capDepSet)
-    {
-        Set<Requirement> reqs = capDepSet.get(cap);
-        if (reqs == null)
-        {
-            reqs = new HashSet();
-            capDepSet.put(cap, reqs);
-        }
-        reqs.add(req);
-    }
-
     private void mergeUses(
         Module current, Packages currentPkgs,
         Capability mergeCap, List<Requirement> blameReqs, Map<Module, Packages> modulePkgMap,
@@ -858,8 +837,7 @@
 
     private void checkPackageSpaceConsistency(
         Module module, Map<Requirement, Set<Capability>> candidateMap,
-        Map<Module, Packages> modulePkgMap, Map<Capability, Set<Requirement>> capDepSet,
-        Map<Module, Object> resultCache)
+        Map<Module, Packages> modulePkgMap, Map<Module, Object> resultCache)
     {
         if (module.isResolved())
         {
@@ -1106,7 +1084,7 @@
                     {
                         checkPackageSpaceConsistency(
                             importBlame.m_cap.getModule(), candidateMap, modulePkgMap,
-                            capDepSet, resultCache);
+                            resultCache);
                     }
                     catch (ResolveException ex)
                     {
