diff --git a/pom.xml b/pom.xml
index 30c6b2e..3490ee8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,28 +37,24 @@
   <scm>
     <connection>scm:svn:http://svn.apache.org/repos/asf/maven/shared/trunk/maven-dependency-tree/</connection>
     <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/shared/trunk/maven-dependency-tree/</developerConnection>
-    <url>http://svn.apache.org/viewcvs.cgi/maven/shared/trunk/maven-dependency-tree/</url>
+    <url>http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/</url>
   </scm>
   <issueManagement>
     <system>jira</system>
     <url>http://jira.codehaus.org/browse/MSHARED/component/13264</url>
   </issueManagement>
 
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-artifact</artifactId>
-        <version>2.0.9</version>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
+  <properties>
+    <mavenVersion>2.2.0</mavenVersion>
+  </properties>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-project</artifactId>
-      <version>2.0.8</version>
+      <version>${mavenVersion}</version>
     </dependency>
+
     <dependency>
       <groupId>jmock</groupId>
       <artifactId>jmock</artifactId>
@@ -74,6 +70,19 @@
   </dependencies>
 
   <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <configuration>
+            <source>1.5</source>
+            <target>1.5</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
     <plugins>
       <plugin>
         <groupId>org.codehaus.plexus</groupId>
@@ -88,4 +97,21 @@
       </plugin>
     </plugins>
   </build>
+
+  <profiles>
+    <profile>
+      <id>reporting</id>
+      <reporting>
+        <plugins>
+          <plugin>
+            <artifactId>maven-pmd-plugin</artifactId>
+            <version>2.5</version>
+            <configuration>
+              <targetJdk>1.5</targetJdk>
+            </configuration>
+           </plugin>
+        </plugins>
+      </reporting>
+    </profile>
+  </profiles>
 </project>
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java b/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
index 8d106be..5d0a14f 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -44,7 +45,9 @@
  * @plexus.component role="org.apache.maven.shared.dependency.tree.DependencyTreeBuilder"
  * @see DependencyTreeBuilder
  */
-public class DefaultDependencyTreeBuilder extends AbstractLogEnabled implements DependencyTreeBuilder
+public class DefaultDependencyTreeBuilder
+    extends AbstractLogEnabled
+    implements DependencyTreeBuilder
 {
     // fields -----------------------------------------------------------------
     
@@ -59,13 +62,14 @@
      */
     public DependencyTree buildDependencyTree( MavenProject project, ArtifactRepository repository,
                                                ArtifactFactory factory, ArtifactMetadataSource metadataSource,
-                                               ArtifactCollector collector ) throws DependencyTreeBuilderException
+                                               ArtifactCollector collector )
+        throws DependencyTreeBuilderException
     {
         DependencyNode rootNode = buildDependencyTree( project, repository, factory, metadataSource, null, collector );
-        
+
         CollectingDependencyNodeVisitor collectingVisitor = new CollectingDependencyNodeVisitor();
         rootNode.accept( collectingVisitor );
-        
+
         return new DependencyTree( rootNode, collectingVisitor.getNodes() );
     }
     
@@ -81,17 +85,17 @@
 
         try
         {
-            Map managedVersions = project.getManagedVersionMap();
+            Map<String, Artifact> managedVersions = project.getManagedVersionMap();
 
-            Set dependencyArtifacts = project.getDependencyArtifacts();
+            Set<Artifact> dependencyArtifacts = project.getDependencyArtifacts();
 
             if ( dependencyArtifacts == null )
             {
                 dependencyArtifacts = project.createArtifacts( factory, null, null );
             }
-            
+
             getLogger().debug( "Dependency tree resolution listener events:" );
-            
+
             // TODO: note that filter does not get applied due to MNG-3236
 
             result = collector.collect( dependencyArtifacts, project.getArtifact(), managedVersions, repository,
@@ -110,9 +114,9 @@
                 + project.getArtifact() );
         }
     }
-    
+
     // protected methods ------------------------------------------------------
