diff --git a/bundleplugin/pom.xml b/bundleplugin/pom.xml
index ba0a4d4..cfc4ab8 100644
--- a/bundleplugin/pom.xml
+++ b/bundleplugin/pom.xml
@@ -109,6 +109,11 @@
     <version>2.0.7</version>
   </dependency>
   <dependency>
+   <groupId>org.apache.maven.shared</groupId>
+   <artifactId>maven-dependency-tree</artifactId>
+   <version>1.2</version>
+  </dependency>
+  <dependency>
     <groupId>org.apache.maven.wagon</groupId>
     <artifactId>wagon-provider-api</artifactId>
     <version>1.0-beta-2</version>
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
deleted file mode 100644
index bfce140..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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.Collections;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.artifact.InvalidDependencyVersionException;
-import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-
-/**
- * Default implementation of <code>DependencyTreeBuilder</code>.
- * 
- * @author Edwin Punzalan
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DefaultDependencyTreeBuilder.java 661727 2008-05-30 14:21:49Z bentmann $
- * @plexus.component role="org.apache.maven.shared.dependency.tree.DependencyTreeBuilder"
- * @see DependencyTreeBuilder
- */
-public class DefaultDependencyTreeBuilder extends AbstractLogEnabled implements DependencyTreeBuilder
-{
-    // fields -----------------------------------------------------------------
-    
-    private ArtifactResolutionResult result;
-    
-    // DependencyTreeBuilder methods ------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @deprecated
-     */
-    public DependencyTree buildDependencyTree( MavenProject project, ArtifactRepository repository,
-                                               ArtifactFactory factory, ArtifactMetadataSource metadataSource,
-                                               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() );
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    public DependencyNode buildDependencyTree( MavenProject project, ArtifactRepository repository,
-                                               ArtifactFactory factory, ArtifactMetadataSource metadataSource,
-                                               ArtifactFilter filter, ArtifactCollector collector )
-        throws DependencyTreeBuilderException
-    {
-        DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener( getLogger() );
-
-        try
-        {
-            Map managedVersions = project.getManagedVersionMap();
-
-            Set 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,
-                               project.getRemoteArtifactRepositories(), metadataSource, filter,
-                               Collections.singletonList( listener ) );
-
-            return listener.getRootNode();
-        }
-        catch ( ArtifactResolutionException exception )
-        {
-            throw new DependencyTreeBuilderException( "Cannot build project dependency tree", exception );
-        }
-        catch ( InvalidDependencyVersionException e )
-        {
-            throw new DependencyTreeBuilderException( "Invalid dependency version for artifact "
-                + project.getArtifact() );
-        }
-    }
-    
-    // protected methods ------------------------------------------------------
-    
-    protected ArtifactResolutionResult getArtifactResolutionResult()
-    {
-        return result;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
deleted file mode 100644
index e113c1b..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
+++ /dev/null
@@ -1,904 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.maven.artifact.Artifact;
-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;
-
-/**
- * Represents an artifact node within a Maven project's dependency tree.
- * 
- * @author Edwin Punzalan
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DependencyNode.java 661727 2008-05-30 14:21:49Z bentmann $
- */
-public class DependencyNode
-{
-    // constants --------------------------------------------------------------
-
-    /**
-     * State that represents an included dependency node.
-     * 
-     * @since 1.1
-     */
-    public static final int INCLUDED = 0;
-
-    /**
-     * State that represents a dependency node that has been omitted for duplicating another dependency node.
-     * 
-     * @since 1.1
-     */
-    public static final int OMITTED_FOR_DUPLICATE = 1;
-
-    /**
-     * State that represents a dependency node that has been omitted for conflicting with another dependency node.
-     * 
-     * @since 1.1
-     */
-    public static final int OMITTED_FOR_CONFLICT = 2;
-
-    /**
-     * State that represents a dependency node that has been omitted for introducing a cycle into the dependency tree.
-     * 
-     * @since 1.1
-     */
-    public static final int OMITTED_FOR_CYCLE = 3;
-    
-    // classes ----------------------------------------------------------------
-    
-    /**
-     * Utility class to concatenate a number of parameters with separator tokens.   
-     */
-    private static class ItemAppender
-    {
-        private StringBuffer buffer;
-        
-        private String startToken;
-        
-        private String separatorToken;
-        
-        private String endToken;
-        
-        private boolean appended;
-        
-        public ItemAppender( StringBuffer buffer, String startToken, String separatorToken, String endToken )
-        {
-            this.buffer = buffer;
-            this.startToken = startToken;
-            this.separatorToken = separatorToken;
-            this.endToken = endToken;
-            
-            appended = false;
-        }
-
-        public ItemAppender append( String item )
-        {
-            appendToken();
-            
-            buffer.append( item );
-            
-            return this;
-        }
-        
-        public ItemAppender append( String item1, String item2 )
-        {
-            appendToken();
-            
-            buffer.append( item1 ).append( item2 );
-            
-            return this;
-        }
-        
-        public void flush()
-        {
-            if ( appended )
-            {
-                buffer.append( endToken );
-                
-                appended = false;
-            }
-        }
-        
-        private void appendToken()
-        {
-            buffer.append( appended ? separatorToken : startToken );
-            
-            appended = true;
-        }
-    }
-
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The artifact that is attached to this dependency node.
-     */
-    private final Artifact artifact;
-
-    /**
-     * The list of child dependency nodes of this dependency node.
-     */
-    private final List children;
-
-    /**
-     * The parent dependency node of this dependency node.
-     */
-    private DependencyNode parent;
-
-    /**
-     * The state of this dependency node. This can be either <code>INCLUDED</code>,
-     * <code>OMITTED_FOR_DUPLICATE</code>, <code>OMITTED_FOR_CONFLICT</code> or <code>OMITTED_FOR_CYCLE</code>.
-     * 
-     * @see #INCLUDED
-     * @see #OMITTED_FOR_DUPLICATE
-     * @see #OMITTED_FOR_CONFLICT
-     * @see #OMITTED_FOR_CYCLE
-     */
-    private int state;
-
-    /**
-     * The artifact related to the state of this dependency node. For dependency nodes with a state of
-     * <code>OMITTED_FOR_DUPLICATE</code> or <code>OMITTED_FOR_CONFLICT</code>, this represents the artifact that
-     * was conflicted with. For dependency nodes of other states, this is always <code>null</code>.
-     */
-    private Artifact relatedArtifact;
-    
-    /**
-     * The scope of this node's artifact before it was updated due to conflicts, or <code>null</code> if the artifact
-     * scope has not been updated.
-     */
-    private String originalScope;
-
-    /**
-     * The scope that this node's artifact was attempted to be updated to due to conflicts, or <code>null</code> if
-     * the artifact scope has not failed being updated.
-     */
-    private String failedUpdateScope;
-
-    /**
-     * The version of this node's artifact before it was updated by dependency management, or <code>null</code> if the
-     * artifact version has not been managed.
-     */
-    private String premanagedVersion;
-    
-    /**
-     * The scope of this node's artifact before it was updated by dependency management, or <code>null</code> if the
-     * artifact scope has not been managed.
-     */
-    private String premanagedScope;
-
-    private VersionRange versionSelectedFromRange;
-    
-    private List availableVersions;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a new dependency node for the specified artifact with an included state.
-     * 
-     * @param artifact
-     *            the artifact attached to the new dependency node
-     * @throws IllegalArgumentException
-     *             if the parameter constraints were violated
-     * @since 1.1
-     */
-    public DependencyNode( Artifact artifact )
-    {
-        this( artifact, INCLUDED );
-    }
-
-    /**
-     * Creates a new dependency node for the specified artifact with the specified state.
-     * 
-     * @param artifact
-     *            the artifact attached to the new dependency node
-     * @param state
-     *            the state of the new dependency node. This can be either <code>INCLUDED</code> or
-     *            <code>OMITTED_FOR_CYCLE</code>.
-     * @throws IllegalArgumentException
-     *             if the parameter constraints were violated
-     * @since 1.1
-     */
-    public DependencyNode( Artifact artifact, int state )
-    {
-        this( artifact, state, null );
-    }
-
-    /**
-     * Creates a new dependency node for the specified artifact with the specified state and related artifact.
-     * 
-     * @param artifact
-     *            the artifact attached to the new dependency node
-     * @param state
-     *            the state of the new dependency node. This can be either <code>INCLUDED</code>,
-     *            <code>OMITTED_FOR_DUPLICATE</code>, <code>OMITTED_FOR_CONFLICT</code> or
-     *            <code>OMITTED_FOR_CYCLE</code>.
-     * @param relatedArtifact
-     *            the artifact related to the state of this dependency node. For dependency nodes with a state of
-     *            <code>OMITTED_FOR_DUPLICATE</code> or <code>OMITTED_FOR_CONFLICT</code>, this represents the
-     *            artifact that was conflicted with. For dependency nodes of other states, this should always be
-     *            <code>null</code>.
-     * @throws IllegalArgumentException
-     *             if the parameter constraints were violated
-     * @since 1.1
-     */
-    public DependencyNode( Artifact artifact, int state, Artifact relatedArtifact )
-    {
-        if ( artifact == null )
-        {
-            throw new IllegalArgumentException( "artifact cannot be null" );
-        }
-
-        if ( state < INCLUDED || state > OMITTED_FOR_CYCLE )
-        {
-            throw new IllegalArgumentException( "Unknown state: " + state );
-        }
-
-        boolean requiresRelatedArtifact = ( state == OMITTED_FOR_DUPLICATE || state == OMITTED_FOR_CONFLICT );
-
-        if ( requiresRelatedArtifact && relatedArtifact == null )
-        {
-            throw new IllegalArgumentException( "Related artifact is required for states "
-                            + "OMITTED_FOR_DUPLICATE and OMITTED_FOR_CONFLICT" );
-        }
-
-        if ( !requiresRelatedArtifact && relatedArtifact != null )
-        {
-            throw new IllegalArgumentException( "Related artifact is only required for states "
-                            + "OMITTED_FOR_DUPLICATE and OMITTED_FOR_CONFLICT" );
-        }
-
-        this.artifact = artifact;
-        this.state = state;
-        this.relatedArtifact = relatedArtifact;
-
-        children = new ArrayList();
-    }
-    
-    /**
-     * Creates a new dependency node.
-     * 
-     * @deprecated As of 1.1, replaced by {@link #DependencyNode(Artifact, int, Artifact)}
-     */
-    DependencyNode()
-    {
-        artifact = null;
-        children = new ArrayList();
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * 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 ) )
-        {
-            boolean visiting = true;
-
-            for ( Iterator iterator = getChildren().iterator(); visiting && iterator.hasNext(); )
-            {
-                DependencyNode child = (DependencyNode) iterator.next();
-
-                visiting = child.accept( visitor );
-            }
-        }
-
-        return visitor.endVisit( this );
-    }
-
-    /**
-     * Adds the specified dependency node to this dependency node's children.
-     * 
-     * @param child
-     *            the child dependency node to add
-     * @since 1.1
-     */
-    public void addChild( DependencyNode child )
-    {
-        children.add( child );
-        child.parent = this;
-    }
-
-    /**
-     * Removes the specified dependency node from this dependency node's children.
-     * 
-     * @param child
-     *            the child dependency node to remove
-     * @since 1.1
-     */
-    public void removeChild( DependencyNode child )
-    {
-        children.remove( child );
-        child.parent = null;
-    }
-
-    /**
-     * Gets the parent dependency node of this dependency node.
-     * 
-     * @return the parent dependency node
-     */
-    public DependencyNode getParent()
-    {
-        return parent;
-    }
-
-    /**
-     * Gets the artifact attached to this dependency node.
-     * 
-     * @return the artifact
-     */
-    public Artifact getArtifact()
-    {
-        return artifact;
-    }
-    
-    /**
-     * Gets the depth of this dependency node within its hierarchy.
-     * 
-     * @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
-     *             unfiltered depth of a node, whereas the correct depth would be calculated by the
-     *             visitor.
-     */
-    public int getDepth()
-    {
-        int depth = 0;
-        
-        DependencyNode node = getParent();
-        
-        while ( node != null )
-        {
-            depth++;
-            
-            node = node.getParent();
-        }
-        
-        return depth;
-    }
-
-    /**
-     * Gets the list of child dependency nodes of this dependency node.
-     * 
-     * @return the list of child dependency nodes
-     */
-    public List getChildren()
-    {
-        return Collections.unmodifiableList( children );
-    }
-
-    public boolean hasChildren()
-    {
-        return children.size() > 0;
-    }
-
-    /**
-     * Gets the state of this dependency node.
-     * 
-     * @return the state: either <code>INCLUDED</code>, <code>OMITTED_FOR_DUPLICATE</code>,
-     *         <code>OMITTED_FOR_CONFLICT</code> or <code>OMITTED_FOR_CYCLE</code>.
-     * @since 1.1
-     */
-    public int getState()
-    {
-        return state;
-    }
-
-    /**
-     * Gets the artifact related to the state of this dependency node. For dependency nodes with a state of
-     * <code>OMITTED_FOR_CONFLICT</code>, this represents the artifact that was conflicted with. For dependency nodes
-     * of other states, this is always <code>null</code>.
-     * 
-     * @return the related artifact
-     * @since 1.1
-     */
-    public Artifact getRelatedArtifact()
-    {
-        return relatedArtifact;
-    }
-    
-    /**
-     * Gets the scope of this node's artifact before it was updated due to conflicts.
-     * 
-     * @return the original scope, or <code>null</code> if the artifact scope has not been updated
-     * @since 1.1
-     */
-    public String getOriginalScope()
-    {
-        return originalScope;
-    }
-
-    /**
-     * Sets the scope of this node's artifact before it was updated due to conflicts.
-     * 
-     * @param originalScope
-     *            the original scope, or <code>null</code> if the artifact scope has not been updated
-     * @since 1.1
-     */
-    public void setOriginalScope( String originalScope )
-    {
-        this.originalScope = originalScope;
-    }
-
-    /**
-     * Gets the scope that this node's artifact was attempted to be updated to due to conflicts.
-     * 
-     * @return the failed update scope, or <code>null</code> if the artifact scope has not failed being updated
-     * @since 1.1
-     */
-    public String getFailedUpdateScope()
-    {
-        return failedUpdateScope;
-    }
-
-    /**
-     * Sets the scope that this node's artifact was attempted to be updated to due to conflicts.
-     * 
-     * @param failedUpdateScope
-     *            the failed update scope, or <code>null</code> if the artifact scope has not failed being updated
-     * @since 1.1
-     */
-    public void setFailedUpdateScope( String failedUpdateScope )
-    {
-        this.failedUpdateScope = failedUpdateScope;
-    }
-    
-    /**
-     * Gets the version of this node's artifact before it was updated by dependency management.
-     * 
-     * @return the premanaged version, or <code>null</code> if the artifact version has not been managed
-     * @since 1.1
-     */
-    public String getPremanagedVersion()
-    {
-        return premanagedVersion;
-    }
-
-    /**
-     * Sets the version of this node's artifact before it was updated by dependency management.
-     * 
-     * @param premanagedVersion
-     *            the premanaged version, or <code>null</code> if the artifact version has not been managed
-     * @since 1.1
-     */
-    public void setPremanagedVersion( String premanagedVersion )
-    {
-        this.premanagedVersion = premanagedVersion;
-    }
-    
-    /**
-     * Gets the scope of this node's artifact before it was updated by dependency management.
-     * 
-     * @return the premanaged scope, or <code>null</code> if the artifact scope has not been managed
-     * @since 1.1
-     */
-    public String getPremanagedScope()
-    {
-        return premanagedScope;
-    }
-    
-    /**
-     * Sets the scope of this node's artifact before it was updated by dependency management.
-     * 
-     * @param premanagedScope
-     *            the premanaged scope, or <code>null</code> if the artifact scope has not been managed
-     * @since 1.1
-     */
-    public void setPremanagedScope( String premanagedScope )
-    {
-        this.premanagedScope = premanagedScope;
-    }
-
-    /**
-     * If the version was selected from a range this method will return the range.
-     * 
-     * @return the version range before a version was selected, or <code>null</code> if the artifact had a explicit
-     *         version.
-     * @since 1.2
-     */
-    public VersionRange getVersionSelectedFromRange()
-    {
-        return versionSelectedFromRange;
-    }
-    
-    public void setVersionSelectedFromRange( VersionRange versionSelectedFromRange )
-    {
-        this.versionSelectedFromRange = versionSelectedFromRange;
-    }
-
-    /**
-     * If the version was selected from a range this method will return the available versions when making the decision.
-     * 
-     * @return {@link List} &lt; {@link String} > the versions available when a version was selected from a range, or
-     *         <code>null</code> if the artifact had a explicit version.
-     * @since 1.2
-     */
-    public List getAvailableVersions()
-    {
-        return availableVersions;
-    }
-    
-    public void setAvailableVersions( List availableVersions )
-    {
-        this.availableVersions = availableVersions;
-    }
-
-    /**
-     * Changes the state of this dependency node to be omitted for conflict or duplication, depending on the specified
-     * related artifact.
-     * 
-     * <p>
-     * If the related artifact has a version equal to this dependency node's artifact, then this dependency node's state
-     * is changed to <code>OMITTED_FOR_DUPLICATE</code>, otherwise it is changed to <code>OMITTED_FOR_CONFLICT</code>.
-     * Omitting this dependency node also removes all of its children.
-     * </p>
-     * 
-     * @param relatedArtifact
-     *            the artifact that this dependency node conflicted with
-     * @throws IllegalStateException
-     *             if this dependency node's state is not <code>INCLUDED</code>
-     * @throws IllegalArgumentException
-     *             if the related artifact was <code>null</code> or had a different dependency conflict id to this
-     *             dependency node's artifact
-     * @see #OMITTED_FOR_DUPLICATE
-     * @see #OMITTED_FOR_CONFLICT
-     * @since 1.1
-     */
-    public void omitForConflict( Artifact relatedArtifact )
-    {
-        if ( getState() != INCLUDED )
-        {
-            throw new IllegalStateException( "Only INCLUDED dependency nodes can be omitted for conflict" );
-        }
-
-        if ( relatedArtifact == null )
-        {
-            throw new IllegalArgumentException( "Related artifact cannot be null" );
-        }
-
-        if ( !relatedArtifact.getDependencyConflictId().equals( getArtifact().getDependencyConflictId() ) )
-        {
-            throw new IllegalArgumentException( "Related artifact has a different dependency conflict id" );
-        }
-
-        this.relatedArtifact = relatedArtifact;
-
-        boolean duplicate = false;
-        if ( getArtifact().getVersion() != null )
-        {
-            duplicate = getArtifact().getVersion().equals( relatedArtifact.getVersion() );
-        }
-        else if ( getArtifact().getVersionRange() != null )
-        {
-            duplicate = getArtifact().getVersionRange().equals( relatedArtifact.getVersionRange() );
-        }
-        else
-        {
-            throw new RuntimeException( "Artifact version and version range is null: " + getArtifact() );
-        }
-
-        state = duplicate ? OMITTED_FOR_DUPLICATE : OMITTED_FOR_CONFLICT;
-
-        removeAllChildren();
-    }
-
-    /**
-     * Changes the state of this dependency node to be omitted for a cycle in the dependency tree.
-     * 
-     * <p>
-     * Omitting this node sets its state to <code>OMITTED_FOR_CYCLE</code> and removes all of its children.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if this dependency node's state is not <code>INCLUDED</code>
-     * @see #OMITTED_FOR_CYCLE
-     * @since 1.1
-     */
-    public void omitForCycle()
-    {
-        if ( getState() != INCLUDED )
-        {
-            throw new IllegalStateException( "Only INCLUDED dependency nodes can be omitted for cycle" );
-        }
-
-        state = OMITTED_FOR_CYCLE;
-
-        removeAllChildren();
-    }
-    
-    /**
-     * Gets an iterator that returns this dependency node and it's children in preorder traversal.
-     * 
-     * @return the preorder traversal iterator
-     * @see #preorderIterator()
-     */
-    public Iterator iterator()
-    {
-        return preorderIterator();
-    }
-
-    /**
-     * Gets an iterator that returns this dependency node and it's children in preorder traversal.
-     * 
-     * @return the preorder traversal iterator
-     * @see DependencyTreePreorderIterator
-     */
-    public Iterator preorderIterator()
-    {
-        return new DependencyTreePreorderIterator( this );
-    }
-
-    /**
-     * Gets an iterator that returns this dependency node and it's children in postorder traversal.
-     * 
-     * @return the postorder traversal iterator
-     * @see DependencyTreeInverseIterator
-     */
-    public Iterator inverseIterator()
-    {
-        return new DependencyTreeInverseIterator( this );
-    }
-
-    /**
-     * Returns a string representation of this dependency node.
-     * 
-     * @return the string representation
-     * @see #toString()
-     * @since 1.1
-     */
-    public String toNodeString()
-    {
-        StringBuffer buffer = new StringBuffer();
-
-        boolean included = ( getState() == INCLUDED );
-
-        if ( !included )
-        {
-            buffer.append( '(' );
-        }
-
-        buffer.append( artifact );
-        
-        ItemAppender appender = new ItemAppender( buffer, included ? " (" : " - ", "; ", included ? ")" : "" );
-
-        if ( getPremanagedVersion() != null )
-        {
-            appender.append( "version managed from ", getPremanagedVersion() );
-        }
-            
-        if ( getPremanagedScope() != null )
-        {
-            appender.append( "scope managed from ", getPremanagedScope() );
-        }
-        
-        if ( getOriginalScope() != null )
-        {
-            appender.append( "scope updated from ", getOriginalScope() );
-        }
-        
-        if ( getFailedUpdateScope() != null )
-        {
-            appender.append( "scope not updated to ", getFailedUpdateScope() );
-        }
-        
-        if ( getVersionSelectedFromRange() != null )
-        {
-            appender.append( "version selected from range ", getVersionSelectedFromRange().toString() );
-            appender.append( "available versions ", getAvailableVersions().toString() );
-        }
-        
-        switch ( state )
-        {
-            case INCLUDED:
-                break;
-                
-            case OMITTED_FOR_DUPLICATE:
-                appender.append( "omitted for duplicate" );
-                break;
-
-            case OMITTED_FOR_CONFLICT:
-                appender.append( "omitted for conflict with ", relatedArtifact.getVersion() );
-                break;
-
-            case OMITTED_FOR_CYCLE:
-                appender.append( "omitted for cycle" );
-                break;
-        }
-        
-        appender.flush();
-        
-        if ( !included )
-        {
-            buffer.append( ')' );
-        }
-
-        return buffer.toString();
-    }
-    
-    /**
-     * Returns a string representation of this dependency node and its children, indented to the specified depth.
-     * 
-     * <p>
-     * As of 1.1, this method ignores the indentation depth and simply delegates to <code>toString()</code>.
-     * </p>
-     * 
-     * @param indentDepth
-     *            the indentation depth
-     * @return the string representation
-     * @deprecated As of 1.1, replaced by {@link #toString()}
-     */
-    public String toString( int indentDepth )
-    {
-        return toString();
-    }
-    
-    // Object methods ---------------------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public int hashCode()
-    {
-        // TODO: probably better using commons-lang HashCodeBuilder
-        
-        int hashCode = 1;
-        
-        hashCode = hashCode * 31 + getArtifact().hashCode();
-        // DefaultArtifact.hashCode does not consider scope
-        hashCode = hashCode * 31 + nullHashCode( getArtifact().getScope() );
-
-        // TODO: use parent's artifact to prevent recursion - how can we improve this?
-        hashCode = hashCode * 31 + nullHashCode( nullGetArtifact( getParent() ) );
-        
-        hashCode = hashCode * 31 + getChildren().hashCode();
-        hashCode = hashCode * 31 + getState();
-        hashCode = hashCode * 31 + nullHashCode( getRelatedArtifact() );
-        hashCode = hashCode * 31 + nullHashCode( getPremanagedVersion() );
-        hashCode = hashCode * 31 + nullHashCode( getPremanagedScope() );
-        hashCode = hashCode * 31 + nullHashCode( getOriginalScope() );
-        hashCode = hashCode * 31 + nullHashCode( getFailedUpdateScope() );
-        hashCode = hashCode * 31 + nullHashCode( getVersionSelectedFromRange() );
-        hashCode = hashCode * 31 + nullHashCode( getAvailableVersions() );
-
-        return hashCode;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean equals( Object object )
-    {
-        // TODO: probably better using commons-lang EqualsBuilder
-        
-        boolean equal;
-
-        if ( object instanceof DependencyNode )
-        {
-            DependencyNode node = (DependencyNode) object;
-
-            equal = getArtifact().equals( node.getArtifact() );
-            // DefaultArtifact.hashCode does not consider scope
-            equal &= nullEquals( getArtifact().getScope(), node.getArtifact().getScope() );
-            
-            // TODO: use parent's artifact to prevent recursion - how can we improve this?
-            equal &= nullEquals( nullGetArtifact( getParent() ), nullGetArtifact( node.getParent() ) );
-            
-            equal &= getChildren().equals( node.getChildren() );
-            equal &= getState() == node.getState();
-            equal &= nullEquals( getRelatedArtifact(), node.getRelatedArtifact() );
-            equal &= nullEquals( getPremanagedVersion(), node.getPremanagedVersion() );
-            equal &= nullEquals( getPremanagedScope(), node.getPremanagedScope() );
-            equal &= nullEquals( getOriginalScope(), node.getOriginalScope() );
-            equal &= nullEquals( getFailedUpdateScope(), node.getFailedUpdateScope() );
-            equal &= nullEquals( getVersionSelectedFromRange(), node.getVersionSelectedFromRange() );
-            equal &= nullEquals( getAvailableVersions(), node.getAvailableVersions() );
-        }
-        else
-        {
-            equal = false;
-        }
-
-        return equal;
-    }
-
-    /**
-     * Returns a string representation of this dependency node and its children.
-     * 
-     * @return the string representation
-     * @see #toNodeString()
-     * @see java.lang.Object#toString()
-     */
-    public String toString()
-    {
-        StringWriter writer = new StringWriter();
-        accept( new SerializingDependencyNodeVisitor( writer ) );
-        return writer.toString();
-    }
-
-    // private methods --------------------------------------------------------
-
-    /**
-     * Removes all of this dependency node's children.
-     */
-    private void removeAllChildren()
-    {
-        for ( Iterator iterator = children.iterator(); iterator.hasNext(); )
-        {
-            DependencyNode child = (DependencyNode) iterator.next();
-
-            child.parent = null;
-        }
-
-        children.clear();
-    }
-
-    /**
-     * Computes a hash-code for the specified object.
-     * 
-     * @param a
-     *            the object to compute a hash-code for, possibly <code>null</code>
-     * @return the computed hash-code
-     */
-    private int nullHashCode( Object a )
-    {
-        return ( a == null ) ? 0 : a.hashCode();
-    }
-
-    /**
-     * Gets whether the specified objects are equal.
-     * 
-     * @param a
-     *            the first object to compare, possibly <code>null</code>
-     * @param b
-     *            the second object to compare, possibly <code>null</code>
-     * @return <code>true</code> if the specified objects are equal
-     */
-    private boolean nullEquals( Object a, Object b )
-    {
-        return ( a == null ? b == null : a.equals( b ) );
-    }
-    
-    /**
-     * Gets the artifact for the specified node.
-     * 
-     * @param node
-     *            the dependency node, possibly <code>null</code>
-     * @return the node's artifact, or <code>null</code> if the specified node was <code>null</code>
-     */
-    private static Artifact nullGetArtifact( DependencyNode node )
-    {
-        return ( node != null ) ? node.getArtifact() : null;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
deleted file mode 100644
index 921c3be..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Represents a Maven project's dependency tree.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DependencyTree.java 661727 2008-05-30 14:21:49Z bentmann $
- * @deprecated As of 1.1, replaced by the dependency tree root {@link DependencyNode}
- */
-public class DependencyTree
-{
-    // fields -----------------------------------------------------------------
-
-    private final DependencyNode rootNode;
-
-    private final Collection nodes;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Create a tree initialized to the arguments
-     * 
-     * @param rootNode
-     * @param nodes
-     */
-    public DependencyTree( DependencyNode rootNode, Collection nodes )
-    {
-        this.rootNode = rootNode;
-        this.nodes = nodes;
-    }
-
-    // public methods ---------------------------------------------------------
-
-    public DependencyNode getRootNode()
-    {
-        return rootNode;
-    }
-
-    public Collection getNodes()
-    {
-        return nodes;
-    }
-
-    public List getArtifacts()
-    {
-        List artifacts = new ArrayList();
-
-        Iterator it = getNodes().iterator();
-        while ( it.hasNext() )
-        {
-            DependencyNode node = (DependencyNode) it.next();
-            artifacts.add( node.getArtifact() );
-        }
-
-        return artifacts;
-    }
-
-    public String toString()
-    {
-        return getRootNode().toString();
-    }
-
-    /**
-     * @see DependencyNode#iterator()
-     */
-    public Iterator iterator()
-    {
-        return getRootNode().iterator();
-    }
-
-    /**
-     * @see DependencyNode#preorderIterator()
-     */
-    public Iterator preorderIterator()
-    {
-        return getRootNode().preorderIterator();
-    }
-
-    /**
-     * @see DependencyNode#inverseIterator()
-     */
-    public Iterator inverseIterator()
-    {
-        return getRootNode().inverseIterator();
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
deleted file mode 100644
index 166c2a8..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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 org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.project.MavenProject;
-
-/**
- * Builds a tree of dependencies for a given Maven project.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DependencyTreeBuilder.java 661727 2008-05-30 14:21:49Z bentmann $
- */
-public interface DependencyTreeBuilder
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The plexus role for this component.
-     */
-    String ROLE = DependencyTreeBuilder.class.getName();
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Builds a tree of dependencies for the specified Maven project.
-     * 
-     * @param project
-     *            the Maven project
-     * @param repository
-     *            the artifact repository to resolve against
-     * @param factory
-     *            the artifact factory to use
-     * @param metadataSource
-     *            the artifact metadata source to use
-     * @param collector
-     *            the artifact collector to use
-     * @return the dependency tree of the specified Maven project
-     * @throws DependencyTreeBuilderException
-     *             if the dependency tree cannot be resolved
-     * @deprecated As of 1.1, replaced by
-     *             {@link #buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
-     */
-    DependencyTree buildDependencyTree( MavenProject project, ArtifactRepository repository, ArtifactFactory factory,
-                                        ArtifactMetadataSource metadataSource, ArtifactCollector collector )
-        throws DependencyTreeBuilderException;
-
-    /**
-     * Builds a tree of dependencies for the specified Maven project.
-     * 
-     * @param project
-     *            the Maven project
-     * @param repository
-     *            the artifact repository to resolve against
-     * @param factory
-     *            the artifact factory to use
-     * @param metadataSource
-     *            the artifact metadata source to use
-     * @param filter
-     *            the artifact filter to use
-     * @param collector
-     *            the artifact collector to use
-     * @return the dependency tree root node of the specified Maven project
-     * @throws DependencyTreeBuilderException
-     *             if the dependency tree cannot be resolved
-     * @since 1.1
-     */
-    DependencyNode buildDependencyTree( MavenProject project, ArtifactRepository repository, ArtifactFactory factory,
-                                        ArtifactMetadataSource metadataSource, ArtifactFilter filter, ArtifactCollector collector )
-        throws DependencyTreeBuilderException;
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
deleted file mode 100644
index 8f9a0a8..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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.
- */
-
-/**
- * Indicates that a Maven project's dependency tree cannot be resolved.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DependencyTreeBuilderException.java 661727 2008-05-30 14:21:49Z bentmann $
- */
-public class DependencyTreeBuilderException extends Exception
-{
-    // constants --------------------------------------------------------------
-
-    /**
-     * The serialisation unique ID.
-     */
-    private static final long serialVersionUID = -3525803081807951764L;
-
-    // constructors -----------------------------------------------------------
-
-    public DependencyTreeBuilderException( String message )
-    {
-        super( message );
-    }
-
-    public DependencyTreeBuilderException( String message, Throwable cause )
-    {
-        super( message, cause );
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java
deleted file mode 100644
index 1c9e764..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeInverseIterator.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Stack;
-
-/**
- * {@link Iterator} for {@link DependencyNode} implementing a traversal from leaves to root.
- * 
- * TODO {@link #DependencyTreeInverseIterator(DependencyNode)} is costly,
- * a better implementation would move the cost to {@link #next()}
- * 
- * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
- * @version $Id: DependencyTreeInverseIterator.java 661727 2008-05-30 14:21:49Z bentmann $
- */
-public class DependencyTreeInverseIterator
-    implements Iterator
-{
-    private Stack nodesToProcess = new Stack();
-
-    public DependencyTreeInverseIterator( DependencyNode rootNode )
-    {
-        DependencyTreePreorderIterator it = new DependencyTreePreorderIterator( rootNode );
-        while ( it.hasNext() )
-        {
-            nodesToProcess.push( it.next() );
-        }
-    }
-
-    public boolean hasNext()
-    {
-        return !nodesToProcess.isEmpty();
-    }
-
-    public Object next()
-    {
-        if ( !hasNext() )
-        {
-            throw new NoSuchElementException();
-        }
-        return nodesToProcess.pop();
-    }
-
-    /**
-     * @throws UnsupportedOperationException
-     */
-    public void remove()
-    {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java
deleted file mode 100644
index df5277f..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreePreorderIterator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.apache.maven.shared.dependency.tree;
-
-/*
- * 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.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Stack;
-
-/**
- * {@link Iterator} for {@link DependencyNode} implementing a preoder traversal.
- * 
- * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
- * @version $Id: DependencyTreePreorderIterator.java 661727 2008-05-30 14:21:49Z bentmann $
- */
-public class DependencyTreePreorderIterator
-    implements Iterator
-{
-    private Stack nodesToProcess = new Stack();
-
-    public DependencyTreePreorderIterator( DependencyNode rootNode )
-    {
-        nodesToProcess.push( rootNode );
-    }
-
-    public boolean hasNext()
-    {
-        return !nodesToProcess.isEmpty();
-    }
-
-    public Object next()
-    {
-        if ( !hasNext() )
-        {
-            throw new NoSuchElementException();
-        }
-        DependencyNode currentNode = (DependencyNode) nodesToProcess.pop();
-        List children = currentNode.getChildren();
-        if ( children != null )
-        {
-            for ( int i = children.size() - 1; i >= 0; i-- )
-            {
-                nodesToProcess.push( children.get( i ) );
-            }
-        }
-        return currentNode;
-    }
-
-    /**
-     * @throws UnsupportedOperationException
-     */
-    public void remove()
-    {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
index 492f382..b03b914 100644
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
+++ b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
@@ -338,7 +338,7 @@
              * Cache management information and apply in includeArtifact, since DefaultArtifactCollector mutates the
              * artifact and then calls includeArtifact after manageArtifact.
              */
-            managedVersions.put( replacement.getId(), artifact.getVersion() );
+            managedVersions.put( getRangeId( replacement ), artifact.getVersion() );
         }
     }
 
@@ -359,7 +359,7 @@
              * Cache management information and apply in includeArtifact, since DefaultArtifactCollector mutates the
              * artifact and then calls includeArtifact after manageArtifact.
              */
-            managedScopes.put( replacement.getId(), artifact.getScope() );
+            managedScopes.put( getRangeId( replacement ), artifact.getScope() );
         }
     }
     
@@ -525,8 +525,8 @@
     private void flushDependencyManagement( DependencyNode node )
     {
         Artifact artifact = node.getArtifact();
-        String premanagedVersion = (String) managedVersions.get( artifact.getId() );
-        String premanagedScope = (String) managedScopes.get( artifact.getId() );
+        String premanagedVersion = (String) managedVersions.get( getRangeId( artifact ) );
+        String premanagedScope = (String) managedScopes.get( getRangeId( artifact ) );
         
         if ( premanagedVersion != null || premanagedScope != null )
         {
@@ -544,4 +544,9 @@
             premanagedScope = null;
         }
     }
+
+    private static String getRangeId( Artifact artifact )
+    {
+        return artifact.getDependencyConflictId() + ":" + artifact.getVersionRange();
+    }
 }
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java
deleted file mode 100644
index 7f56896..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/AncestorOrSelfDependencyNodeFilter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.apache.maven.shared.dependency.tree.filter;
-
-/*
- * 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.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node filter than only accepts nodes that are ancestors of, or equal to, a given list of nodes.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: AncestorOrSelfDependencyNodeFilter.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class AncestorOrSelfDependencyNodeFilter implements DependencyNodeFilter
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The list of nodes that this filter accepts ancestors-or-self of.
-     */
-    private final List descendantNodes;
-
-    // constructors -----------------------------------------------------------
-
-    public AncestorOrSelfDependencyNodeFilter( DependencyNode descendantNode )
-    {
-        this( Collections.singletonList( descendantNode ) );
-    }
-
-    /**
-     * Creates a dependency node filter that only accepts nodes that are ancestors of, or equal to, the specified list
-     * of nodes.
-     * 
-     * @param descendantNodes
-     *            the list of nodes to accept ancestors-or-self of
-     */
-    public AncestorOrSelfDependencyNodeFilter( List descendantNodes )
-    {
-        this.descendantNodes = descendantNodes;
-    }
-
-    // DependencyNodeFilter methods -------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean accept( DependencyNode node )
-    {
-        boolean accept = false;
-
-        for ( Iterator iterator = descendantNodes.iterator(); !accept && iterator.hasNext(); )
-        {
-            DependencyNode descendantNode = (DependencyNode) iterator.next();
-
-            if ( isAncestorOrSelf( node, descendantNode ) )
-            {
-                accept = true;
-            }
-        }
-
-        return accept;
-    }
-
-    // private methods --------------------------------------------------------
-
-    /**
-     * Gets whether the first dependency node is an ancestor-or-self of the second.
-     * 
-     * @param ancestorNode
-     *            the ancestor-or-self dependency node
-     * @param descendantNode
-     *            the dependency node to test
-     * @return <code>true</code> if <code>ancestorNode</code> is an ancestor, or equal to,
-     *         <code>descendantNode</code>
-     */
-    private boolean isAncestorOrSelf( DependencyNode ancestorNode, DependencyNode descendantNode )
-    {
-        boolean ancestor = false;
-
-        while ( !ancestor && descendantNode != null )
-        {
-            ancestor = ancestorNode.equals( descendantNode );
-
-            descendantNode = descendantNode.getParent();
-        }
-
-        return ancestor;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java
deleted file mode 100644
index b5f801c..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/AndDependencyNodeFilter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.apache.maven.shared.dependency.tree.filter;
-
-/*
- * 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.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node filter that logically ANDs together a number of other dependency node filters.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: AndDependencyNodeFilter.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class AndDependencyNodeFilter implements DependencyNodeFilter
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The dependency node filters that this filter ANDs together.
-     */
-    private final List filters;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node filter that logically ANDs together the two specified dependency node filters.
-     * 
-     * @param filter1
-     *            the first dependency node filter to logically AND together
-     * @param filter2
-     *            the second dependency node filter to logically AND together
-     */
-    public AndDependencyNodeFilter( DependencyNodeFilter filter1, DependencyNodeFilter filter2 )
-    {
-        this( Arrays.asList( new DependencyNodeFilter[] { filter1, filter2 } ) );
-    }
-
-    /**
-     * Creates a dependency node filter that logically ANDs together the specified dependency node filters.
-     * 
-     * @param filters
-     *            the list of dependency node filters to logically AND together
-     */
-    public AndDependencyNodeFilter( List filters )
-    {
-        this.filters = Collections.unmodifiableList( filters );
-    }
-
-    // DependencyNodeFilter methods -------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean accept( DependencyNode node )
-    {
-        boolean accept = true;
-
-        for ( Iterator iterator = filters.iterator(); accept && iterator.hasNext(); )
-        {
-            DependencyNodeFilter filter = (DependencyNodeFilter) iterator.next();
-
-            accept = filter.accept( node );
-        }
-
-        return accept;
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Gets the list of dependency node filters that this filter ANDs together.
-     * 
-     * @return the dependency node filters that this filter ANDs together
-     */
-    public List getDependencyNodeFilters()
-    {
-        return filters;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java
deleted file mode 100644
index 9db6d4e..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/ArtifactDependencyNodeFilter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.apache.maven.shared.dependency.tree.filter;
-
-/*
- * 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 org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node filter that delegates to an artifact filter.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: ArtifactDependencyNodeFilter.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class ArtifactDependencyNodeFilter implements DependencyNodeFilter
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The artifact filter this dependency node filter delegates to.
-     */
-    private final ArtifactFilter filter;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node filter that delegates to the specified artifact filter.
-     * 
-     * @param filter
-     *            the artifact filter to delegate to
-     */
-    public ArtifactDependencyNodeFilter( ArtifactFilter filter )
-    {
-        this.filter = filter;
-    }
-
-    // DependencyNodeFilter methods -------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean accept( DependencyNode node )
-    {
-        Artifact artifact = node.getArtifact();
-
-        return filter.include( artifact );
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Gets the artifact filter this dependency node filter delegates to.
-     * 
-     * @return the artifact filter this dependency node filter delegates to
-     */
-    public ArtifactFilter getArtifactFilter()
-    {
-        return filter;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/DependencyNodeFilter.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/DependencyNodeFilter.java
deleted file mode 100644
index 221769d..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/DependencyNodeFilter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.apache.maven.shared.dependency.tree.filter;
-
-/*
- * 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 org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * Defines a filter for dependency nodes.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DependencyNodeFilter.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public interface DependencyNodeFilter
-{
-    /**
-     * Gets whether this filter accepts the specified dependency node.
-     * 
-     * @param node
-     *            the dependency node to check
-     * @return <code>true</code> if this filter accepts the specified dependency node
-     */
-    boolean accept( DependencyNode node );
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java
deleted file mode 100644
index 116cd80..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/filter/StateDependencyNodeFilter.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.apache.maven.shared.dependency.tree.filter;
-
-/*
- * 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 org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node filter that accepts nodes depending on their state.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: StateDependencyNodeFilter.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class StateDependencyNodeFilter implements DependencyNodeFilter
-{
-    // constants --------------------------------------------------------------
-
-    /**
-     * A dependency node filter that only accepts included nodes.
-     */
-    public static final StateDependencyNodeFilter INCLUDED = new StateDependencyNodeFilter( DependencyNode.INCLUDED );
-
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The state of dependency nodes to accept.
-     * 
-     * @see DependencyNode
-     */
-    private final int state;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node filter that only accepts dependency nodes of the specified state.
-     * 
-     * @param state
-     *            the state of dependency nodes to accept
-     * @throws IllegalArgumentException
-     *             if the specified state is invalid
-     */
-    public StateDependencyNodeFilter( int state )
-    {
-        if ( state < DependencyNode.INCLUDED || state > DependencyNode.OMITTED_FOR_CYCLE )
-        {
-            throw new IllegalArgumentException( "Unknown state: " + state );
-        }
-
-        this.state = state;
-    }
-
-    // DependencyNodeFilter methods -------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean accept( DependencyNode node )
-    {
-        return node.getState() == state;
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Gets the dependency node state that this filter accepts.
-     * 
-     * @return the dependency node state that this filter accepts
-     */
-    public int getState()
-    {
-        return state;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java
deleted file mode 100644
index 2be5777..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/BuildingDependencyNodeVisitor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package org.apache.maven.shared.dependency.tree.traversal;
-
-/*
- * 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.Stack;
-
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node visitor that clones visited nodes into a new dependency tree. This can be used in conjunction with
- * a dependency node filter to construct subtrees.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: BuildingDependencyNodeVisitor.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class BuildingDependencyNodeVisitor implements DependencyNodeVisitor
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The dependency node visitor to apply on the resultant dependency tree, or <code>null</code> for none.
-     */
-    private final DependencyNodeVisitor visitor;
-
-    /**
-     * The resultant tree parent nodes for the currently visited node.
-     */
-    private final Stack parentNodes;
-
-    /**
-     * The root node of the resultant tree.
-     */
-    private DependencyNode rootNode;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node visitor that clones visited nodes into a new dependency tree.
-     */
-    public BuildingDependencyNodeVisitor()
-    {
-        this( null );
-    }
-
-    /**
-     * Creates a dependency node visitor that clones visited nodes into a new dependency tree, and then applies the
-     * specified dependency node visitor on the resultant dependency tree.
-     * 
-     * @param visitor
-     *            the dependency node visitor to apply on the resultant dependency tree, or <code>null</code> for none
-     */
-    public BuildingDependencyNodeVisitor( DependencyNodeVisitor visitor )
-    {
-        this.visitor = visitor;
-
-        parentNodes = new Stack();
-    }
-
-    // DependencyNodeVisitor methods ------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean visit( DependencyNode node )
-    {
-        // clone the node
-        DependencyNode newNode = new DependencyNode( node.getArtifact(), node.getState(), node.getRelatedArtifact() );
-        newNode.setOriginalScope( node.getOriginalScope() );
-        newNode.setFailedUpdateScope( node.getFailedUpdateScope() );
-        newNode.setPremanagedVersion( node.getPremanagedVersion() );
-        newNode.setPremanagedScope( node.getPremanagedScope() );
-
-        if ( parentNodes.empty() )
-        {
-            rootNode = newNode;
-        }
-        else
-        {
-            DependencyNode parentNode = (DependencyNode) parentNodes.peek();
-            parentNode.addChild( newNode );
-        }
-
-        parentNodes.push( newNode );
-
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean endVisit( DependencyNode node )
-    {
-        parentNodes.pop();
-
-        // apply the visitor to the resultant tree on the last visit
-        if ( parentNodes.empty() && visitor != null )
-        {
-            rootNode.accept( visitor );
-        }
-
-        return true;
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Gets the dependency node visitor that this visitor applies on the resultant dependency tree.
-     * 
-     * @return the dependency node visitor, or <code>null</code> for none
-     */
-    public DependencyNodeVisitor getDependencyNodeVisitor()
-    {
-        return visitor;
-    }
-
-    /**
-     * Gets the root node of the resultant dependency tree constructed by this visitor.
-     * 
-     * @return the root node, or <code>null</code> if the source tree has not yet been visited
-     */
-    public DependencyNode getDependencyTree()
-    {
-        return rootNode;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java
deleted file mode 100644
index b813267..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/CollectingDependencyNodeVisitor.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.apache.maven.shared.dependency.tree.traversal;
-
-/*
- * 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.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node visitor that collects visited nodes for further processing.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: CollectingDependencyNodeVisitor.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class CollectingDependencyNodeVisitor implements DependencyNodeVisitor
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The collected list of nodes.
-     */
-    private final List nodes;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node visitor that collects visited nodes for further processing.
-     */
-    public CollectingDependencyNodeVisitor()
-    {
-        nodes = new ArrayList();
-    }
-
-    // DependencyNodeVisitor methods ------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean visit( DependencyNode node )
-    {
-        // collect node
-        nodes.add( node );
-
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean endVisit( DependencyNode node )
-    {
-        return true;
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Gets the list of collected dependency nodes.
-     * 
-     * @return the list of collected dependency nodes
-     */
-    public List getNodes()
-    {
-        return Collections.unmodifiableList( nodes );
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/DependencyNodeVisitor.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/DependencyNodeVisitor.java
deleted file mode 100644
index 011c9cb..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/DependencyNodeVisitor.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.apache.maven.shared.dependency.tree.traversal;
-
-/*
- * 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 org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * Defines a hierarchical visitor for processing dependency node trees.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: DependencyNodeVisitor.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public interface DependencyNodeVisitor
-{
-    /**
-     * Starts the visit to the specified dependency node.
-     * 
-     * @param node
-     *            the dependency node to visit
-     * @return <code>true</code> to visit the specified dependency node's children, <code>false</code> to skip the
-     *         specified dependency node's children and proceed to its next sibling
-     */
-    boolean visit( DependencyNode node );
-
-    /**
-     * Ends the visit to to the specified dependency node.
-     * 
-     * @param node
-     *            the dependency node to visit
-     * @return <code>true</code> to visit the specified dependency node's next sibling, <code>false</code> to skip
-     *         the specified dependency node's next siblings and proceed to its parent
-     */
-    boolean endVisit( DependencyNode node );
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java
deleted file mode 100644
index 86cf6e8..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/FilteringDependencyNodeVisitor.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.apache.maven.shared.dependency.tree.traversal;
-
-/*
- * 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 org.apache.maven.shared.dependency.tree.DependencyNode;
-import org.apache.maven.shared.dependency.tree.filter.DependencyNodeFilter;
-
-/**
- * A dependency node visitor that filters nodes and delegates to another visitor.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: FilteringDependencyNodeVisitor.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class FilteringDependencyNodeVisitor implements DependencyNodeVisitor
-{
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The dependency node visitor to delegate to.
-     */
-    private final DependencyNodeVisitor visitor;
-
-    /**
-     * The dependency node filter to apply before delegation.
-     */
-    private final DependencyNodeFilter filter;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node visitor that delegates nodes that are accepted by the specified filter to the specified
-     * visitor.
-     * 
-     * @param visitor
-     *            the dependency node visitor to delegate to
-     * @param filter
-     *            the dependency node filter to apply before delegation
-     */
-    public FilteringDependencyNodeVisitor( DependencyNodeVisitor visitor, DependencyNodeFilter filter )
-    {
-        this.visitor = visitor;
-        this.filter = filter;
-    }
-
-    // DependencyNodeVisitor methods ------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean visit( DependencyNode node )
-    {
-        boolean visit;
-
-        if ( filter.accept( node ) )
-        {
-            visit = visitor.visit( node );
-        }
-        else
-        {
-            visit = true;
-        }
-
-        return visit;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean endVisit( DependencyNode node )
-    {
-        boolean visit;
-
-        if ( filter.accept( node ) )
-        {
-            visit = visitor.endVisit( node );
-        }
-        else
-        {
-            visit = true;
-        }
-
-        return visit;
-    }
-
-    // public methods ---------------------------------------------------------
-
-    /**
-     * Gets the dependency node visitor that this visitor delegates to.
-     * 
-     * @return the dependency node visitor
-     */
-    public DependencyNodeVisitor getDependencyNodeVisitor()
-    {
-        return visitor;
-    }
-
-    /**
-     * Gets the dependency node filter that this visitor applies before delegation.
-     * 
-     * @return the dependency node filter
-     */
-    public DependencyNodeFilter getDependencyNodeFilter()
-    {
-        return filter;
-    }
-}
diff --git a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java b/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java
deleted file mode 100644
index 14422a4..0000000
--- a/bundleplugin/src/main/java/org/apache/maven/shared/dependency/tree/traversal/SerializingDependencyNodeVisitor.java
+++ /dev/null
@@ -1,242 +0,0 @@
-package org.apache.maven.shared.dependency.tree.traversal;
-
-/*
- * 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.io.PrintWriter;
-import java.io.Writer;
-import java.util.List;
-
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-
-/**
- * A dependency node visitor that serializes visited nodes to a writer.
- * 
- * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id: SerializingDependencyNodeVisitor.java 661727 2008-05-30 14:21:49Z bentmann $
- * @since 1.1
- */
-public class SerializingDependencyNodeVisitor implements DependencyNodeVisitor
-{
-    // classes ----------------------------------------------------------------
-
-    /**
-     * Provides tokens to use when serializing the dependency tree.
-     */
-    public static class TreeTokens
-    {
-        private final String nodeIndent;
-
-        private final String lastNodeIndent;
-
-        private final String fillIndent;
-
-        private final String lastFillIndent;
-
-        public TreeTokens( String nodeIndent, String lastNodeIndent, String fillIndent, String lastFillIndent )
-        {
-            this.nodeIndent = nodeIndent;
-            this.lastNodeIndent = lastNodeIndent;
-            this.fillIndent = fillIndent;
-            this.lastFillIndent = lastFillIndent;
-        }
-
-        public String getNodeIndent( boolean last )
-        {
-            return last ? lastNodeIndent : nodeIndent;
-        }
-
-        public String getFillIndent( boolean last )
-        {
-            return last ? lastFillIndent : fillIndent;
-        }
-    }
-
-    // constants --------------------------------------------------------------
-
-    /**
-     * Whitespace tokens to use when outputing the dependency tree.
-     */
-    public static final TreeTokens WHITESPACE_TOKENS = new TreeTokens( "   ", "   ", "   ", "   " );
-
-    /**
-     * The standard ASCII tokens to use when outputing the dependency tree.
-     */
-    public static final TreeTokens STANDARD_TOKENS = new TreeTokens( "+- ", "\\- ", "|  ", "   " );
-
-    /**
-     * The extended ASCII tokens to use when outputing the dependency tree.
-     */
-    public static final TreeTokens EXTENDED_TOKENS =
-        new TreeTokens( "\u00c3\u00c4 ", "\u00c0\u00c4 ", "\u00b3  ", "   " );
-
-    // fields -----------------------------------------------------------------
-
-    /**
-     * The writer to serialize to.
-     */
-    private final PrintWriter writer;
-
-    /**
-     * The tokens to use when serializing the dependency tree.
-     */
-    private final TreeTokens tokens;
-
-    /**
-     * The depth of the currently visited dependency node.
-     */
-    private int depth;
-
-    // constructors -----------------------------------------------------------
-
-    /**
-     * Creates a dependency node visitor that serializes visited nodes to the specified writer using whitespace tokens.
-     * 
-     * @param writer
-     *            the writer to serialize to
-     */
-    public SerializingDependencyNodeVisitor( Writer writer )
-    {
-        this( writer, WHITESPACE_TOKENS );
-    }
-
-    /**
-     * Creates a dependency node visitor that serializes visited nodes to the specified writer using the specified
-     * tokens.
-     * 
-     * @param writer
-     *            the writer to serialize to
-     * @param tokens
-     *            the tokens to use when serializing the dependency tree
-     */
-    public SerializingDependencyNodeVisitor( Writer writer, TreeTokens tokens )
-    {
-        if ( writer instanceof PrintWriter )
-        {
-            this.writer = (PrintWriter) writer;
-        }
-        else
-        {
-            this.writer = new PrintWriter( writer, true );
-        }
-
-        this.tokens = tokens;
-
-        depth = 0;
-    }
-
-    // DependencyNodeVisitor methods ------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean visit( DependencyNode node )
-    {
-        indent( node );
-
-        writer.println( node.toNodeString() );
-
-        depth++;
-
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean endVisit( DependencyNode node )
-    {
-        depth--;
-
-        return true;
-    }
-
-    // private methods --------------------------------------------------------
-
-    /**
-     * Writes the necessary tokens to indent the specified dependency node to this visitor's writer.
-     * 
-     * @param node
-     *            the dependency node to indent
-     */
-    private void indent( DependencyNode node )
-    {
-        for ( int i = 1; i < depth; i++ )
-        {
-            writer.write( tokens.getFillIndent( isLast( node, i ) ) );
-        }
-
-        if ( depth > 0 )
-        {
-            writer.write( tokens.getNodeIndent( isLast( node ) ) );
-        }
-    }
-
-    /**
-     * Gets whether the specified dependency node is the last of its siblings.
-     * 
-     * @param node
-     *            the dependency node to check
-     * @return <code>true</code> if the specified dependency node is the last of its last siblings
-     */
-    private boolean isLast( DependencyNode node )
-    {
-        // TODO: remove node argument and calculate from visitor calls only
-        
-        DependencyNode parent = node.getParent();
-
-        boolean last;
-
-        if ( parent == null )
-        {
-            last = true;
-        }
-        else
-        {
-            List siblings = parent.getChildren();
-
-            last = ( siblings.indexOf( node ) == siblings.size() - 1 );
-        }
-
-        return last;
-    }
-
-    /**
-     * Gets whether the specified dependency node ancestor is the last of its siblings.
-     * 
-     * @param node
-     *            the dependency node whose ancestor to check
-     * @param ancestorDepth
-     *            the depth of the ancestor of the specified dependency node to check
-     * @return <code>true</code> if the specified dependency node ancestor is the last of its siblings
-     */
-    private boolean isLast( DependencyNode node, int ancestorDepth )
-    {
-        // TODO: remove node argument and calculate from visitor calls only
-        
-        int distance = depth - ancestorDepth;
-
-        while ( distance-- > 0 )
-        {
-            node = node.getParent();
-        }
-
-        return isLast( node );
-    }
-}
