diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/AbstractDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/AbstractDependencyNode.java
deleted file mode 100644
index cbb550e..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/AbstractDependencyNode.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal;
-
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
-
-public abstract class AbstractDependencyNode
-    implements DependencyNode
-{
-    /**
-     * Applies the specified dependency node visitor to this dependency node and its children.
-     * 
-     * @param visitor
-     *            the dependency node visitor to use
-     * @return the visitor result of ending the visit to this node
-     * @since 1.1
-     */
-    public boolean accept( DependencyNodeVisitor visitor )
-    {
-        if ( visitor.visit( this ) )
-        {
-            for ( DependencyNode child : getChildren() )
-            {
-                if ( !child.accept( visitor ) )
-                {
-                    break;
-                }
-            }
-        }
-
-        return visitor.endVisit( this );
-    }
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
new file mode 100644
index 0000000..7cd1fd2
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
@@ -0,0 +1,67 @@
+package org.apache.maven.shared.dependency.graph.internal;
+
+import java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.shared.dependency.graph.DependencyNode;
+import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+
+public class DefaultDependencyNode
+    implements DependencyNode
+{
+    private final Artifact artifact;
+
+    private final DependencyNode parent;
+
+    private List<DependencyNode> children;
+
+    public DefaultDependencyNode( DependencyNode parent, Artifact artifact )
+    {
+        this.parent = parent;
+        this.artifact = artifact;
+    }
+
+    /**
+     * Applies the specified dependency node visitor to this dependency node and its children.
+     * 
+     * @param visitor
+     *            the dependency node visitor to use
+     * @return the visitor result of ending the visit to this node
+     * @since 1.1
+     */
+    public boolean accept( DependencyNodeVisitor visitor )
+    {
+        if ( visitor.visit( this ) )
+        {
+            for ( DependencyNode child : getChildren() )
+            {
+                if ( !child.accept( visitor ) )
+                {
+                    break;
+                }
+            }
+        }
+
+        return visitor.endVisit( this );
+    }
+
+    public Artifact getArtifact()
+    {
+        return artifact;
+    }
+
+    public void setChildren( List<DependencyNode> children )
+    {
+        this.children = children;
+    }
+
+    public List<DependencyNode> getChildren()
+    {
+        return children;
+    }
+
+    public DependencyNode getParent()
+    {
+        return parent;
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
index d0fb71a..d40b56d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
@@ -19,6 +19,10 @@
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
@@ -48,11 +52,37 @@
     {
         try
         {
-            return new Maven2DependencyNode( null, treeBuilder.buildDependencyTree( project ), filter );
+            return buildDependencyNode( null, treeBuilder.buildDependencyTree( project ), filter );
         }
         catch ( DependencyTreeBuilderException e )
         {
             throw new DependencyGraphBuilderException( e.getMessage(), e );
         }
     }
+
+    private DependencyNode buildDependencyNode( DependencyNode parent,
+                                                org.apache.maven.shared.dependency.tree.DependencyNode node,
+                                                ArtifactFilter filter )
+    {
+        DefaultDependencyNode current = new DefaultDependencyNode( parent, node.getArtifact() );
+
+        List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
+        for ( org.apache.maven.shared.dependency.tree.DependencyNode child : node.getChildren() )
+        {
+            if ( child.getState() != org.apache.maven.shared.dependency.tree.DependencyNode.INCLUDED )
+            {
+                // only included nodes are supported in the graph API
+                continue;
+            }
+
+            if ( ( filter == null ) || filter.include( child.getArtifact() ) )
+            {
+                nodes.add( buildDependencyNode( current, child, filter ) );
+            }
+        }
+
+        current.setChildren( Collections.unmodifiableList( nodes ) );
+
+        return current;
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyNode.java
deleted file mode 100644
index 8a4382a..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyNode.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-
-/**
- * Wrapper for Maven 2's dependency node.
- *
- * @see org.apache.maven.shared.dependency.tree.DependencyNode
- * @author Hervé Boutemy
- * @since 2.0
- */
-public class Maven2DependencyNode
-    extends AbstractDependencyNode
-{
-    private final Artifact artifact;
-
-    private final List<DependencyNode> children;
-
-    private final DependencyNode parent;
-
-    public Maven2DependencyNode( DependencyNode parent, org.apache.maven.shared.dependency.tree.DependencyNode node,
-                                 ArtifactFilter filter )
-    {
-        this.parent = parent;
-        this.artifact = node.getArtifact();
-
-        List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
-        for ( org.apache.maven.shared.dependency.tree.DependencyNode child : node.getChildren() )
-        {
-            if ( child.getState() != org.apache.maven.shared.dependency.tree.DependencyNode.INCLUDED )
-            {
-                // only included nodes are supported in the graph API
-                continue;
-            }
-
-            if ( ( filter == null ) || filter.include( child.getArtifact() ) )
-            {
-                nodes.add( new Maven2DependencyNode( this, child, filter ) );
-            }
-        }
-
-        children = Collections.unmodifiableList( nodes );
-    }
-
-    public Artifact getArtifact()
-    {
-        return artifact;
-    }
-
-    public List<DependencyNode> getChildren()
-    {
-        return children;
-    }
-
-    public DependencyNode getParent()
-    {
-        return parent;
-    }
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
index f59d984..315fa85 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
@@ -20,9 +20,14 @@
  */
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.project.DefaultDependencyResolutionRequest;
 import org.apache.maven.project.DependencyResolutionException;
 import org.apache.maven.project.DependencyResolutionRequest;
@@ -35,6 +40,7 @@
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
+import org.sonatype.aether.graph.Dependency;
 
 /**
  * Wrapper around Maven 3 dependency resolver.
@@ -66,7 +72,7 @@
 
             DependencyResolutionResult result = resolver.resolve( request );
 
-            return new Maven3DependencyNode( null, factory, result.getDependencyGraph(), project.getArtifact(), filter );
+            return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter );
         }
         catch ( DependencyResolutionException e )
         {
@@ -91,4 +97,35 @@
     {
         return object.getClass().getMethod( method ).invoke( object );
     }
+
+    private Artifact getDependencyArtifact( Dependency dep )
+    {
+        org.sonatype.aether.artifact.Artifact artifact = dep.getArtifact();
+
+        return factory.createDependencyArtifact( artifact.getGroupId(), artifact.getArtifactId(),
+                                                 VersionRange.createFromVersion( artifact.getVersion() ),
+                                                 artifact.getExtension(), artifact.getClassifier(), dep.getScope(),
+                                                 dep.isOptional() );
+    }
+
+    private DependencyNode buildDependencyNode( DependencyNode parent, org.sonatype.aether.graph.DependencyNode node,
+                                                Artifact artifact, ArtifactFilter filter )
+    {
+        DefaultDependencyNode current = new DefaultDependencyNode( parent, artifact );
+
+        List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
+        for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
+        {
+            Artifact childArtifact = getDependencyArtifact( child.getDependency() );
+
+            if ( ( filter == null ) || filter.include( childArtifact ) )
+            {
+                nodes.add( buildDependencyNode( current, child, childArtifact, filter ) );
+            }
+        }
+
+        current.setChildren( Collections.unmodifiableList( nodes ) );
+
+        return current;
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyNode.java
deleted file mode 100644
index ce10269..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyNode.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.sonatype.aether.graph.Dependency;
-
-/**
- * Wrapper for Maven 3's dependency node, which is provided by Aether.
- *
- * @see org.sonatype.aether.graph.DependencyNode
- * @author Hervé Boutemy
- * @since 2.0
- */
-public class Maven3DependencyNode
-    extends AbstractDependencyNode
-{
-    private final Artifact artifact;
-
-    private final List<DependencyNode> children;
-
-    private final DependencyNode parent;
-
-    public Maven3DependencyNode( DependencyNode parent, ArtifactFactory factory,
-                                 org.sonatype.aether.graph.DependencyNode node, final Artifact artifact,
-                                 ArtifactFilter filter )
-    {
-        this.parent = parent;
-
-        if ( artifact != null )
-        {
-            this.artifact = artifact;
-        }
-        else
-        {
-            Dependency dep = node.getDependency();
-            org.sonatype.aether.artifact.Artifact art = dep.getArtifact();
-
-            Artifact tmpArtifact =
-                factory.createDependencyArtifact( art.getGroupId(), art.getArtifactId(),
-                                                  VersionRange.createFromVersion( art.getVersion() ),
-                                                  art.getExtension(), art.getClassifier(), dep.getScope(),
-                                                  dep.isOptional() );
-
-            if ( ( filter != null ) && !filter.include( tmpArtifact ) )
-            {
-                this.artifact = null;
-                children = null;
-                return;
-            }
-
-            this.artifact = tmpArtifact;
-        }
-
-        List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
-        for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
-        {
-            DependencyNode tmpNode = new Maven3DependencyNode( this, factory, child, null, filter );
-
-            if ( tmpNode.getArtifact() != null )
-            {
-                nodes.add( tmpNode );
-            }
-        }
-        children = Collections.unmodifiableList( nodes );
-    }
-
-    public Artifact getArtifact()
-    {
-        return artifact;
-    }
-
-    public List<DependencyNode> getChildren()
-    {
-        return children;
-    }
-
-    public DependencyNode getParent()
-    {
-        return parent;
-    }
-}