-    
+
     protected ArtifactResolutionResult getArtifactResolutionResult()
     {
         return result;
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
index 8444256..a73953f 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
@@ -26,6 +26,7 @@
 import java.util.List;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
 import org.apache.maven.shared.dependency.tree.traversal.SerializingDependencyNodeVisitor;
@@ -142,7 +143,7 @@
     /**
      * The list of child dependency nodes of this dependency node.
      */
-    private final List children;
+    private final List<DependencyNode> children;
 
     /**
      * The parent dependency node of this dependency node.
@@ -193,7 +194,7 @@
 
     private VersionRange versionSelectedFromRange;
     
-    private List availableVersions;
+    private List<ArtifactVersion> availableVersions;
 
     // constructors -----------------------------------------------------------
 
@@ -276,7 +277,7 @@
         this.state = state;
         this.relatedArtifact = relatedArtifact;
 
-        children = new ArrayList();
+        children = new ArrayList<DependencyNode>();
     }
     
     /**
@@ -287,7 +288,7 @@
     DependencyNode()
     {
         artifact = null;
-        children = new ArrayList();
+        children = new ArrayList<DependencyNode>();
     }
 
     // public methods ---------------------------------------------------------
@@ -304,13 +305,12 @@
     {
         if ( visitor.visit( this ) )
         {
-            boolean visiting = true;
-
-            for ( Iterator iterator = getChildren().iterator(); visiting && iterator.hasNext(); )
+            for ( DependencyNode child : getChildren() )
             {
-                DependencyNode child = (DependencyNode) iterator.next();
-
-                visiting = child.accept( visitor );
+                if ( !child.accept( visitor ) )
+                {
+                    break;
+                }
             }
         }
 
@@ -369,7 +369,7 @@
      * @return the depth
      * @deprecated As of 1.1, depth is computed by node hierarchy. With the introduction of node
      *             visitors and filters this method can give misleading results. For example, consider
-     *             serialising a tree with a filter using a visitor: this method would return the
+     *             serializing a tree with a filter using a visitor: this method would return the
      *             unfiltered depth of a node, whereas the correct depth would be calculated by the
      *             visitor.
      */
@@ -394,7 +394,7 @@
      * 
      * @return the list of child dependency nodes
      */
-    public List getChildren()
+    public List<DependencyNode> getChildren()
     {
         return Collections.unmodifiableList( children );
     }
@@ -545,12 +545,12 @@
      *         <code>null</code> if the artifact had a explicit version.
      * @since 1.2
      */
-    public List getAvailableVersions()
+    public List<ArtifactVersion> getAvailableVersions()
     {
         return availableVersions;
     }
     
-    public void setAvailableVersions( List availableVersions )
+    public void setAvailableVersions( List<ArtifactVersion> availableVersions )
     {
         this.availableVersions = availableVersions;
     }
@@ -644,7 +644,7 @@
      * @return the preorder traversal iterator
      * @see #preorderIterator()
      */
-    public Iterator iterator()
+    public Iterator<DependencyNode> iterator()
     {
         return preorderIterator();
     }
@@ -655,7 +655,7 @@
      * @return the preorder traversal iterator
      * @see DependencyTreePreorderIterator
      */
-    public Iterator preorderIterator()
+    public Iterator<DependencyNode> preorderIterator()
     {
         return new DependencyTreePreorderIterator( this );
     }
@@ -666,7 +666,7 @@
      * @return the postorder traversal iterator
      * @see DependencyTreeInverseIterator
      */
-    public Iterator inverseIterator()
+    public Iterator<DependencyNode> inverseIterator()
     {
         return new DependencyTreeInverseIterator( this );
     }
@@ -795,9 +795,7 @@
         return hashCode;
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    @Override
     public boolean equals( Object object )
     {
         // TODO: probably better using commons-lang EqualsBuilder
@@ -854,10 +852,8 @@
      */
     private void removeAllChildren()
     {
-        for ( Iterator iterator = children.iterator(); iterator.hasNext(); )
+        for ( DependencyNode child : children )
         {
-            DependencyNode child = (DependencyNode) iterator.next();
-
             child.parent = null;
         }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
index f61ab75..c8437b9 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
@@ -24,6 +24,8 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.maven.artifact.Artifact;
+
 /**
  * Represents a Maven project's dependency tree.
  * 
@@ -37,7 +39,7 @@
 
     private final DependencyNode rootNode;
 
-    private final Collection nodes;
+    private final Collection<DependencyNode> nodes;
 
     // constructors -----------------------------------------------------------
 
@@ -47,7 +49,7 @@
      * @param rootNode
      * @param nodes
      */
-    public DependencyTree( DependencyNode rootNode, Collection nodes )
+    public DependencyTree( DependencyNode rootNode, Collection<DependencyNode> nodes )
     {
         this.rootNode = rootNode;
         this.nodes = nodes;
@@ -60,19 +62,17 @@
         return rootNode;
     }
 
-    public Collection getNodes()
+    public Collection<DependencyNode> getNodes()
     {
         return nodes;
     }
 
-    public List getArtifacts()
+    public List<Artifact> getArtifacts()
     {
-        List artifacts = new ArrayList();
+        List<Artifact> artifacts = new ArrayList<Artifact>();
 
-        Iterator it = getNodes().iterator();
-        while ( it.hasNext() )
+        for ( DependencyNode node : getNodes() )
         {
-            DependencyNode node = (DependencyNode) it.next();
             artifacts.add( node.getArtifact() );
         }
 
@@ -87,7 +87,7 @@
     /**
      * @see DependencyNode#iterator()
      */
-    public Iterator iterator()
+    public Iterator<DependencyNode> iterator()
     {
         return getRootNode().iterator();
     }
@@ -95,7 +95,7 @@
     /**
      * @see DependencyNode#preorderIterator()
      */
-    public Iterator preorderIterator()
+    public Iterator<DependencyNode> preorderIterator()
     {
         return getRootNode().preorderIterator();
     }
@@ -103,7 +103,7 @@
     /**
      * @see DependencyNode#inverseIterator()
      */
-    public Iterator inverseIterator()
+    public Iterator<DependencyNode> inverseIterator()
     {
         return getRootNode().inverseIterator();
     }
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java
index 0e1aad2..005387e 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java
@@ -33,9 +33,9 @@
  * @version $Id$
  */
 public class DependencyTreeInverseIterator
-    implements Iterator
+    implements Iterator<DependencyNode>
 {
-    private Stack nodesToProcess = new Stack();
+    private Stack<DependencyNode> nodesToProcess = new Stack<DependencyNode>();
 
     public DependencyTreeInverseIterator( DependencyNode rootNode )
     {
@@ -51,7 +51,7 @@
         return !nodesToProcess.isEmpty();
     }
 
-    public Object next()
+    public DependencyNode next()
     {
         if ( !hasNext() )
         {
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java
index d11884d..958ce55 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java
@@ -31,9 +31,9 @@
  * @version $Id$
  */
 public class DependencyTreePreorderIterator
-    implements Iterator
+    implements Iterator<DependencyNode>
 {
-    private Stack nodesToProcess = new Stack();
+    private Stack<DependencyNode> nodesToProcess = new Stack<DependencyNode>();
 
     public DependencyTreePreorderIterator( DependencyNode rootNode )
     {
@@ -45,14 +45,14 @@
         return !nodesToProcess.isEmpty();
     }
 
-    public Object next()
+    public DependencyNode next()
     {
         if ( !hasNext() )
         {
             throw new NoSuchElementException();
         }
-        DependencyNode currentNode = (DependencyNode) nodesToProcess.pop();
-        List children = currentNode.getChildren();
+        DependencyNode currentNode = nodesToProcess.pop();
+        List<DependencyNode> children = currentNode.getChildren();
         if ( children != null )
         {
             for ( int i = children.size() - 1; i >= 0; i-- )
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
index 991e01b..f516c73 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
@@ -41,7 +41,8 @@
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @version $Id$
  */
-public class DependencyTreeResolutionListener implements ResolutionListener, ResolutionListenerForDepMgmt
+public class DependencyTreeResolutionListener
+    implements ResolutionListener, ResolutionListenerForDepMgmt
 {
     // fields -----------------------------------------------------------------
     
@@ -53,12 +54,12 @@
     /**
      * The parent dependency nodes of the current dependency node.
      */
-    private final Stack parentNodes;
+    private final Stack<DependencyNode> parentNodes;
 
     /**
      * A map of dependency nodes by their attached artifact.
      */
-    private final Map nodesByArtifact;
+    private final Map<Artifact, DependencyNode> nodesByArtifact;
 
     /**
      * The root dependency node of the computed dependency tree.
@@ -73,12 +74,12 @@
     /**
      * Map &lt; String replacementId, String premanaged version >
      */
-    private Map managedVersions = new HashMap();
+    private Map<String, String> managedVersions = new HashMap<String, String>();
 
     /**
      * Map &lt; String replacementId, String premanaged scope >
      */
-    private Map managedScopes = new HashMap();
+    private Map<String, String> managedScopes = new HashMap<String, String>();
 
     // constructors -----------------------------------------------------------
 
@@ -92,8 +93,8 @@
     {
         this.logger = logger;
         
-        parentNodes = new Stack();
-        nodesByArtifact = new IdentityHashMap();
+        parentNodes = new Stack<DependencyNode>();
+        nodesByArtifact = new IdentityHashMap<Artifact, DependencyNode>();
         rootNode = null;
         currentNode = null;
     }
@@ -129,7 +130,7 @@
      */
     public void endProcessChildren( Artifact artifact )
     {
-        DependencyNode node = (DependencyNode) parentNodes.pop();
+        DependencyNode node = parentNodes.pop();
 
         log( "endProcessChildren: artifact=" + artifact );
         
@@ -371,7 +372,7 @@
      * @return a list of dependency nodes
      * @deprecated As of 1.1, use a {@link CollectingDependencyNodeVisitor} on the root dependency node
      */
-    public Collection getNodes()
+    public Collection<DependencyNode> getNodes()
     {
         return Collections.unmodifiableCollection( nodesByArtifact.values() );
     }
@@ -423,7 +424,7 @@
 
         if ( !parentNodes.isEmpty() )
         {
-            DependencyNode parent = (DependencyNode) parentNodes.peek();
+            DependencyNode parent = parentNodes.peek();
 
             parent.addChild( node );
         }
@@ -444,7 +445,7 @@
     {
         DependencyNode node = createNode( artifact );
 
-        DependencyNode previousNode = (DependencyNode) nodesByArtifact.put( node.getArtifact(), node );
+        DependencyNode previousNode = nodesByArtifact.put( node.getArtifact(), node );
         
         if ( previousNode != null )
         {
@@ -471,7 +472,7 @@
      */
     private DependencyNode getNode( Artifact artifact )
     {
-        return (DependencyNode) nodesByArtifact.get( artifact );
+        return nodesByArtifact.get( artifact );
     }
 
     /**
@@ -482,7 +483,7 @@
      */
     private void removeNode( Artifact artifact )
     {
-        DependencyNode node = (DependencyNode) nodesByArtifact.remove( artifact );
+        DependencyNode node = nodesByArtifact.remove( artifact );
 
         if ( !artifact.equals( node.getArtifact() ) )
         {
@@ -500,19 +501,15 @@
      */
     private boolean isCurrentNodeIncluded()
     {
-        boolean included = true;
-
-        for ( Iterator iterator = parentNodes.iterator(); included && iterator.hasNext(); )
+        for ( DependencyNode node : parentNodes )
         {
-            DependencyNode node = (DependencyNode) iterator.next();
-
             if ( node.getState() != DependencyNode.INCLUDED )
             {
-                included = false;
+                return false;
             }
         }
 
-        return included;
+        return true;
     }
 
     /**
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java b/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java
index d9693f3..decd78f 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java
@@ -20,7 +20,6 @@
  */
 
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.maven.shared.dependency.tree.DependencyNode;
@@ -32,14 +31,15 @@
  * @version $Id$
  * @since 1.1
  */
-public class AncestorOrSelfDependencyNodeFilter implements DependencyNodeFilter
+public class AncestorOrSelfDependencyNodeFilter
+    implements DependencyNodeFilter
 {
     // fields -----------------------------------------------------------------
 
     /**
      * The list of nodes that this filter accepts ancestors-or-self of.
      */
-    private final List descendantNodes;
+    private final List<DependencyNode> descendantNodes;
 
     // constructors -----------------------------------------------------------
 
@@ -55,7 +55,7 @@
      * @param descendantNodes
      *            the list of nodes to accept ancestors-or-self of
      */
-    public AncestorOrSelfDependencyNodeFilter( List descendantNodes )
+    public AncestorOrSelfDependencyNodeFilter( List<DependencyNode> descendantNodes )
     {
         this.descendantNodes = descendantNodes;
     }
@@ -67,19 +67,15 @@
      */
     public boolean accept( DependencyNode node )
     {
-        boolean accept = false;
-
-        for ( Iterator iterator = descendantNodes.iterator(); !accept && iterator.hasNext(); )
+        for ( DependencyNode descendantNode : descendantNodes )
         {
-            DependencyNode descendantNode = (DependencyNode) iterator.next();
-
             if ( isAncestorOrSelf( node, descendantNode ) )
             {
-                accept = true;
+                return true;
             }
         }
 
-        return accept;
+        return false;
     }
 
     // private methods --------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java b/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java
index 0b8c9ac..d1dfad9 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java
@@ -21,7 +21,6 @@
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.maven.shared.dependency.tree.DependencyNode;
@@ -33,14 +32,15 @@
  * @version $Id$
  * @since 1.1
  */
-public class AndDependencyNodeFilter implements DependencyNodeFilter
+public class AndDependencyNodeFilter
+    implements DependencyNodeFilter
 {
     // fields -----------------------------------------------------------------
 
     /**
      * The dependency node filters that this filter ANDs together.
      */
-    private final List filters;
+    private final List<DependencyNodeFilter> filters;
 
     // constructors -----------------------------------------------------------
 
@@ -63,7 +63,7 @@
      * @param filters
      *            the list of dependency node filters to logically AND together
      */
-    public AndDependencyNodeFilter( List filters )
+    public AndDependencyNodeFilter( List<DependencyNodeFilter> filters )
     {
         this.filters = Collections.unmodifiableList( filters );
     }
@@ -75,16 +75,15 @@
      */
     public boolean accept( DependencyNode node )
     {
-        boolean accept = true;
-
-        for ( Iterator iterator = filters.iterator(); accept && iterator.hasNext(); )
+        for ( DependencyNodeFilter filter : filters )
         {
-            DependencyNodeFilter filter = (DependencyNodeFilter) iterator.next();
-
-            accept = filter.accept( node );
+            if ( !filter.accept( node ) )
+            {
+                return false;
+            }
         }
 
-        return accept;
+        return true;
     }
 
     // public methods ---------------------------------------------------------
@@ -94,7 +93,7 @@
      * 
      * @return the dependency node filters that this filter ANDs together
      */
-    public List getDependencyNodeFilters()
+    public List<DependencyNodeFilter> getDependencyNodeFilters()
     {
         return filters;
     }
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java b/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java
index 64c7035..231f6ee 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java
@@ -30,7 +30,8 @@
  * @version $Id$
  * @since 1.1
  */
-public class ArtifactDependencyNodeFilter implements DependencyNodeFilter
+public class ArtifactDependencyNodeFilter
+    implements DependencyNodeFilter
 {
     // fields -----------------------------------------------------------------
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java b/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java
index 468132e..ad611d4 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java
@@ -28,7 +28,8 @@
  * @version $Id$
  * @since 1.1
  */
-public class StateDependencyNodeFilter implements DependencyNodeFilter
+public class StateDependencyNodeFilter
+    implements DependencyNodeFilter
 {
     // constants --------------------------------------------------------------
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java
index 971d0b4..bad8f0b 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java
@@ -31,7 +31,8 @@
  * @version $Id$
  * @since 1.1
  */
-public class BuildingDependencyNodeVisitor implements DependencyNodeVisitor
+public class BuildingDependencyNodeVisitor
+    implements DependencyNodeVisitor
 {
     // fields -----------------------------------------------------------------
 
@@ -43,7 +44,7 @@
     /**
      * The resultant tree parent nodes for the currently visited node.
      */
-    private final Stack parentNodes;
+    private final Stack<DependencyNode> parentNodes;
 
     /**
      * The root node of the resultant tree.
@@ -71,7 +72,7 @@
     {
         this.visitor = visitor;
 
-        parentNodes = new Stack();
+        parentNodes = new Stack<DependencyNode>();
     }
 
     // DependencyNodeVisitor methods ------------------------------------------
@@ -94,7 +95,7 @@
         }
         else
         {
-            DependencyNode parentNode = (DependencyNode) parentNodes.peek();
+            DependencyNode parentNode = parentNodes.peek();
             parentNode.addChild( newNode );
         }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java
index 8f04226..396c1e5 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java
@@ -32,14 +32,15 @@
  * @version $Id$
  * @since 1.1
  */
-public class CollectingDependencyNodeVisitor implements DependencyNodeVisitor
+public class CollectingDependencyNodeVisitor
+    implements DependencyNodeVisitor
 {
     // fields -----------------------------------------------------------------
 
     /**
      * The collected list of nodes.
      */
-    private final List nodes;
+    private final List<DependencyNode> nodes;
 
     // constructors -----------------------------------------------------------
 
@@ -48,7 +49,7 @@
      */
     public CollectingDependencyNodeVisitor()
     {
-        nodes = new ArrayList();
+        nodes = new ArrayList<DependencyNode>();
     }
 
     // DependencyNodeVisitor methods ------------------------------------------
@@ -79,7 +80,7 @@
      * 
      * @return the list of collected dependency nodes
      */
-    public List getNodes()
+    public List<DependencyNode> getNodes()
     {
         return Collections.unmodifiableList( nodes );
     }
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java
index c374c7c..bbde004 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java
@@ -29,7 +29,8 @@
  * @version $Id$
  * @since 1.1
  */
-public class FilteringDependencyNodeVisitor implements DependencyNodeVisitor
+public class FilteringDependencyNodeVisitor
+    implements DependencyNodeVisitor
 {
     // fields -----------------------------------------------------------------
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java
index 8c28000..dde3c40 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java
@@ -32,7 +32,8 @@
  * @version $Id$
  * @since 1.1
  */
-public class SerializingDependencyNodeVisitor implements DependencyNodeVisitor
+public class SerializingDependencyNodeVisitor
+    implements DependencyNodeVisitor
 {
     // classes ----------------------------------------------------------------
 
@@ -209,7 +210,7 @@
         }
         else
         {
-            List siblings = parent.getChildren();
+            List<DependencyNode> siblings = parent.getChildren();
 
             last = ( siblings.indexOf( node ) == siblings.size() - 1 );
         }
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/AbstractDependencyNodeTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/AbstractDependencyNodeTest.java
index d2dea0d..19283db 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/AbstractDependencyNodeTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/AbstractDependencyNodeTest.java
@@ -29,7 +29,8 @@
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @version $Id$
  */
-public abstract class AbstractDependencyNodeTest extends MockObjectTestCase
+public abstract class AbstractDependencyNodeTest
+    extends MockObjectTestCase
 {
     // protected methods ------------------------------------------------------
 
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java b/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java
index afcc978..8a0ff3b 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java
@@ -30,6 +30,7 @@
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.metadata.ResolutionGroup;
 import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 
 /**
  * Provides a stub to simulate an artifact metadata source.
@@ -37,7 +38,8 @@
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @version $Id$
  */
-public class ArtifactMetadataSourceStub implements ArtifactMetadataSource
+public class ArtifactMetadataSourceStub
+    implements ArtifactMetadataSource
 {
     // TODO: move to maven-plugin-testing-harness?
     
@@ -46,12 +48,12 @@
     /**
      * Map of resolution groups by artifact.
      */
-    private final Map resolutionGroupsByArtifact;
+    private final Map<Artifact, ResolutionGroup> resolutionGroupsByArtifact;
 
     /**
      * Map of available versions by artifact.
      */
-    private final Map availableVersionsByArtifact;
+    private final Map<Artifact, List<ArtifactVersion>> availableVersionsByArtifact;
 
     // constructors -----------------------------------------------------------
     
@@ -60,8 +62,8 @@
      */
     public ArtifactMetadataSourceStub()
     {
-        resolutionGroupsByArtifact = new HashMap();
-        availableVersionsByArtifact = new HashMap();
+        resolutionGroupsByArtifact = new HashMap<Artifact, ResolutionGroup>();
+        availableVersionsByArtifact = new HashMap<Artifact, List<ArtifactVersion>>();
     }
 
     // ArtifactMetadataSource methods -----------------------------------------
@@ -72,7 +74,7 @@
     public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
         throws ArtifactMetadataRetrievalException
     {
-        ResolutionGroup resolution = (ResolutionGroup) resolutionGroupsByArtifact.get( artifact );
+        ResolutionGroup resolution = resolutionGroupsByArtifact.get( artifact );
         
         // if we return null then the artifact gets excluded in DefaultArtifactCollector
         if ( resolution == null )
@@ -87,9 +89,10 @@
      * {@inheritDoc}
      */
     public List retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository,
-                                           List remoteRepositories ) throws ArtifactMetadataRetrievalException
+                                           List remoteRepositories )
+        throws ArtifactMetadataRetrievalException
     {
-        List availableVersions = (List) availableVersionsByArtifact.get( artifact );
+        List<ArtifactVersion> availableVersions = availableVersionsByArtifact.get( artifact );
 
         return availableVersions != null ? availableVersions : Collections.EMPTY_LIST;
     }
@@ -104,7 +107,7 @@
      * @param dependencyArtifacts
      *            the set of artifacts to register as dependencies of the specified artifact
      */
-    public void addArtifactMetadata( Artifact artifact, Set dependencyArtifacts )
+    public void addArtifactMetadata( Artifact artifact, Set<Artifact> dependencyArtifacts )
     {
         ResolutionGroup resolution = new ResolutionGroup( artifact, dependencyArtifacts, Collections.EMPTY_LIST );
 
@@ -119,8 +122,15 @@
      * @param versions
      *            the list of versions to register as available for the specified artifact
      */
-    public void addAvailableVersions( Artifact artifact, List versions )
+    public void addAvailableVersions( Artifact artifact, List<ArtifactVersion> versions )
     {
         availableVersionsByArtifact.put( artifact, versions );
     }
+
+    public Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository,
+                                               List remoteRepositories )
+        throws ArtifactMetadataRetrievalException
+    {
+        return artifact;
+    }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java
index 28b0fd4..acdd467 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java
@@ -56,7 +56,8 @@
  * @version $Id$
  * @see DefaultDependencyTreeBuilder
  */
-public class DefaultDependencyTreeBuilderTest extends PlexusTestCase
+public class DefaultDependencyTreeBuilderTest
+    extends PlexusTestCase
 {
     // fields -----------------------------------------------------------------
 
@@ -75,7 +76,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         super.setUp();
 
@@ -92,7 +94,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void tearDown() throws Exception
+    protected void tearDown()
+        throws Exception
     {
         super.tearDown();
 
@@ -111,7 +114,8 @@
      * 
      * @throws DependencyTreeBuilderException 
      */
-    public void testProjectWithDependency() throws DependencyTreeBuilderException
+    public void testProjectWithDependency()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -135,7 +139,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithTransitiveDependency() throws DependencyTreeBuilderException
+    public void testProjectWithTransitiveDependency()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -165,7 +170,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithDuplicateDependency() throws DependencyTreeBuilderException
+    public void testProjectWithDuplicateDependency()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact child1Artifact = createArtifact( "g:a:t:1" );
@@ -202,7 +208,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithConflictDependencyVersionFirstWins() throws DependencyTreeBuilderException
+    public void testProjectWithConflictDependencyVersionFirstWins()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact nearestArtifact = createArtifact( "g:a:t:1" );
@@ -235,7 +242,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithConflictDependencyVersionLastWins() throws DependencyTreeBuilderException
+    public void testProjectWithConflictDependencyVersionLastWins()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -268,7 +276,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithConflictDependencyScopeCurrentPom() throws DependencyTreeBuilderException
+    public void testProjectWithConflictDependencyScopeCurrentPom()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact nearestArtifact = createArtifact( "g:b:t:1:test" );
@@ -303,7 +312,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithConflictDependencyScopeFirstWins() throws DependencyTreeBuilderException
+    public void testProjectWithConflictDependencyScopeFirstWins()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -369,7 +379,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithConflictDependencyScopeLastWins() throws DependencyTreeBuilderException
+    public void testProjectWithConflictDependencyScopeLastWins()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -432,7 +443,8 @@
      * 
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithManagedTransitiveDependencyVersion() throws DependencyTreeBuilderException
+    public void testProjectWithManagedTransitiveDependencyVersion()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -511,7 +523,8 @@
      *
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithManagedTransitiveDependencyScope() throws DependencyTreeBuilderException
+    public void testProjectWithManagedTransitiveDependencyScope()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -544,7 +557,8 @@
      * 
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithManagedTransitiveDependencyVersionAndScope() throws DependencyTreeBuilderException
+    public void testProjectWithManagedTransitiveDependencyVersionAndScope()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact childArtifact = createArtifact( "g:a:t:1" );
@@ -579,7 +593,8 @@
      * 
      * @throws DependencyTreeBuilderException
      */
-    public void testProjectWithManagedTransitiveDependencyVersionAndConflictDependencyVersion() throws DependencyTreeBuilderException
+    public void testProjectWithManagedTransitiveDependencyVersionAndConflictDependencyVersion()
+        throws DependencyTreeBuilderException
     {
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
         Artifact nearestArtifact = createArtifact( "g:a:t:1" );
@@ -615,7 +630,8 @@
      * @throws InvalidVersionSpecificationException 
      * @throws DependencyTreeBuilderException 
      */
-    public void testProjectWithVersionRange() throws InvalidVersionSpecificationException, DependencyTreeBuilderException
+    public void testProjectWithVersionRange()
+        throws InvalidVersionSpecificationException, DependencyTreeBuilderException
     {
         String range = "[1,2)";
         Artifact projectArtifact = createArtifact( "g:p:t:1" );
@@ -624,7 +640,7 @@
         MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
 
         ArtifactVersion version = new DefaultArtifactVersion( "1.0" );
-        List availableVersions = new ArrayList();
+        List<ArtifactVersion> availableVersions = new ArrayList<ArtifactVersion>();
         availableVersions.add( version );
 
         DependencyNode expectedRootNode = createNode( "g:p:t:1" );
@@ -696,8 +712,8 @@
         MavenProject project = new MavenProject();
         project.setArtifact( projectArtifact );
         // LinkedHashSet since order is significant when omitting conflicts
-        project.setDependencyArtifacts( new LinkedHashSet( Arrays.asList( dependencyArtifacts ) ) );
-        project.setManagedVersionMap( new HashMap() );
+        project.setDependencyArtifacts( new LinkedHashSet<Artifact>( Arrays.asList( dependencyArtifacts ) ) );
+        project.setManagedVersionMap( new HashMap<String, Artifact>() );
         project.setRemoteArtifactRepositories( Collections.EMPTY_LIST );
         return project;
     }
@@ -709,21 +725,20 @@
     
     private void addArtifactMetadata( Artifact artifact, Artifact[] dependencyArtifacts )
     {
-        addArtifactMetadata( artifact, new LinkedHashSet( Arrays.asList( dependencyArtifacts ) ) );
+        addArtifactMetadata( artifact, new LinkedHashSet<Artifact>( Arrays.asList( dependencyArtifacts ) ) );
     }
     
-    private void addArtifactMetadata( Artifact artifact, Set dependencyArtifacts )
+    private void addArtifactMetadata( Artifact artifact, Set<Artifact> dependencyArtifacts )
     {
         artifactMetadataSource.addArtifactMetadata( artifact, dependencyArtifacts );
     }
     
-    private void setManagedVersionMap( MavenProject project, Set managedArtifacts )
+    private void setManagedVersionMap( MavenProject project, Set<Artifact> managedArtifacts )
     {
-        Map managedVersionMap = new HashMap();
+        Map<String, Artifact> managedVersionMap = new HashMap<String, Artifact>();
         
-        for ( Iterator iterator = managedArtifacts.iterator(); iterator.hasNext(); )
+        for ( Artifact artifact : managedArtifacts )
         {
-            Artifact artifact = (Artifact) iterator.next();
             String managementKey = getManagementKey( artifact );
             
             managedVersionMap.put( managementKey, artifact );
@@ -734,66 +749,73 @@
     
     private String getManagementKey( Artifact artifact )
     {
-        return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getType() + (artifact.getClassifier() != null ? ":" + artifact.getClassifier() : "");
+        return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getType()
+            + ( artifact.getClassifier() != null ? ":" + artifact.getClassifier() : "" );
     }
     
-    private void assertDependencyTree( DependencyNode expectedRootNode, MavenProject project ) throws DependencyTreeBuilderException
+    private void assertDependencyTree( DependencyNode expectedRootNode, MavenProject project )
+        throws DependencyTreeBuilderException
     {
         assertDependencyTree( expectedRootNode, project, null );
     }
     
-    private void assertDependencyTree( DependencyNode expectedRootNode, MavenProject project, ArtifactFilter artifactFilter ) throws DependencyTreeBuilderException
+    private void assertDependencyTree( DependencyNode expectedRootNode, MavenProject project,
+                                       ArtifactFilter artifactFilter )
+        throws DependencyTreeBuilderException
     {
         // assert built dependency tree is as expected
-        
+
         DependencyNode actualRootNode =
             builder.buildDependencyTree( project, artifactRepository, artifactFactory, artifactMetadataSource,
                                          artifactFilter, artifactCollector );
-        
+
         assertEquals( "Dependency tree", expectedRootNode, actualRootNode );
-        
+
         // assert resolution tree is as expected
-        
+
         ArtifactResolutionResult result = builder.getArtifactResolutionResult();
-        
+
         assertTreeEquals( expectedRootNode, project, result );
     }
     
-    private void assertTreeEquals( DependencyNode dependencyNode, MavenProject project, ArtifactResolutionResult resolutionResult )
+    private void assertTreeEquals( DependencyNode dependencyNode, MavenProject project,
+                                   ArtifactResolutionResult resolutionResult )
     {
-        List rootChildrenResolutionNodes = ResolutionNodeUtils.getRootChildrenResolutionNodes( project, resolutionResult );
-        
+        List<ResolutionNode> rootChildrenResolutionNodes =
+            ResolutionNodeUtils.getRootChildrenResolutionNodes( project, resolutionResult );
+
         try
         {
             assertEquals( "Root node artifact", dependencyNode.getArtifact(), project.getArtifact() );
-        
+
             assertNodesEquals( dependencyNode.getChildren(), rootChildrenResolutionNodes );
         }
         catch ( AssertionFailedError error )
         {
             StringBuffer buffer = new StringBuffer();
-            
+
             buffer.append( error.getMessage() ).append( "; " );
             buffer.append( "expected dependency tree <" ).append( dependencyNode ).append( "> " );
             buffer.append( "actual resolution tree <" );
             ResolutionNodeUtils.append( buffer, project, resolutionResult );
             buffer.append( ">" );
-            
+
             throw new AssertionFailedError( buffer.toString() );
         }
     }
     
-    private void assertNodesEquals( List dependencyNodes, List resolutionNodes )
+    private void assertNodesEquals( List<DependencyNode> dependencyNodes, List<ResolutionNode> resolutionNodes )
     {
         assertNodesEquals( dependencyNodes.iterator(), resolutionNodes.iterator() );
     }
 
-    private void assertNodesEquals( Iterator dependencyNodesIterator, Iterator resolutionNodesIterator )
+    private void assertNodesEquals( Iterator<DependencyNode> dependencyNodesIterator,
+                                    Iterator<ResolutionNode> resolutionNodesIterator )
     {
         while ( dependencyNodesIterator.hasNext() && resolutionNodesIterator.hasNext() )
         {
-            DependencyNode dependencyNode = (DependencyNode) dependencyNodesIterator.next();
-            ResolutionNode resolutionNode = (ResolutionNode) resolutionNodesIterator.next();
+            DependencyNode dependencyNode = dependencyNodesIterator.next();
+            ResolutionNode resolutionNode = resolutionNodesIterator.next();
             
             assertNodeEquals( dependencyNode, resolutionNode );
         }
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/DependencyNodeTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/DependencyNodeTest.java
index f885fb8..f3719f3 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/DependencyNodeTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/DependencyNodeTest.java
@@ -62,7 +62,7 @@
         rootNode = node1;
     }
 
-    private void assertNode( Iterator it, DependencyNode node )
+    private void assertNode( Iterator<DependencyNode> it, DependencyNode node )
     {
         assertTrue( it.hasNext() );
         assertSame( node, it.next() );
@@ -70,7 +70,7 @@
 
     public void testPreorderIterator()
     {
-        Iterator it = rootNode.iterator();
+        Iterator<DependencyNode> it = rootNode.iterator();
 
         assertNode( it, node1 );
         assertNode( it, node2 );
@@ -84,7 +84,7 @@
 
     public void testInverseIterator()
     {
-        Iterator it = rootNode.inverseIterator();
+        Iterator<DependencyNode> it = rootNode.inverseIterator();
 
         assertNode( it, node7 );
         assertNode( it, node3 );
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
index e3e690c..41d6086 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
@@ -33,7 +33,8 @@
  * @version $Id$
  * @see DependencyTreeResolutionListener
  */
-public class DependencyTreeResolutionListenerTest extends AbstractDependencyNodeTest
+public class DependencyTreeResolutionListenerTest
+    extends AbstractDependencyNodeTest
 {
     // fields -----------------------------------------------------------------
 
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/ResolutionNodeUtils.java b/src/test/java/org/apache/maven/shared/dependency/tree/ResolutionNodeUtils.java
index f67ca52..7b51293 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/ResolutionNodeUtils.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/ResolutionNodeUtils.java
@@ -50,18 +50,17 @@
 
     // public methods ---------------------------------------------------------
     
-    public static List getRootChildrenResolutionNodes( MavenProject project, ArtifactResolutionResult resolutionResult )
+    public static List<ResolutionNode> getRootChildrenResolutionNodes( MavenProject project,
+                                                                       ArtifactResolutionResult resolutionResult )
     {
-        Set resolutionNodes = resolutionResult.getArtifactResolutionNodes();
+        Set<ResolutionNode> resolutionNodes = resolutionResult.getArtifactResolutionNodes();
 
         // obtain root children nodes
         
-        Map rootChildrenResolutionNodesByArtifact = new HashMap();
+        Map<Artifact, ResolutionNode> rootChildrenResolutionNodesByArtifact = new HashMap<Artifact, ResolutionNode>();
         
-        for ( Iterator iterator = resolutionNodes.iterator(); iterator.hasNext(); )
+        for ( ResolutionNode resolutionNode : resolutionNodes )
         {
-            ResolutionNode resolutionNode = (ResolutionNode) iterator.next();
-            
             if ( resolutionNode.isChildOfRootNode() )
             {
                 rootChildrenResolutionNodesByArtifact.put( resolutionNode.getArtifact(), resolutionNode );
@@ -70,12 +69,12 @@
         
         // order root children by project dependencies
         
-        List rootChildrenResolutionNodes = new ArrayList();
+        List<ResolutionNode> rootChildrenResolutionNodes = new ArrayList<ResolutionNode>();
         
-        for ( Iterator iterator = project.getDependencyArtifacts().iterator(); iterator.hasNext(); )
+        for ( Iterator<Artifact> iterator = project.getDependencyArtifacts().iterator(); iterator.hasNext(); )
         {
-            Artifact artifact = (Artifact) iterator.next();
-            ResolutionNode resolutionNode = (ResolutionNode) rootChildrenResolutionNodesByArtifact.get( artifact );
+            Artifact artifact = iterator.next();
+            ResolutionNode resolutionNode = rootChildrenResolutionNodesByArtifact.get( artifact );
             
             rootChildrenResolutionNodes.add( resolutionNode );
         }
@@ -97,7 +96,7 @@
         ResolutionNode rootNode = new ResolutionNode( project.getArtifact(), Collections.EMPTY_LIST );
         append( buffer, rootNode, 0 );
 
-        List rootChildrenNodes = getRootChildrenResolutionNodes( project, result );
+        List<ResolutionNode> rootChildrenNodes = getRootChildrenResolutionNodes( project, result );
         append( buffer, rootChildrenNodes.iterator(), 1 );
         
         return buffer;
@@ -105,11 +104,11 @@
     
     // private methods --------------------------------------------------------
     
-    private static StringBuffer append( StringBuffer buffer, Iterator nodesIterator, int depth )
+    private static StringBuffer append( StringBuffer buffer, Iterator<ResolutionNode> nodesIterator, int depth )
     {
         while ( nodesIterator.hasNext() )
         {
-            ResolutionNode node = (ResolutionNode) nodesIterator.next();
+            ResolutionNode node = nodesIterator.next();
             
             append( buffer, node, depth );
         }
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/filter/AbstractDependencyNodeFilterTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/filter/AbstractDependencyNodeFilterTest.java
index f24a705..dead78d 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/filter/AbstractDependencyNodeFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/filter/AbstractDependencyNodeFilterTest.java
@@ -29,7 +29,8 @@
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @version $Id$
  */
-public abstract class AbstractDependencyNodeFilterTest extends MockObjectTestCase
+public abstract class AbstractDependencyNodeFilterTest
+    extends MockObjectTestCase
 {
     // protected methods ---------------------------------------------------------
 
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilterTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilterTest.java
index bcfb011..34770c8 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilterTest.java
@@ -29,7 +29,8 @@
  * @version $Id$
  * @see AncestorOrSelfDependencyNodeFilter
  */
-public class AncestorOrSelfDependencyNodeFilterTest extends AbstractDependencyNodeTest
+public class AncestorOrSelfDependencyNodeFilterTest
+    extends AbstractDependencyNodeTest
 {
     // constants --------------------------------------------------------------
 
@@ -48,7 +49,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         /*
          * p -> a -> c
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilterTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilterTest.java
index 61f7375..34cafe7 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilterTest.java
@@ -30,7 +30,8 @@
  * @version $Id$
  * @see AndDependencyNodeFilter
  */
-public class AndDependencyNodeFilterTest extends AbstractDependencyNodeFilterTest
+public class AndDependencyNodeFilterTest
+    extends AbstractDependencyNodeFilterTest
 {
     // fields -----------------------------------------------------------------
 
@@ -49,7 +50,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         artifact = new ArtifactStub();
         node = new DependencyNode( artifact );
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilterTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilterTest.java
index 958b61c..dad9055 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilterTest.java
@@ -33,7 +33,8 @@
  * @version $Id$
  * @see ArtifactDependencyNodeFilter
  */
-public class ArtifactDependencyNodeFilterTest extends MockObjectTestCase
+public class ArtifactDependencyNodeFilterTest
+    extends MockObjectTestCase
 {
     // fields -----------------------------------------------------------------
 
@@ -50,7 +51,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         artifact = new ArtifactStub();
         node = new DependencyNode( artifact );
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilterTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilterTest.java
index 0225dd3..9b2f34a 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilterTest.java
@@ -32,7 +32,8 @@
  * @version $Id$
  * @see StateDependencyNodeFilter
  */
-public class StateDependencyNodeFilterTest extends TestCase
+public class StateDependencyNodeFilterTest
+    extends TestCase
 {
     // fields -----------------------------------------------------------------
 
@@ -51,7 +52,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         Artifact artifact = new ArtifactStub();
         Artifact relatedArtifact = new ArtifactStub();
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitorTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitorTest.java
index 58d8ccc..8bad217 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitorTest.java
@@ -30,7 +30,8 @@
  * @version $Id$
  * @see BuildingDependencyNodeVisitor
  */
-public class BuildingDependencyNodeVisitorTest extends AbstractDependencyNodeTest
+public class BuildingDependencyNodeVisitorTest
+    extends AbstractDependencyNodeTest
 {
     // fields -----------------------------------------------------------------
 
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitorTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitorTest.java
index cff6f0b..447766b 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitorTest.java
@@ -33,7 +33,8 @@
  * @version $Id$
  * @see CollectingDependencyNodeVisitor
  */
-public class CollectingDependencyNodeVisitorTest extends AbstractDependencyNodeTest
+public class CollectingDependencyNodeVisitorTest
+    extends AbstractDependencyNodeTest
 {
     // fields -----------------------------------------------------------------
     
@@ -50,7 +51,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         visitor = new CollectingDependencyNodeVisitor();
         node1 = createNode( "g:a:t:1" );
@@ -73,7 +75,7 @@
         assertTrue( visitor.visit( node1 ) );
         assertTrue( visitor.visit( node2 ) );
         assertTrue( visitor.visit( node3 ) );
-        assertNodes( Arrays.asList( new Object[] { node1, node2, node3 } ) );
+        assertNodes( Arrays.asList( new DependencyNode[] { node1, node2, node3 } ) );
     }
 
     public void testEndVisit()
@@ -87,7 +89,7 @@
     
     private void assertEmptyNodes()
     {
-        assertNodes( Collections.EMPTY_LIST );
+        assertNodes( Collections.<DependencyNode>emptyList() );
     }
     
     private void assertNodes( DependencyNode node )
@@ -95,7 +97,7 @@
         assertNodes( Collections.singletonList( node ) );
     }
     
-    private void assertNodes( List expectedNodes )
+    private void assertNodes( List<DependencyNode> expectedNodes )
     {
         assertEquals( "Collected nodes", expectedNodes, visitor.getNodes() );
     }
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitorTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitorTest.java
index ed31a15..f7898e9 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitorTest.java
@@ -32,7 +32,8 @@
  * @version $Id$
  * @see FilteringDependencyNodeVisitor
  */
-public class FilteringDependencyNodeVisitorTest extends AbstractDependencyNodeFilterTest
+public class FilteringDependencyNodeVisitorTest
+    extends AbstractDependencyNodeFilterTest
 {
     // fields -----------------------------------------------------------------
 
@@ -49,7 +50,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         node = new DependencyNode( new ArtifactStub() );
 
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitorTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitorTest.java
index 1ba7094..ade6228 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitorTest.java
@@ -31,7 +31,8 @@
  * @version $Id$
  * @see SerializingDependencyNodeVisitor
  */
-public class SerializingDependencyNodeVisitorTest extends AbstractDependencyNodeTest
+public class SerializingDependencyNodeVisitorTest
+    extends AbstractDependencyNodeTest
 {
     // constants --------------------------------------------------------------
 
@@ -48,7 +49,8 @@
     /**
      * {@inheritDoc}
      */
-    protected void setUp() throws Exception
+    protected void setUp()
+        throws Exception
     {
         writer = new StringWriter();
 
