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 d0d3481..ecfe761 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
@@ -542,6 +542,7 @@
         // the module is resolved or not.
         List<Requirement> reqs = new ArrayList();
         List<Capability> caps = new ArrayList();
+        boolean isDynamicImport = false;
         if (module.isResolved())
         {
             // Use wires to get actual requirements and satisfying capabilities.
@@ -567,6 +568,7 @@
                 Capability cap = candCaps.iterator().next();
                 reqs.add(req);
                 caps.add(cap);
+                isDynamicImport = true;
                 // Can only dynamically import one at a time, so break
                 // out of the loop after the first.
                 break;
@@ -614,12 +616,38 @@
         // Fourth, if the target module is unresolved or is dynamically importing,
         // then add all the uses constraints implied by its imported and required
         // packages to its package space.
-        for (Entry<String, List<Blame>> entry : modulePkgs.m_importedPkgs.entrySet())
+        // NOTE: We do not need to do this for resolved modules because their
+        // package space is consistent by definition and these uses constraints
+        // are only needed to verify the consistency of a resolving module. The
+        // only exception is if a resolve module is dynamically importing, then
+        // we need to calculate its uses constraints again to make sure the new
+        // import is consistent with the existing package space.
+        if (!module.isResolved() || isDynamicImport)
         {
-            for (Blame blame : entry.getValue())
+            for (Entry<String, List<Blame>> entry : modulePkgs.m_importedPkgs.entrySet())
             {
-                // Ignore modules that import from themselves.
-                if (!blame.m_cap.getModule().equals(module))
+                for (Blame blame : entry.getValue())
+                {
+                    // Ignore modules that import from themselves.
+                    if (!blame.m_cap.getModule().equals(module))
+                    {
+                        List<Requirement> blameReqs = new ArrayList();
+                        blameReqs.add(blame.m_reqs.get(0));
+
+                        mergeUses(
+                            module,
+                            modulePkgs,
+                            blame.m_cap,
+                            blameReqs,
+                            modulePkgMap,
+                            candidateMap,
+                            usesCycleMap);
+                    }
+                }
+            }
+            for (Entry<String, List<Blame>> entry : modulePkgs.m_requiredPkgs.entrySet())
+            {
+                for (Blame blame : entry.getValue())
                 {
                     List<Requirement> blameReqs = new ArrayList();
                     blameReqs.add(blame.m_reqs.get(0));
@@ -635,23 +663,6 @@
                 }
             }
         }
-        for (Entry<String, List<Blame>> entry : modulePkgs.m_requiredPkgs.entrySet())
-        {
-            for (Blame blame : entry.getValue())
-            {
-                List<Requirement> blameReqs = new ArrayList();
-                blameReqs.add(blame.m_reqs.get(0));
-
-                mergeUses(
-                    module,
-                    modulePkgs,
-                    blame.m_cap,
-                    blameReqs,
-                    modulePkgMap,
-                    candidateMap,
-                    usesCycleMap);
-            }
-        }
     }
 
     private void mergeCandidatePackages(
