diff --git a/resolver/src/main/java/org/apache/felix/resolver/Candidates.java b/resolver/src/main/java/org/apache/felix/resolver/Candidates.java
index ea2621e..409a770 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/Candidates.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/Candidates.java
@@ -67,12 +67,6 @@
 
     /**
      * Private copy constructor used by the copy() method.
-     *
-     * @param dependentMap the capability dependency map.
-     * @param candidateMap the requirement candidate map.
-     * @param hostFragments the fragment map.
-     * @param wrappedHosts the wrapped hosts map.
-     * @param substitutableMap
      */
     private Candidates(
         Set<Resource> mandatoryResources,
@@ -173,10 +167,11 @@
     /**
      * Populates candidates for the specified revision.
      *
-     * @param state the resolver state used for populating the candidates.
-     * @param revision the revision whose candidates should be populated.
+     * @param rc the resolver state used for populating the candidates.
+     * @param resource the revision whose candidates should be populated.
      */
 // TODO: FELIX3 - Modify to not be recursive.
+    @SuppressWarnings("unchecked")
     private void populateResource(ResolveContext rc, Resource resource) throws ResolutionException
     {
         // Determine if we've already calculated this revision's candidates.
@@ -222,8 +217,7 @@
         else if (cacheValue != null)
         {
             // Increment and get the cycle count.
-            cycleCount = (Integer) (((Object[]) cacheValue)[0] =
-                new Integer(((Integer) ((Object[]) cacheValue)[0]).intValue() + 1));
+            cycleCount = (Integer) (((Object[]) cacheValue)[0] = (Integer) ((Object[]) cacheValue)[0] + 1);
             // Get the already populated candidates.
             localCandidateMap = (Map) ((Object[]) cacheValue)[1];
             // Get the remaining requirements.
@@ -236,14 +230,14 @@
         if ((remainingReqs == null) && (localCandidateMap == null))
         {
             // Record cycle count.
-            cycleCount = new Integer(0);
+            cycleCount = 0;
 
             // Create a local map for populating candidates first, just in case
             // the revision is not resolvable.
-            localCandidateMap = new HashMap();
+            localCandidateMap = new HashMap<Requirement, List<Capability>>();
 
             // Create a modifiable list of the revision's requirements.
-            remainingReqs = new ArrayList(resource.getRequirements(null));
+            remainingReqs = new ArrayList<Requirement>(resource.getRequirements(null));
 
             // Add these value to the result cache so we know we are
             // in the middle of populating candidates for the current
@@ -309,11 +303,11 @@
 
         // If we are exiting from a cycle then decrement
         // cycle counter, otherwise record the result.
-        if (cycleCount.intValue() > 0)
+        if (cycleCount > 0)
         {
-            ((Object[]) cacheValue)[0] = new Integer(cycleCount.intValue() - 1);
+            ((Object[]) cacheValue)[0] = cycleCount - 1;
         }
-        else if (cycleCount.intValue() == 0)
+        else if (cycleCount == 0)
         {
             // Record that the revision was successfully populated.
             m_populateResultCache.put(resource, Boolean.TRUE);
@@ -503,7 +497,7 @@
             return false;
         }
 
-        switch (substituteState.intValue())
+        switch (substituteState)
         {
             case PROCESSING:
                 // found a cycle mark the initiator as not substituted
@@ -529,9 +523,8 @@
         List<Capability> substitutes = m_candidateMap.get(substitutableReq);
         if (substitutes != null)
         {
-            for (Iterator<Capability> iSubstitutes = substitutes.iterator(); iSubstitutes.hasNext();)
+            for (Capability substituteCandidate : substitutes)
             {
-                Capability substituteCandidate = iSubstitutes.next();
                 if (substituteCandidate.getResource().equals(substitutableCap.getResource()))
                 {
                     substituteStatuses.put(substitutableCap, EXPORTED);
@@ -585,8 +578,8 @@
      * fragments, since fragment capabilities only appear once, but technically
      * each host represents a unique capability.
      *
-     * @param state the resolver state.
-     * @param revision the revision being resolved.
+     * @param rc the resolver state.
+     * @param resource the revision being resolved.
      * @param candidates the candidates to process.
      * @return a resolve exception to be re-thrown, if any, or null.
      */
@@ -831,7 +824,7 @@
      * satisfied by the fragment will end up having the two hosts as potential
      * candidates, rather than the single fragment.
      *
-     * @throws ResolutionException if the removal of any unselected fragments
+     * @throws org.osgi.service.resolver.ResolutionException if the removal of any unselected fragments
      * result in the root module being unable to resolve.
      */
     public void prepare(ResolveContext rc) throws ResolutionException
@@ -840,7 +833,7 @@
         // the fragment map maps a fragment symbolic name to a map that maps
         // a version to a list of fragments requirements matching that symbolic
         // name and version.
-        Map<Capability, Map<String, Map<Version, List<Requirement>>>> hostFragments = Collections.EMPTY_MAP;
+        Map<Capability, Map<String, Map<Version, List<Requirement>>>> hostFragments = Collections.emptyMap();
         if (m_fragmentsPresent)
         {
             hostFragments = populateDependents();
@@ -1106,8 +1099,8 @@
      * become unresolved if they depended on the module's capabilities and there
      * is no other candidate.
      *
-     * @param revision the module to remove.
-     * @throws ResolveException if removing the module caused the resolve to
+     * @param resource the module to remove.
+     * @throws ResolutionException if removing the module caused the resolve to
      * fail.
      */
     private void removeResource(Resource resource, ResolutionException ex)
@@ -1133,11 +1126,11 @@
      * involves removing its requirements and its capabilities. This may cause
      * other modules to become unresolved as a result.
      *
-     * @param br the module to remove.
-     * @param unresolvedRevisions a list to containing any additional modules
+     * @param resource the module to remove.
+     * @param unresolvedResources a list to containing any additional modules
      * that that became unresolved as a result of removing this module and will
      * also need to be removed.
-     * @throws ResolveException if removing the module caused the resolve to
+     * @throws ResolutionException if removing the module caused the resolve to
      * fail.
      */
     private void remove(Resource resource, Set<Resource> unresolvedResources)
@@ -1161,8 +1154,6 @@
      */
     private void remove(Requirement req)
     {
-        boolean isFragment = req.getNamespace().equals(HostNamespace.HOST_NAMESPACE);
-
         List<Capability> candidates = m_candidateMap.remove(req);
         if (candidates != null)
         {
@@ -1182,10 +1173,10 @@
      * other modules to become unresolved as a result.
      *
      * @param c the capability to remove.
-     * @param unresolvedRevisions a list to containing any additional modules
+     * @param unresolvedResources a list to containing any additional modules
      * that that became unresolved as a result of removing this module and will
      * also need to be removed.
-     * @throws ResolveException if removing the module caused the resolve to
+     * @throws ResolutionException if removing the module caused the resolve to
      * fail.
      */
     private void remove(Capability c, Set<Resource> unresolvedResources)
diff --git a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
index 63516d5..1a032dc 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
@@ -120,8 +120,8 @@
             new HashMap<Resource, Packages>();
 
         // Make copies of arguments in case we want to modify them.
-        Collection<Resource> mandatoryResources = new ArrayList(rc.getMandatoryResources());
-        Collection<Resource> optionalResources = new ArrayList(rc.getOptionalResources());
+        Collection<Resource> mandatoryResources = new ArrayList<Resource>(rc.getMandatoryResources());
+        Collection<Resource> optionalResources = new ArrayList<Resource>(rc.getOptionalResources());
         // keeps track of valid on demand fragments that we have seen.
         // a null value or TRUE indicate it is valid
         Map<Resource, Boolean> validOnDemandResources = new HashMap<Resource, Boolean>(0);
@@ -311,7 +311,7 @@
                         for (Resource faultyResource : resourceKeys)
                         {
                             Boolean valid = validOnDemandResources.get(faultyResource);
-                            if (valid != null && valid.booleanValue())
+                            if (valid != null && valid)
                             {
                                 // This was an ondemand resource.
                                 // Invalidate it and try again.
@@ -452,7 +452,7 @@
                     // Record the initial candidate permutation.
                     usesPermutations.add(allCandidates);
 
-                    ResolutionException rethrow = null;
+                    ResolutionException rethrow;
 
                     do
                     {
@@ -522,7 +522,7 @@
                                 .getDeclaredRequirement().getResource();
                         }
                         Boolean valid = onDemandResources.get(faultyResource);
-                        if (valid != null && valid.booleanValue())
+                        if (valid != null && valid)
                         {
                             onDemandResources.put(faultyResource, Boolean.FALSE);
                             retry = true;
@@ -596,8 +596,8 @@
         // capability or actual capability if resource is resolved or not.
         // We use parallel lists so we can calculate the packages spaces for
         // resolved and unresolved resources in an identical fashion.
-        List<Requirement> reqs = new ArrayList();
-        List<Capability> caps = new ArrayList();
+        List<Requirement> reqs = new ArrayList<Requirement>();
+        List<Capability> caps = new ArrayList<Capability>();
         boolean isDynamicImporting = false;
         Wiring wiring = session.getContext().getWirings().get(resource);
         if (wiring != null)
@@ -734,10 +734,10 @@
         }
 
         // Third, have all candidates to calculate their package spaces.
-        for (int i = 0; i < caps.size(); i++)
+        for (Capability cap : caps)
         {
             calculatePackageSpaces(
-                session, caps.get(i).getResource(), allCandidates, resourcePkgMap,
+                session, cap.getResource(), allCandidates, resourcePkgMap,
                 usesCycleMap, cycle);
         }
 
@@ -1030,7 +1030,7 @@
                 Blame candExportedBlame = candSourcePkgs.m_exportedPkgs.get(usedPkgName);
                 if (candExportedBlame != null)
                 {
-                    candSourceBlames = new ArrayList(1);
+                    candSourceBlames = new ArrayList<Blame>(1);
                     candSourceBlames.add(candExportedBlame);
                 }
                 else
@@ -1716,7 +1716,7 @@
         if (!rc.getWirings().containsKey(unwrappedResource)
             && !wireMap.containsKey(unwrappedResource))
         {
-            wireMap.put(unwrappedResource, (List<Wire>) Collections.EMPTY_LIST);
+            wireMap.put(unwrappedResource, Collections.<Wire>emptyList());
 
             List<Wire> packageWires = new ArrayList<Wire>();
             List<Wire> bundleWires = new ArrayList<Wire>();
@@ -1882,7 +1882,7 @@
         Map<Resource, Packages> resourcePkgMap,
         Map<Resource, List<Wire>> wireMap, Candidates allCandidates)
     {
-        wireMap.put(resource, (List<Wire>) Collections.EMPTY_LIST);
+        wireMap.put(resource, Collections.<Wire>emptyList());
 
         List<Wire> packageWires = new ArrayList<Wire>();
 
@@ -1949,7 +1949,7 @@
     private static String toStringBlame(
         ResolveContext rc, Candidates allCandidates, Blame blame)
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         if ((blame.m_reqs != null) && !blame.m_reqs.isEmpty())
         {
             for (int i = 0; i < blame.m_reqs.size(); i++)
@@ -2192,10 +2192,10 @@
         {
             if (m_rootCauses == null)
             {
-                return Collections.EMPTY_SET;
+                return Collections.emptySet();
             }
             Set<Capability> result = m_rootCauses.get(req);
-            return result == null ? Collections.EMPTY_SET : result;
+            return result == null ? Collections.<Capability>emptySet() : result;
         }
 
         @Override
