You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/04/04 15:12:56 UTC

[maven-resolver] branch MRESOLVER-248-collector-bf-df-coexists created (now d486deae)

This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a change to branch MRESOLVER-248-collector-bf-df-coexists
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


      at d486deae [MRESOLVER-248] Make BF and DF collectors coexists

This branch includes the following new commits:

     new d486deae [MRESOLVER-248] Make BF and DF collectors coexists

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-resolver] 01/01: [MRESOLVER-248] Make BF and DF collectors coexists

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch MRESOLVER-248-collector-bf-df-coexists
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit d486deaedfc91d4b2175b6aeed58b57aa6a12156
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Mon Apr 4 17:12:30 2022 +0200

    [MRESOLVER-248] Make BF and DF collectors coexists
---
 .../eclipse/aether/impl/guice/AetherModule.java    |  17 +
 .../impl/collect/CachingArtifactTypeRegistry.java  |   2 +-
 .../aether/internal/impl/collect/DataPool.java     |  20 +-
 .../DefaultDependencyCollectionContext.java        |   4 +-
 .../impl/collect/DefaultDependencyCollector.java   | 899 +--------------------
 ...efaultDependencyGraphTransformationContext.java |   4 +-
 .../impl/collect/DefaultVersionFilterContext.java  |   4 +-
 ...ipper.java => DependencyCollectorDelegate.java} |  30 +-
 .../BfDependencyCollector.java}                    |  62 +-
 .../BfDependencyCycle.java}                        |   7 +-
 .../BfProcessingContext.java}                      |  22 +-
 .../DefaultDependencyResolutionSkipper.java        |  20 +-
 .../{ => bf}/NeverDependencyResolutionSkipper.java |   8 +-
 .../BfDependencyCollectorTest.java}                |  27 +-
 .../BfDependencyCollectorUseSkipTest.java}         |  14 +-
 .../BfDependencyCycleTest.java}                    |  12 +-
 .../{ => bf}/DependencyResolutionSkipperTest.java  |  14 +-
 17 files changed, 167 insertions(+), 999 deletions(-)

diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
index 9629dc97..7d7f9f0b 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
@@ -48,6 +48,8 @@ import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory;
 import org.eclipse.aether.internal.impl.checksum.Sha256ChecksumAlgorithmFactory;
 import org.eclipse.aether.internal.impl.checksum.Sha512ChecksumAlgorithmFactory;
 import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector;
+import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate;
+import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
 import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
 import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactorySelector;
 import org.eclipse.aether.internal.impl.synccontext.named.SimpleNamedLockFactorySelector;
@@ -132,8 +134,12 @@ public class AetherModule
                 .to( DefaultRepositorySystem.class ).in( Singleton.class );
         bind( ArtifactResolver.class ) //
                 .to( DefaultArtifactResolver.class ).in( Singleton.class );
+
         bind( DependencyCollector.class ) //
                 .to( DefaultDependencyCollector.class ).in( Singleton.class );
+        bind( DependencyCollectorDelegate.class ).annotatedWith( Names.named( BfDependencyCollector.NAME ) )
+                .to( BfDependencyCollector.class ).in( Singleton.class );
+
         bind( Deployer.class ) //
                 .to( DefaultDeployer.class ).in( Singleton.class );
         bind( Installer.class ) //
@@ -223,6 +229,17 @@ public class AetherModule
         return providedChecksumsSource;
     }
 
+    @Provides
+    @Singleton
+    Map<String, DependencyCollectorDelegate> dependencyCollectorDelegates(
+            @Named( BfDependencyCollector.NAME ) DependencyCollectorDelegate bf
+    )
+    {
+        Map<String, DependencyCollectorDelegate> providedChecksumsSource = new HashMap<>();
+        providedChecksumsSource.put( BfDependencyCollector.NAME, bf );
+        return providedChecksumsSource;
+    }
+
     @Provides
     @Singleton
     Map<String, ChecksumAlgorithmFactory> provideChecksumTypes(
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java
index a2602344..bb03b142 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java
@@ -29,7 +29,7 @@ import org.eclipse.aether.artifact.ArtifactTypeRegistry;
 /**
  * A short-lived artifact type registry that caches results from a presumedly slower type registry.
  */
-class CachingArtifactTypeRegistry
+public class CachingArtifactTypeRegistry
     implements ArtifactTypeRegistry
 {
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
index 4a145558..d54a5634 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
@@ -49,7 +49,7 @@ import org.eclipse.aether.version.VersionConstraint;
 
 /**
  */
-final class DataPool
+public final class DataPool
 {
 
     private static final String ARTIFACT_POOL = DataPool.class.getName() + "$Artifact";
@@ -58,7 +58,7 @@ final class DataPool
 
     private static final String DESCRIPTORS = DataPool.class.getName() + "$Descriptors";
 
-    static final ArtifactDescriptorResult NO_DESCRIPTOR =
+    public static final ArtifactDescriptorResult NO_DESCRIPTOR =
         new ArtifactDescriptorResult( new ArtifactDescriptorRequest() );
 
     private ObjectPool<Artifact> artifacts;
@@ -72,7 +72,7 @@ final class DataPool
     private final Map<Object, List<DependencyNode>> nodes = new HashMap<>( 256 );
 
     @SuppressWarnings( "unchecked" )
-    DataPool( RepositorySystemSession session )
+    public DataPool( RepositorySystemSession session )
     {
         RepositoryCache cache = session.getCache();
 
@@ -121,12 +121,12 @@ final class DataPool
         return dependencies.intern( dependency );
     }
 
-    Object toKey( ArtifactDescriptorRequest request )
+    public Object toKey( ArtifactDescriptorRequest request )
     {
         return request.getArtifact();
     }
 
-    ArtifactDescriptorResult getDescriptor( Object key, ArtifactDescriptorRequest request )
+    public ArtifactDescriptorResult getDescriptor( Object key, ArtifactDescriptorRequest request )
     {
         Descriptor descriptor = descriptors.get( key );
         if ( descriptor != null )
@@ -136,22 +136,22 @@ final class DataPool
         return null;
     }
 
-    void putDescriptor( Object key, ArtifactDescriptorResult result )
+    public void putDescriptor( Object key, ArtifactDescriptorResult result )
     {
         descriptors.put( key, new GoodDescriptor( result ) );
     }
 
-    void putDescriptor( Object key, ArtifactDescriptorException e )
+    public void putDescriptor( Object key, ArtifactDescriptorException e )
     {
         descriptors.put( key, BadDescriptor.INSTANCE );
     }
 
-    Object toKey( VersionRangeRequest request )
+    public Object toKey( VersionRangeRequest request )
     {
         return new ConstraintKey( request );
     }
 
-    VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
+    public VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
     {
         Constraint constraint = constraints.get( key );
         if ( constraint != null )
@@ -161,7 +161,7 @@ final class DataPool
         return null;
     }
 
-    void putConstraint( Object key, VersionRangeResult result )
+    public void putConstraint( Object key, VersionRangeResult result )
     {
         constraints.put( key, new Constraint( result ) );
     }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java
index 3bf4fe1a..0c66fa79 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java
@@ -29,7 +29,7 @@ import org.eclipse.aether.graph.Dependency;
 /**
  * @see DefaultDependencyCollector
  */
-final class DefaultDependencyCollectionContext
+public final class DefaultDependencyCollectionContext
     implements DependencyCollectionContext
 {
 
@@ -41,7 +41,7 @@ final class DefaultDependencyCollectionContext
 
     private List<Dependency> managedDependencies;
 
-    DefaultDependencyCollectionContext( RepositorySystemSession session, Artifact artifact,
+    public DefaultDependencyCollectionContext( RepositorySystemSession session, Artifact artifact,
                                                Dependency dependency, List<Dependency> managedDependencies )
     {
         this.session = session;
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
index a895bb9b..1c0b6e95 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
@@ -19,914 +19,75 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-
-import static java.util.Objects.requireNonNull;
-import static org.eclipse.aether.internal.impl.collect.DefaultDependencyCycle.find;
-
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.eclipse.aether.DefaultRepositorySystemSession;
-import org.eclipse.aether.RepositoryException;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.RequestTrace;
-import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.artifact.ArtifactProperties;
 import org.eclipse.aether.collection.CollectRequest;
 import org.eclipse.aether.collection.CollectResult;
 import org.eclipse.aether.collection.DependencyCollectionException;
-import org.eclipse.aether.collection.DependencyGraphTransformer;
-import org.eclipse.aether.collection.DependencyManagement;
-import org.eclipse.aether.collection.DependencyManager;
-import org.eclipse.aether.collection.DependencySelector;
-import org.eclipse.aether.collection.DependencyTraverser;
-import org.eclipse.aether.collection.VersionFilter;
-import org.eclipse.aether.graph.DefaultDependencyNode;
-import org.eclipse.aether.graph.Dependency;
-import org.eclipse.aether.graph.DependencyNode;
-import org.eclipse.aether.graph.Exclusion;
-import org.eclipse.aether.impl.ArtifactDescriptorReader;
 import org.eclipse.aether.impl.DependencyCollector;
-import org.eclipse.aether.impl.DependencyResolutionSkipper;
-import org.eclipse.aether.impl.RemoteRepositoryManager;
-import org.eclipse.aether.impl.VersionRangeResolver;
-import org.eclipse.aether.repository.ArtifactRepository;
-import org.eclipse.aether.repository.RemoteRepository;
-import org.eclipse.aether.resolution.ArtifactDescriptorException;
-import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
-import org.eclipse.aether.resolution.ArtifactDescriptorResult;
-import org.eclipse.aether.resolution.VersionRangeRequest;
-import org.eclipse.aether.resolution.VersionRangeResolutionException;
-import org.eclipse.aether.resolution.VersionRangeResult;
+import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
 import org.eclipse.aether.spi.locator.Service;
 import org.eclipse.aether.spi.locator.ServiceLocator;
 import org.eclipse.aether.util.ConfigUtils;
-import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
-import org.eclipse.aether.util.graph.transformer.TransformationContextKeys;
-import org.eclipse.aether.version.Version;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
 
 /**
+ *
  */
 @Singleton
 @Named
 public class DefaultDependencyCollector
-    implements DependencyCollector, Service
+        implements DependencyCollector, Service
 {
+    private static final String CONFIG_PROP_COLLECTOR_IMPL = "aether.collector.impl";
 
-    /**
-     * The key in the repository session's {@link org.eclipse.aether.RepositorySystemSession#getConfigProperties()
-     * configuration properties} used to store a {@link Boolean} flag controlling the resolver's skip mode.
-     *
-     * @since 1.8.0
-     */
-    public static final String CONFIG_PROP_USE_SKIP = "aether.dependencyCollector.useSkip";
+    private static final String DEFAULT_COLLECTOR_IMPL = BfDependencyCollector.NAME;
+
+    private final Map<String, DependencyCollectorDelegate> delegates;
 
     /**
-     * The default value for {@link #CONFIG_PROP_USE_SKIP}, {@code true}.
+     * Default ctor for SL.
      *
-     * @since 1.8.0
+     * @deprecated SL is to be removed.
      */
-    public static final boolean CONFIG_PROP_USE_SKIP_DEFAULT = true;
-
-    private static final String CONFIG_PROP_MAX_EXCEPTIONS = "aether.dependencyCollector.maxExceptions";
-
-    private static final int CONFIG_PROP_MAX_EXCEPTIONS_DEFAULT = 50;
-
-    private static final String CONFIG_PROP_MAX_CYCLES = "aether.dependencyCollector.maxCycles";
-
-    private static final int CONFIG_PROP_MAX_CYCLES_DEFAULT = 10;
-
-    private static final Logger LOGGER = LoggerFactory.getLogger( DefaultDependencyCollector.class );
-
-    private RemoteRepositoryManager remoteRepositoryManager;
-
-    private ArtifactDescriptorReader descriptorReader;
-
-    private VersionRangeResolver versionRangeResolver;
-
+    @Deprecated
     public DefaultDependencyCollector()
     {
-        // enables default constructor
+        this.delegates = new HashMap<>();
     }
 
     @Inject
-    DefaultDependencyCollector( RemoteRepositoryManager remoteRepositoryManager,
-                                ArtifactDescriptorReader artifactDescriptorReader,
-                                VersionRangeResolver versionRangeResolver )
+    public DefaultDependencyCollector( Map<String, DependencyCollectorDelegate> delegates )
     {
-        setRemoteRepositoryManager( remoteRepositoryManager );
-        setArtifactDescriptorReader( artifactDescriptorReader );
-        setVersionRangeResolver( versionRangeResolver );
+        this.delegates = requireNonNull( delegates );
     }
 
+    @Override
     public void initService( ServiceLocator locator )
     {
-        setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) );
-        setArtifactDescriptorReader( locator.getService( ArtifactDescriptorReader.class ) );
-        setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) );
-    }
-
-    public DefaultDependencyCollector setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
-    {
-        this.remoteRepositoryManager =
-                requireNonNull( remoteRepositoryManager, "remote repository provider cannot be null" );
-        return this;
-    }
-
-    public DefaultDependencyCollector setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader )
-    {
-        descriptorReader = requireNonNull( artifactDescriptorReader, "artifact descriptor reader cannot be null" );
-        return this;
+        BfDependencyCollector bf = new BfDependencyCollector();
+        bf.initService( locator );
+        this.delegates.put( BfDependencyCollector.NAME, bf );
     }
 
-    public DefaultDependencyCollector setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
-    {
-        this.versionRangeResolver =
-                requireNonNull( versionRangeResolver, "version range resolver cannot be null" );
-        return this;
-    }
-
-    @SuppressWarnings( "checkstyle:methodlength" )
+    @Override
     public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request )
-        throws DependencyCollectionException
-    {
-        requireNonNull( session, "session cannot be null" );
-        requireNonNull( request, "request cannot be null" );
-        session = optimizeSession( session );
-
-        boolean useSkip = ConfigUtils.getBoolean(
-                session, CONFIG_PROP_USE_SKIP_DEFAULT, CONFIG_PROP_USE_SKIP
-        );
-        if ( useSkip )
-        {
-            LOGGER.debug( "Collector skip mode enabled" );
-        }
-
-        RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
-
-        CollectResult result = new CollectResult( request );
-
-        DependencySelector depSelector = session.getDependencySelector();
-        DependencyManager depManager = session.getDependencyManager();
-        DependencyTraverser depTraverser = session.getDependencyTraverser();
-        VersionFilter verFilter = session.getVersionFilter();
-
-        Dependency root = request.getRoot();
-        List<RemoteRepository> repositories = request.getRepositories();
-        List<Dependency> dependencies = request.getDependencies();
-        List<Dependency> managedDependencies = request.getManagedDependencies();
-
-        Map<String, Object> stats = new LinkedHashMap<>();
-        long time1 = System.nanoTime();
-
-        DefaultDependencyNode node;
-        if ( root != null )
-        {
-            List<? extends Version> versions;
-            VersionRangeResult rangeResult;
-            try
-            {
-                VersionRangeRequest rangeRequest =
-                    new VersionRangeRequest( root.getArtifact(), request.getRepositories(),
-                                             request.getRequestContext() );
-                rangeRequest.setTrace( trace );
-                rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
-                versions = filterVersions( root, rangeResult, verFilter, new DefaultVersionFilterContext( session ) );
-            }
-            catch ( VersionRangeResolutionException e )
-            {
-                result.addException( e );
-                throw new DependencyCollectionException( result, e.getMessage() );
-            }
-
-            Version version = versions.get( versions.size() - 1 );
-            root = root.setArtifact( root.getArtifact().setVersion( version.toString() ) );
-
-            ArtifactDescriptorResult descriptorResult;
-            try
-            {
-                ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
-                descriptorRequest.setArtifact( root.getArtifact() );
-                descriptorRequest.setRepositories( request.getRepositories() );
-                descriptorRequest.setRequestContext( request.getRequestContext() );
-                descriptorRequest.setTrace( trace );
-                if ( isLackingDescriptor( root.getArtifact() ) )
-                {
-                    descriptorResult = new ArtifactDescriptorResult( descriptorRequest );
-                }
-                else
-                {
-                    descriptorResult = descriptorReader.readArtifactDescriptor( session, descriptorRequest );
-                }
-            }
-            catch ( ArtifactDescriptorException e )
-            {
-                result.addException( e );
-                throw new DependencyCollectionException( result, e.getMessage() );
-            }
-
-            root = root.setArtifact( descriptorResult.getArtifact() );
-
-            if ( !session.isIgnoreArtifactDescriptorRepositories() )
-            {
-                repositories = remoteRepositoryManager.aggregateRepositories( session, repositories,
-                                                                              descriptorResult.getRepositories(),
-                                                                              true );
-            }
-            dependencies = mergeDeps( dependencies, descriptorResult.getDependencies() );
-            managedDependencies = mergeDeps( managedDependencies, descriptorResult.getManagedDependencies() );
-
-            node = new DefaultDependencyNode( root );
-            node.setRequestContext( request.getRequestContext() );
-            node.setRelocations( descriptorResult.getRelocations() );
-            node.setVersionConstraint( rangeResult.getVersionConstraint() );
-            node.setVersion( version );
-            node.setAliases( descriptorResult.getAliases() );
-            node.setRepositories( request.getRepositories() );
-        }
-        else
-        {
-            node = new DefaultDependencyNode( request.getRootArtifact() );
-            node.setRequestContext( request.getRequestContext() );
-            node.setRepositories( request.getRepositories() );
-        }
-
-        result.setRoot( node );
-
-        boolean traverse = root == null || depTraverser == null || depTraverser.traverseDependency( root );
-        String errorPath = null;
-        if ( traverse && !dependencies.isEmpty() )
-        {
-            DataPool pool = new DataPool( session );
-
-            DefaultDependencyCollectionContext context =
-                new DefaultDependencyCollectionContext( session, request.getRootArtifact(), root, managedDependencies );
-
-            DefaultVersionFilterContext versionContext = new DefaultVersionFilterContext( session );
-
-            Args args =
-                    new Args( session, trace, pool, context, versionContext, request,
-                            useSkip ? new DefaultDependencyResolutionSkipper()
-                                    : NeverDependencyResolutionSkipper.INSTANCE );
-            Results results = new Results( result, session );
-
-            DependencySelector rootDepSelector =
-                    depSelector != null ? depSelector.deriveChildSelector( context ) : null;
-            DependencyManager rootDepManager = depManager != null ? depManager.deriveChildManager( context ) : null;
-            DependencyTraverser rootDepTraverser =
-                    depTraverser != null ? depTraverser.deriveChildTraverser( context ) : null;
-            VersionFilter rootVerFilter = verFilter != null ? verFilter.deriveChildFilter( context ) : null;
-
-            List<DependencyNode> parents = Collections.singletonList( node );
-            for ( Dependency dependency : dependencies )
-            {
-                args.dependencyProcessingQueue.add(
-                        new DependencyProcessingContext( rootDepSelector, rootDepManager, rootDepTraverser,
-                                rootVerFilter, repositories, managedDependencies, parents,
-                                dependency ) );
-            }
-
-            while ( !args.dependencyProcessingQueue.isEmpty() )
-            {
-                processDependency( args, results, args.dependencyProcessingQueue.remove(), Collections.emptyList(),
-                        false );
-            }
-
-            args.skipper.report();
-            errorPath = results.errorPath;
-        }
-
-        long time2 = System.nanoTime();
-
-        DependencyGraphTransformer transformer = session.getDependencyGraphTransformer();
-        if ( transformer != null )
-        {
-            try
-            {
-                DefaultDependencyGraphTransformationContext context =
-                    new DefaultDependencyGraphTransformationContext( session );
-                context.put( TransformationContextKeys.STATS, stats );
-                result.setRoot( transformer.transformGraph( node, context ) );
-            }
-            catch ( RepositoryException e )
-            {
-                result.addException( e );
-            }
-        }
-
-        long time3 = System.nanoTime();
-        stats.put( "DefaultDependencyCollector.collectTime", time2 - time1 );
-        stats.put( "DefaultDependencyCollector.transformTime", time3 - time2 );
-        LOGGER.debug( "Dependency collection stats {}", stats );
-
-        if ( errorPath != null )
-        {
-            throw new DependencyCollectionException( result, "Failed to collect dependencies at " + errorPath );
-        }
-        if ( !result.getExceptions().isEmpty() )
-        {
-            throw new DependencyCollectionException( result );
-        }
-
-        return result;
-    }
-
-    private static RepositorySystemSession optimizeSession( RepositorySystemSession session )
-    {
-        DefaultRepositorySystemSession optimized = new DefaultRepositorySystemSession( session );
-        optimized.setArtifactTypeRegistry( CachingArtifactTypeRegistry.newInstance( session ) );
-        return optimized;
-    }
-
-    private List<Dependency> mergeDeps( List<Dependency> dominant, List<Dependency> recessive )
+            throws DependencyCollectionException
     {
-        List<Dependency> result;
-        if ( dominant == null || dominant.isEmpty() )
-        {
-            result = recessive;
-        }
-        else if ( recessive == null || recessive.isEmpty() )
+        String delegateName = ConfigUtils.getString( session, DEFAULT_COLLECTOR_IMPL, CONFIG_PROP_COLLECTOR_IMPL );
+        DependencyCollectorDelegate delegate = delegates.get( delegateName );
+        if ( delegate == null )
         {
-            result = dominant;
+            throw new IllegalArgumentException( "Unknown collector impl: '" + delegateName
+                    + "', known implementations are " + delegates.keySet() );
         }
-        else
-        {
-            int initialCapacity = dominant.size() + recessive.size();
-            result = new ArrayList<>( initialCapacity );
-            Collection<String> ids = new HashSet<>( initialCapacity, 1.0f );
-            for ( Dependency dependency : dominant )
-            {
-                ids.add( getId( dependency.getArtifact() ) );
-                result.add( dependency );
-            }
-            for ( Dependency dependency : recessive )
-            {
-                if ( !ids.contains( getId( dependency.getArtifact() ) ) )
-                {
-                    result.add( dependency );
-                }
-            }
-        }
-        return result;
-    }
-
-    private static String getId( Artifact a )
-    {
-        return a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getClassifier() + ':' + a.getExtension();
+        return delegate.collectDependencies( session, request );
     }
-
-    @SuppressWarnings( "checkstyle:parameternumber" )
-    private void processDependency( Args args, Results results, DependencyProcessingContext context,
-                                    List<Artifact> relocations, boolean disableVersionManagement )
-    {
-
-        if ( context.depSelector != null && !context.depSelector.selectDependency( context.dependency ) )
-        {
-            return;
-        }
-
-        PremanagedDependency preManaged =
-                PremanagedDependency.create( context.depManager, context.dependency, disableVersionManagement,
-                        args.premanagedState );
-        Dependency dependency = preManaged.managedDependency;
-
-        boolean noDescriptor = isLackingDescriptor( dependency.getArtifact() );
-
-        boolean traverse =
-                !noDescriptor && ( context.depTraverser == null || context.depTraverser.traverseDependency(
-                        dependency ) );
-
-        List<? extends Version> versions;
-        VersionRangeResult rangeResult;
-        try
-        {
-            VersionRangeRequest rangeRequest = createVersionRangeRequest( args, context.repositories, dependency );
-
-            rangeResult = cachedResolveRangeResult( rangeRequest, args.pool, args.session );
-
-            versions = filterVersions( dependency, rangeResult, context.verFilter, args.versionContext );
-        }
-        catch ( VersionRangeResolutionException e )
-        {
-            results.addException( dependency, e, context.parents );
-            return;
-        }
-
-        //Resolve newer version first to maximize benefits of skipper
-        Collections.reverse( versions );
-        for ( Version version : versions )
-        {
-            Artifact originalArtifact = dependency.getArtifact().setVersion( version.toString() );
-            Dependency d = dependency.setArtifact( originalArtifact );
-
-            ArtifactDescriptorRequest descriptorRequest =
-                    createArtifactDescriptorRequest( args, context.repositories, d );
-
-            final ArtifactDescriptorResult descriptorResult =
-                    noDescriptor
-                            ? new ArtifactDescriptorResult( descriptorRequest )
-                            : resolveCachedArtifactDescriptor( args.pool, descriptorRequest, args.session,
-                                    context.withDependency( d ), results );
-
-            if ( descriptorResult != null )
-            {
-                d = d.setArtifact( descriptorResult.getArtifact() );
-
-                int cycleEntry = find( context.parents, d.getArtifact() );
-                if ( cycleEntry >= 0 )
-                {
-                    results.addCycle( context.parents, cycleEntry, d );
-                    DependencyNode cycleNode = context.parents.get( cycleEntry );
-                    if ( cycleNode.getDependency() != null )
-                    {
-                        DefaultDependencyNode child =
-                                createDependencyNode( relocations, preManaged, rangeResult, version, d,
-                                        descriptorResult, cycleNode );
-                        context.getParent().getChildren().add( child );
-                        continue;
-                    }
-                }
-
-                if ( !descriptorResult.getRelocations().isEmpty() )
-                {
-                    boolean disableVersionManagementSubsequently =
-                        originalArtifact.getGroupId().equals( d.getArtifact().getGroupId() )
-                            && originalArtifact.getArtifactId().equals( d.getArtifact().getArtifactId() );
-
-                    processDependency( args, results, context.withDependency( d ), descriptorResult.getRelocations(),
-                            disableVersionManagementSubsequently );
-                    return;
-                }
-                else
-                {
-                    d = args.pool.intern( d.setArtifact( args.pool.intern( d.getArtifact() ) ) );
-
-                    List<RemoteRepository> repos =
-                        getRemoteRepositories( rangeResult.getRepository( version ), context.repositories );
-
-                    DefaultDependencyNode child =
-                        createDependencyNode( relocations, preManaged, rangeResult, version, d,
-                                              descriptorResult.getAliases(), repos, args.request.getRequestContext() );
-
-                    context.getParent().getChildren().add( child );
-
-                    boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
-                    if ( recurse )
-                    {
-                        doRecurse( args, context.withDependency( d ), descriptorResult, child );
-                    }
-                }
-            }
-            else
-            {
-                List<RemoteRepository> repos =
-                    getRemoteRepositories( rangeResult.getRepository( version ), context.repositories );
-                DefaultDependencyNode child =
-                    createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
-                                          args.request.getRequestContext() );
-                context.getParent().getChildren().add( child );
-            }
-        }
-    }
-
-    @SuppressWarnings( "checkstyle:parameternumber" )
-    private void doRecurse( Args args, DependencyProcessingContext parentContext,
-                            ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child )
-    {
-        DefaultDependencyCollectionContext context = args.collectionContext;
-        context.set( parentContext.dependency, descriptorResult.getManagedDependencies() );
-
-        DependencySelector childSelector =
-                parentContext.depSelector != null ? parentContext.depSelector.deriveChildSelector( context ) : null;
-        DependencyManager childManager =
-                parentContext.depManager != null ? parentContext.depManager.deriveChildManager( context ) : null;
-        DependencyTraverser childTraverser =
-                parentContext.depTraverser != null ? parentContext.depTraverser.deriveChildTraverser( context ) : null;
-        VersionFilter childFilter =
-                parentContext.verFilter != null ? parentContext.verFilter.deriveChildFilter( context ) : null;
-
-        final List<RemoteRepository> childRepos =
-                args.ignoreRepos
-                        ? parentContext.repositories
-                        : remoteRepositoryManager.aggregateRepositories( args.session, parentContext.repositories,
-                        descriptorResult.getRepositories(), true );
-
-        Object key =
-                args.pool.toKey( parentContext.dependency.getArtifact(), childRepos, childSelector, childManager,
-                        childTraverser, childFilter );
-
-        List<DependencyNode> children = args.pool.getChildren( key );
-        if ( children == null )
-        {
-            boolean skipResolution = args.skipper.skipResolution( child, parentContext.parents );
-            if ( !skipResolution )
-            {
-                List<DependencyNode> parents = new ArrayList<>( parentContext.parents.size() + 1 );
-                parents.addAll( parentContext.parents );
-                parents.add( child );
-                for ( Dependency dependency : descriptorResult.getDependencies() )
-                {
-                    args.dependencyProcessingQueue.add(
-                            new DependencyProcessingContext( childSelector, childManager, childTraverser, childFilter,
-                                    childRepos, descriptorResult.getManagedDependencies(), parents, dependency ) );
-                }
-                args.pool.putChildren( key, child.getChildren() );
-                args.skipper.cache( child, parents );
-            }
-        }
-        else
-        {
-            child.setChildren( children );
-        }
-    }
-
-    private ArtifactDescriptorResult resolveCachedArtifactDescriptor( DataPool pool,
-                                                                      ArtifactDescriptorRequest descriptorRequest,
-                                                                      RepositorySystemSession session,
-                                                                      DependencyProcessingContext context,
-                                                                      Results results )
-    {
-        Object key = pool.toKey( descriptorRequest );
-        ArtifactDescriptorResult descriptorResult = pool.getDescriptor( key, descriptorRequest );
-        if ( descriptorResult == null )
-        {
-            try
-            {
-                descriptorResult = descriptorReader.readArtifactDescriptor( session, descriptorRequest );
-                pool.putDescriptor( key, descriptorResult );
-            }
-            catch ( ArtifactDescriptorException e )
-            {
-                results.addException( context.dependency, e, context.parents );
-                pool.putDescriptor( key, e );
-                return null;
-            }
-
-        }
-        else if ( descriptorResult == DataPool.NO_DESCRIPTOR )
-        {
-            return null;
-        }
-
-        return descriptorResult;
-    }
-
-    @SuppressWarnings( "checkstyle:parameternumber" )
-    private static DefaultDependencyNode createDependencyNode( List<Artifact> relocations,
-                                                               PremanagedDependency preManaged,
-                                                               VersionRangeResult rangeResult, Version version,
-                                                               Dependency d, Collection<Artifact> aliases,
-                                                               List<RemoteRepository> repos, String requestContext )
-    {
-        DefaultDependencyNode child = new DefaultDependencyNode( d );
-        preManaged.applyTo( child );
-        child.setRelocations( relocations );
-        child.setVersionConstraint( rangeResult.getVersionConstraint() );
-        child.setVersion( version );
-        child.setAliases( aliases );
-        child.setRepositories( repos );
-        child.setRequestContext( requestContext );
-        return child;
-    }
-
-    private static DefaultDependencyNode createDependencyNode( List<Artifact> relocations,
-                                                               PremanagedDependency preManaged,
-                                                               VersionRangeResult rangeResult, Version version,
-                                                               Dependency d, ArtifactDescriptorResult descriptorResult,
-                                                               DependencyNode cycleNode )
-    {
-        DefaultDependencyNode child =
-            createDependencyNode( relocations, preManaged, rangeResult, version, d, descriptorResult.getAliases(),
-                                  cycleNode.getRepositories(), cycleNode.getRequestContext() );
-        child.setChildren( cycleNode.getChildren() );
-        return child;
-    }
-
-    private static ArtifactDescriptorRequest createArtifactDescriptorRequest( Args args,
-                                                                              List<RemoteRepository> repositories,
-                                                                              Dependency d )
-    {
-        ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
-        descriptorRequest.setArtifact( d.getArtifact() );
-        descriptorRequest.setRepositories( repositories );
-        descriptorRequest.setRequestContext( args.request.getRequestContext() );
-        descriptorRequest.setTrace( args.trace );
-        return descriptorRequest;
-    }
-
-    private static VersionRangeRequest createVersionRangeRequest( Args args, List<RemoteRepository> repositories,
-                                                                  Dependency dependency )
-    {
-        VersionRangeRequest rangeRequest = new VersionRangeRequest();
-        rangeRequest.setArtifact( dependency.getArtifact() );
-        rangeRequest.setRepositories( repositories );
-        rangeRequest.setRequestContext( args.request.getRequestContext() );
-        rangeRequest.setTrace( args.trace );
-        return rangeRequest;
-    }
-
-    private VersionRangeResult cachedResolveRangeResult( VersionRangeRequest rangeRequest, DataPool pool,
-                                                         RepositorySystemSession session )
-        throws VersionRangeResolutionException
-    {
-        Object key = pool.toKey( rangeRequest );
-        VersionRangeResult rangeResult = pool.getConstraint( key, rangeRequest );
-        if ( rangeResult == null )
-        {
-            rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
-            pool.putConstraint( key, rangeResult );
-        }
-        return rangeResult;
-    }
-
-    private static boolean isLackingDescriptor( Artifact artifact )
-    {
-        return artifact.getProperty( ArtifactProperties.LOCAL_PATH, null ) != null;
-    }
-
-    private static List<RemoteRepository> getRemoteRepositories( ArtifactRepository repository,
-                                                                 List<RemoteRepository> repositories )
-    {
-        if ( repository instanceof RemoteRepository )
-        {
-            return Collections.singletonList( (RemoteRepository) repository );
-        }
-        if ( repository != null )
-        {
-            return Collections.emptyList();
-        }
-        return repositories;
-    }
-
-    private static List<? extends Version> filterVersions( Dependency dependency, VersionRangeResult rangeResult,
-                                                           VersionFilter verFilter,
-                                                           DefaultVersionFilterContext verContext )
-        throws VersionRangeResolutionException
-    {
-        if ( rangeResult.getVersions().isEmpty() )
-        {
-            throw new VersionRangeResolutionException( rangeResult,
-                                                       "No versions available for " + dependency.getArtifact()
-                                                           + " within specified range" );
-        }
-
-        List<? extends Version> versions;
-        if ( verFilter != null && rangeResult.getVersionConstraint().getRange() != null )
-        {
-            verContext.set( dependency, rangeResult );
-            try
-            {
-                verFilter.filterVersions( verContext );
-            }
-            catch ( RepositoryException e )
-            {
-                throw new VersionRangeResolutionException( rangeResult,
-                                                           "Failed to filter versions for " + dependency.getArtifact()
-                                                               + ": " + e.getMessage(), e );
-            }
-            versions = verContext.get();
-            if ( versions.isEmpty() )
-            {
-                throw new VersionRangeResolutionException( rangeResult,
-                                                           "No acceptable versions for " + dependency.getArtifact()
-                                                               + ": " + rangeResult.getVersions() );
-            }
-        }
-        else
-        {
-            versions = rangeResult.getVersions();
-        }
-        return versions;
-    }
-
-    static class Args
-    {
-
-        final RepositorySystemSession session;
-
-        final boolean ignoreRepos;
-
-        final boolean premanagedState;
-
-        final RequestTrace trace;
-
-        final DataPool pool;
-
-        final Queue<DependencyProcessingContext> dependencyProcessingQueue = new ArrayDeque<>( 128 );
-
-        final DefaultDependencyCollectionContext collectionContext;
-
-        final DefaultVersionFilterContext versionContext;
-
-        final CollectRequest request;
-
-        final DependencyResolutionSkipper skipper;
-
-        Args( RepositorySystemSession session, RequestTrace trace, DataPool pool,
-                     DefaultDependencyCollectionContext collectionContext, DefaultVersionFilterContext versionContext,
-                     CollectRequest request, DependencyResolutionSkipper skipper )
-        {
-            this.session = session;
-            this.request = request;
-            this.ignoreRepos = session.isIgnoreArtifactDescriptorRepositories();
-            this.premanagedState = ConfigUtils.getBoolean( session, false, DependencyManagerUtils.CONFIG_PROP_VERBOSE );
-            this.trace = trace;
-            this.pool = pool;
-            this.collectionContext = collectionContext;
-            this.versionContext = versionContext;
-            this.skipper = skipper;
-        }
-
-    }
-
-    static class Results
-    {
-
-        private final CollectResult result;
-
-        final int maxExceptions;
-
-        final int maxCycles;
-
-        String errorPath;
-
-        Results( CollectResult result, RepositorySystemSession session )
-        {
-            this.result = result;
-
-            maxExceptions =
-                    ConfigUtils.getInteger( session, CONFIG_PROP_MAX_EXCEPTIONS_DEFAULT, CONFIG_PROP_MAX_EXCEPTIONS );
-
-            maxCycles = ConfigUtils.getInteger( session, CONFIG_PROP_MAX_CYCLES_DEFAULT, CONFIG_PROP_MAX_CYCLES );
-        }
-
-        public void addException( Dependency dependency, Exception e, List<DependencyNode> nodes )
-        {
-            if ( maxExceptions < 0 || result.getExceptions().size() < maxExceptions )
-            {
-                result.addException( e );
-                if ( errorPath == null )
-                {
-                    StringBuilder buffer = new StringBuilder( 256 );
-                    for ( DependencyNode node : nodes )
-                    {
-                        if ( buffer.length() > 0 )
-                        {
-                            buffer.append( " -> " );
-                        }
-                        Dependency dep = node.getDependency();
-                        if ( dep != null )
-                        {
-                            buffer.append( dep.getArtifact() );
-                        }
-                    }
-                    if ( buffer.length() > 0 )
-                    {
-                        buffer.append( " -> " );
-                    }
-                    buffer.append( dependency.getArtifact() );
-                    errorPath = buffer.toString();
-                }
-            }
-        }
-
-        public void addCycle( List<DependencyNode> nodes, int cycleEntry, Dependency dependency )
-        {
-            if ( maxCycles < 0 || result.getCycles().size() < maxCycles )
-            {
-                result.addCycle( new DefaultDependencyCycle( nodes, cycleEntry, dependency ) );
-            }
-        }
-
-    }
-
-    static class PremanagedDependency
-    {
-
-        final String premanagedVersion;
-
-        final String premanagedScope;
-
-        final Boolean premanagedOptional;
-
-        /**
-         * @since 1.1.0
-         */
-        final Collection<Exclusion> premanagedExclusions;
-
-        /**
-         * @since 1.1.0
-         */
-        final Map<String, String> premanagedProperties;
-
-        final int managedBits;
-
-        final Dependency managedDependency;
-
-        final boolean premanagedState;
-
-        @SuppressWarnings( "checkstyle:parameternumber" )
-        PremanagedDependency( String premanagedVersion, String premanagedScope, Boolean premanagedOptional,
-                              Collection<Exclusion> premanagedExclusions, Map<String, String> premanagedProperties,
-                              int managedBits, Dependency managedDependency, boolean premanagedState )
-        {
-            this.premanagedVersion = premanagedVersion;
-            this.premanagedScope = premanagedScope;
-            this.premanagedOptional = premanagedOptional;
-            this.premanagedExclusions =
-                premanagedExclusions != null
-                    ? Collections.unmodifiableCollection( new ArrayList<>( premanagedExclusions ) )
-                    : null;
-
-            this.premanagedProperties =
-                premanagedProperties != null
-                    ? Collections.unmodifiableMap( new HashMap<>( premanagedProperties ) )
-                    : null;
-
-            this.managedBits = managedBits;
-            this.managedDependency = managedDependency;
-            this.premanagedState = premanagedState;
-        }
-
-        static PremanagedDependency create( DependencyManager depManager, Dependency dependency,
-                                            boolean disableVersionManagement, boolean premanagedState )
-        {
-            DependencyManagement depMngt = depManager != null ? depManager.manageDependency( dependency ) : null;
-
-            int managedBits = 0;
-            String premanagedVersion = null;
-            String premanagedScope = null;
-            Boolean premanagedOptional = null;
-            Collection<Exclusion> premanagedExclusions = null;
-            Map<String, String> premanagedProperties = null;
-
-            if ( depMngt != null )
-            {
-                if ( depMngt.getVersion() != null && !disableVersionManagement )
-                {
-                    Artifact artifact = dependency.getArtifact();
-                    premanagedVersion = artifact.getVersion();
-                    dependency = dependency.setArtifact( artifact.setVersion( depMngt.getVersion() ) );
-                    managedBits |= DependencyNode.MANAGED_VERSION;
-                }
-                if ( depMngt.getProperties() != null )
-                {
-                    Artifact artifact = dependency.getArtifact();
-                    premanagedProperties = artifact.getProperties();
-                    dependency = dependency.setArtifact( artifact.setProperties( depMngt.getProperties() ) );
-                    managedBits |= DependencyNode.MANAGED_PROPERTIES;
-                }
-                if ( depMngt.getScope() != null )
-                {
-                    premanagedScope = dependency.getScope();
-                    dependency = dependency.setScope( depMngt.getScope() );
-                    managedBits |= DependencyNode.MANAGED_SCOPE;
-                }
-                if ( depMngt.getOptional() != null )
-                {
-                    premanagedOptional = dependency.isOptional();
-                    dependency = dependency.setOptional( depMngt.getOptional() );
-                    managedBits |= DependencyNode.MANAGED_OPTIONAL;
-                }
-                if ( depMngt.getExclusions() != null )
-                {
-                    premanagedExclusions = dependency.getExclusions();
-                    dependency = dependency.setExclusions( depMngt.getExclusions() );
-                    managedBits |= DependencyNode.MANAGED_EXCLUSIONS;
-                }
-            }
-            return new PremanagedDependency( premanagedVersion, premanagedScope, premanagedOptional,
-                                             premanagedExclusions, premanagedProperties, managedBits, dependency,
-                                             premanagedState );
-
-        }
-
-        public void applyTo( DefaultDependencyNode child )
-        {
-            child.setManagedBits( managedBits );
-            if ( premanagedState )
-            {
-                child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_VERSION, premanagedVersion );
-                child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_SCOPE, premanagedScope );
-                child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_OPTIONAL, premanagedOptional );
-                child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_EXCLUSIONS, premanagedExclusions );
-                child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_PROPERTIES, premanagedProperties );
-            }
-        }
-
-    }
-
 }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java
index 41c01269..28ea7472 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java
@@ -28,7 +28,7 @@ import org.eclipse.aether.collection.DependencyGraphTransformationContext;
 
 /**
  */
-class DefaultDependencyGraphTransformationContext
+public class DefaultDependencyGraphTransformationContext
     implements DependencyGraphTransformationContext
 {
 
@@ -36,7 +36,7 @@ class DefaultDependencyGraphTransformationContext
 
     private final Map<Object, Object> map;
 
-    DefaultDependencyGraphTransformationContext( RepositorySystemSession session )
+    public DefaultDependencyGraphTransformationContext( RepositorySystemSession session )
     {
         this.session = session;
         this.map = new HashMap<>();
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java
index bfea0626..55b6fba4 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java
@@ -36,7 +36,7 @@ import org.eclipse.aether.version.VersionConstraint;
 /**
  * @see DefaultDependencyCollector
  */
-final class DefaultVersionFilterContext
+public final class DefaultVersionFilterContext
     implements VersionFilter.VersionFilterContext
 {
     private final RepositorySystemSession session;
@@ -47,7 +47,7 @@ final class DefaultVersionFilterContext
 
     private List<Version> versions;
 
-    DefaultVersionFilterContext( RepositorySystemSession session )
+    public DefaultVersionFilterContext( RepositorySystemSession session )
     {
         this.session = session;
     }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NeverDependencyResolutionSkipper.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
similarity index 57%
copy from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NeverDependencyResolutionSkipper.java
copy to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
index acd6636f..5d17efc6 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NeverDependencyResolutionSkipper.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
@@ -19,33 +19,13 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
-import org.eclipse.aether.graph.DependencyNode;
-import org.eclipse.aether.impl.DependencyResolutionSkipper;
-
-import java.util.List;
+import org.eclipse.aether.impl.DependencyCollector;
 
 /**
- * Skipper for Non-skip approach.
+ * The delegate to the actual implementation.
+ *
+ * @since 1.8.0
  */
-final class NeverDependencyResolutionSkipper implements DependencyResolutionSkipper
+public interface DependencyCollectorDelegate extends DependencyCollector
 {
-    static final DependencyResolutionSkipper INSTANCE = new NeverDependencyResolutionSkipper();
-
-    @Override
-    public boolean skipResolution( DependencyNode node, List<DependencyNode> parents )
-    {
-        return false;
-    }
-
-    @Override
-    public void cache( DependencyNode node, List<DependencyNode> parents )
-    {
-
-    }
-
-    @Override
-    public void report()
-    {
-
-    }
 }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
similarity index 95%
copy from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
copy to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
index a895bb9b..4836d635 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,6 +19,10 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -30,13 +34,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Queue;
 
-import static java.util.Objects.requireNonNull;
-import static org.eclipse.aether.internal.impl.collect.DefaultDependencyCycle.find;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositoryException;
 import org.eclipse.aether.RepositorySystemSession;
@@ -57,10 +54,15 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.DependencyNode;
 import org.eclipse.aether.graph.Exclusion;
 import org.eclipse.aether.impl.ArtifactDescriptorReader;
-import org.eclipse.aether.impl.DependencyCollector;
 import org.eclipse.aether.impl.DependencyResolutionSkipper;
 import org.eclipse.aether.impl.RemoteRepositoryManager;
 import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.internal.impl.collect.CachingArtifactTypeRegistry;
+import org.eclipse.aether.internal.impl.collect.DataPool;
+import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollectionContext;
+import org.eclipse.aether.internal.impl.collect.DefaultDependencyGraphTransformationContext;
+import org.eclipse.aether.internal.impl.collect.DefaultVersionFilterContext;
+import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate;
 import org.eclipse.aether.repository.ArtifactRepository;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.resolution.ArtifactDescriptorException;
@@ -78,16 +80,20 @@ import org.eclipse.aether.version.Version;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.aether.internal.impl.collect.bf.BfDependencyCycle.find;
+
 /**
  */
 @Singleton
-@Named
-public class DefaultDependencyCollector
-    implements DependencyCollector, Service
+@Named( BfDependencyCollector.NAME )
+public class BfDependencyCollector
+        implements DependencyCollectorDelegate, Service
 {
+    public static final String NAME = "bf";
 
     /**
-     * The key in the repository session's {@link org.eclipse.aether.RepositorySystemSession#getConfigProperties()
+     * The key in the repository session's {@link RepositorySystemSession#getConfigProperties()
      * configuration properties} used to store a {@link Boolean} flag controlling the resolver's skip mode.
      *
      * @since 1.8.0
@@ -109,7 +115,7 @@ public class DefaultDependencyCollector
 
     private static final int CONFIG_PROP_MAX_CYCLES_DEFAULT = 10;
 
-    private static final Logger LOGGER = LoggerFactory.getLogger( DefaultDependencyCollector.class );
+    private static final Logger LOGGER = LoggerFactory.getLogger( BfDependencyCollector.class );
 
     private RemoteRepositoryManager remoteRepositoryManager;
 
@@ -117,15 +123,15 @@ public class DefaultDependencyCollector
 
     private VersionRangeResolver versionRangeResolver;
 
-    public DefaultDependencyCollector()
+    public BfDependencyCollector()
     {
         // enables default constructor
     }
 
     @Inject
-    DefaultDependencyCollector( RemoteRepositoryManager remoteRepositoryManager,
-                                ArtifactDescriptorReader artifactDescriptorReader,
-                                VersionRangeResolver versionRangeResolver )
+    BfDependencyCollector( RemoteRepositoryManager remoteRepositoryManager,
+                           ArtifactDescriptorReader artifactDescriptorReader,
+                           VersionRangeResolver versionRangeResolver )
     {
         setRemoteRepositoryManager( remoteRepositoryManager );
         setArtifactDescriptorReader( artifactDescriptorReader );
@@ -139,20 +145,20 @@ public class DefaultDependencyCollector
         setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) );
     }
 
-    public DefaultDependencyCollector setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
+    public BfDependencyCollector setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
     {
         this.remoteRepositoryManager =
                 requireNonNull( remoteRepositoryManager, "remote repository provider cannot be null" );
         return this;
     }
 
-    public DefaultDependencyCollector setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader )
+    public BfDependencyCollector setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader )
     {
         descriptorReader = requireNonNull( artifactDescriptorReader, "artifact descriptor reader cannot be null" );
         return this;
     }
 
-    public DefaultDependencyCollector setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
+    public BfDependencyCollector setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
     {
         this.versionRangeResolver =
                 requireNonNull( versionRangeResolver, "version range resolver cannot be null" );
@@ -294,7 +300,7 @@ public class DefaultDependencyCollector
             for ( Dependency dependency : dependencies )
             {
                 args.dependencyProcessingQueue.add(
-                        new DependencyProcessingContext( rootDepSelector, rootDepManager, rootDepTraverser,
+                        new BfProcessingContext( rootDepSelector, rootDepManager, rootDepTraverser,
                                 rootVerFilter, repositories, managedDependencies, parents,
                                 dependency ) );
             }
@@ -389,7 +395,7 @@ public class DefaultDependencyCollector
     }
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    private void processDependency( Args args, Results results, DependencyProcessingContext context,
+    private void processDependency( Args args, Results results, BfProcessingContext context,
                                     List<Artifact> relocations, boolean disableVersionManagement )
     {
 
@@ -503,7 +509,7 @@ public class DefaultDependencyCollector
     }
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    private void doRecurse( Args args, DependencyProcessingContext parentContext,
+    private void doRecurse( Args args, BfProcessingContext parentContext,
                             ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child )
     {
         DefaultDependencyCollectionContext context = args.collectionContext;
@@ -540,7 +546,7 @@ public class DefaultDependencyCollector
                 for ( Dependency dependency : descriptorResult.getDependencies() )
                 {
                     args.dependencyProcessingQueue.add(
-                            new DependencyProcessingContext( childSelector, childManager, childTraverser, childFilter,
+                            new BfProcessingContext( childSelector, childManager, childTraverser, childFilter,
                                     childRepos, descriptorResult.getManagedDependencies(), parents, dependency ) );
                 }
                 args.pool.putChildren( key, child.getChildren() );
@@ -556,7 +562,7 @@ public class DefaultDependencyCollector
     private ArtifactDescriptorResult resolveCachedArtifactDescriptor( DataPool pool,
                                                                       ArtifactDescriptorRequest descriptorRequest,
                                                                       RepositorySystemSession session,
-                                                                      DependencyProcessingContext context,
+                                                                      BfProcessingContext context,
                                                                       Results results )
     {
         Object key = pool.toKey( descriptorRequest );
@@ -725,7 +731,7 @@ public class DefaultDependencyCollector
 
         final DataPool pool;
 
-        final Queue<DependencyProcessingContext> dependencyProcessingQueue = new ArrayDeque<>( 128 );
+        final Queue<BfProcessingContext> dependencyProcessingQueue = new ArrayDeque<>( 128 );
 
         final DefaultDependencyCollectionContext collectionContext;
 
@@ -807,7 +813,7 @@ public class DefaultDependencyCollector
         {
             if ( maxCycles < 0 || result.getCycles().size() < maxCycles )
             {
-                result.addCycle( new DefaultDependencyCycle( nodes, cycleEntry, dependency ) );
+                result.addCycle( new BfDependencyCycle( nodes, cycleEntry, dependency ) );
             }
         }
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCycle.java
similarity index 95%
rename from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java
rename to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCycle.java
index dd1565c9..94a566d4 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCycle.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -27,12 +27,13 @@ import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.DependencyCycle;
 import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
 import org.eclipse.aether.util.artifact.ArtifactIdUtils;
 
 /**
  * @see DefaultDependencyCollector
  */
-final class DefaultDependencyCycle
+final class BfDependencyCycle
     implements DependencyCycle
 {
 
@@ -40,7 +41,7 @@ final class DefaultDependencyCycle
 
     private final int cycleEntry;
 
-    DefaultDependencyCycle( List<DependencyNode> nodes, int cycleEntry, Dependency dependency )
+    BfDependencyCycle( List<DependencyNode> nodes, int cycleEntry, Dependency dependency )
     {
         // skip root node unless it actually has a dependency or is considered the cycle entry (due to its label)
         int offset = ( cycleEntry > 0 && nodes.get( 0 ).getDependency() == null ) ? 1 : 0;
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyProcessingContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfProcessingContext.java
similarity index 76%
rename from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyProcessingContext.java
rename to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfProcessingContext.java
index 9820ad07..f18376f2 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyProcessingContext.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfProcessingContext.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -29,7 +29,7 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.DependencyNode;
 import org.eclipse.aether.repository.RemoteRepository;
 
-final class DependencyProcessingContext
+final class BfProcessingContext
 {
     final DependencySelector depSelector;
     final DependencyManager depManager;
@@ -45,14 +45,14 @@ final class DependencyProcessingContext
     Dependency dependency;
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    DependencyProcessingContext( DependencySelector depSelector,
-                                 DependencyManager depManager,
-                                 DependencyTraverser depTraverser,
-                                 VersionFilter verFilter,
-                                 List<RemoteRepository> repositories,
-                                 List<Dependency> managedDependencies,
-                                 List<DependencyNode> parents,
-                                 Dependency dependency )
+    BfProcessingContext( DependencySelector depSelector,
+                         DependencyManager depManager,
+                         DependencyTraverser depTraverser,
+                         VersionFilter verFilter,
+                         List<RemoteRepository> repositories,
+                         List<Dependency> managedDependencies,
+                         List<DependencyNode> parents,
+                         Dependency dependency )
     {
         this.depSelector = depSelector;
         this.depManager = depManager;
@@ -64,7 +64,7 @@ final class DependencyProcessingContext
         this.parents = parents;
     }
 
-    DependencyProcessingContext withDependency( Dependency dependency )
+    BfProcessingContext withDependency( Dependency dependency )
     {
         this.dependency = dependency;
         return this;
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyResolutionSkipper.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/DefaultDependencyResolutionSkipper.java
similarity index 95%
rename from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyResolutionSkipper.java
rename to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/DefaultDependencyResolutionSkipper.java
index 408b0e16..38fcd4e7 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyResolutionSkipper.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/DefaultDependencyResolutionSkipper.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -32,18 +32,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
-final class DefaultDependencyResolutionSkipper implements DependencyResolutionSkipper
+/**
+ * Skipper for Skip-and-reconcile approach.
+ *
+ * @see BfDependencyCollector
+ */
+public final class DefaultDependencyResolutionSkipper implements DependencyResolutionSkipper
 {
     private static final Logger LOGGER = LoggerFactory.getLogger( DefaultDependencyResolutionSkipper.class );
 
-    private Map<DependencyNode, DependencyResolutionResult> results = new LinkedHashMap<>( 256 );
-    private CacheManager cacheManager = new CacheManager();
-    private CoordinateManager coordinateManager = new CoordinateManager();
-
-    DefaultDependencyResolutionSkipper()
-    {
-        // enables default constructor
-    }
+    private final Map<DependencyNode, DependencyResolutionResult> results = new LinkedHashMap<>( 256 );
+    private final CacheManager cacheManager = new CacheManager();
+    private final CoordinateManager coordinateManager = new CoordinateManager();
 
     @Override
     public boolean skipResolution( DependencyNode node, List<DependencyNode> parents )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NeverDependencyResolutionSkipper.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/NeverDependencyResolutionSkipper.java
similarity index 82%
rename from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NeverDependencyResolutionSkipper.java
rename to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/NeverDependencyResolutionSkipper.java
index acd6636f..8ad4450d 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NeverDependencyResolutionSkipper.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/NeverDependencyResolutionSkipper.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -26,10 +26,12 @@ import java.util.List;
 
 /**
  * Skipper for Non-skip approach.
+ *
+ * @see BfDependencyCollector
  */
-final class NeverDependencyResolutionSkipper implements DependencyResolutionSkipper
+public final class NeverDependencyResolutionSkipper implements DependencyResolutionSkipper
 {
-    static final DependencyResolutionSkipper INSTANCE = new NeverDependencyResolutionSkipper();
+    public static final DependencyResolutionSkipper INSTANCE = new NeverDependencyResolutionSkipper();
 
     @Override
     public boolean skipResolution( DependencyNode node, List<DependencyNode> parents )
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java
similarity index 98%
rename from maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
rename to maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java
index 7d034bdd..3c4ea005 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -18,14 +18,6 @@ package org.eclipse.aether.internal.impl.collect;
  * specific language governing permissions and limitations
  * under the License.
  */
-import static java.util.Objects.requireNonNull;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -73,12 +65,21 @@ import org.eclipse.aether.util.graph.version.HighestVersionFilter;
 import org.junit.Before;
 import org.junit.Test;
 
+import static java.util.Objects.requireNonNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 /**
  */
-public class DefaultDependencyCollectorTest
+public class BfDependencyCollectorTest
 {
 
-    protected DefaultDependencyCollector collector;
+    protected BfDependencyCollector collector;
 
     protected DefaultRepositorySystemSession session;
 
@@ -110,9 +111,9 @@ public class DefaultDependencyCollectorTest
     public void setupCollector( boolean useSkip )
     {
         session = TestUtils.newSession();
-        session.setConfigProperty( DefaultDependencyCollector.CONFIG_PROP_USE_SKIP, useSkip );
+        session.setConfigProperty( BfDependencyCollector.CONFIG_PROP_USE_SKIP, useSkip );
 
-        collector = new DefaultDependencyCollector();
+        collector = new BfDependencyCollector();
         collector.setArtifactDescriptorReader( newReader( "" ) );
         collector.setVersionRangeResolver( new StubVersionRangeResolver() );
         collector.setRemoteRepositoryManager( new StubRemoteRepositoryManager() );
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorUseSkipTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java
similarity index 96%
rename from maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorUseSkipTest.java
rename to maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java
index 716ecdef..5daa678b 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorUseSkipTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +18,11 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
 import org.eclipse.aether.artifact.DefaultArtifact;
 import org.eclipse.aether.collection.CollectRequest;
 import org.eclipse.aether.collection.CollectResult;
@@ -29,14 +34,9 @@ import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager;
 import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
 import org.junit.Test;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 
-public class DefaultDependencyCollectorUseSkipTest extends DefaultDependencyCollectorTest
+public class BfDependencyCollectorUseSkipTest extends BfDependencyCollectorTest
 {
 
     private Dependency newDep( String coords, String scope, Collection<Exclusion> exclusions )
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycleTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCycleTest.java
similarity index 90%
rename from maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycleTest.java
rename to maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCycleTest.java
index 0a382f8c..a1be7c92 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycleTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCycleTest.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,6 +19,9 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.aether.artifact.DefaultArtifact;
 import org.eclipse.aether.graph.DefaultDependencyNode;
 import org.eclipse.aether.graph.Dependency;
@@ -26,12 +29,9 @@ import org.eclipse.aether.graph.DependencyCycle;
 import org.eclipse.aether.graph.DependencyNode;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 
-public class DefaultDependencyCycleTest
+public class BfDependencyCycleTest
 {
     private static final Dependency FOO_DEPENDENCY = new Dependency( new DefaultArtifact( "group-id:foo:1.0" ), "test" );
     private static final Dependency BAR_DEPENDENCY = new Dependency( new DefaultArtifact( "group-id:bar:1.0" ), "test" );
@@ -41,7 +41,7 @@ public class DefaultDependencyCycleTest
     {
         List<DependencyNode> nodes = new ArrayList<>();
         nodes.add( new DefaultDependencyNode( FOO_DEPENDENCY ) );
-        DependencyCycle cycle = new DefaultDependencyCycle( nodes, 1, BAR_DEPENDENCY );
+        DependencyCycle cycle = new BfDependencyCycle( nodes, 1, BAR_DEPENDENCY );
 
         assertEquals( "group-id:foo:jar -> group-id:bar:jar", cycle.toString() );
     }
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyResolutionSkipperTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/DependencyResolutionSkipperTest.java
similarity index 99%
rename from maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyResolutionSkipperTest.java
rename to maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/DependencyResolutionSkipperTest.java
index 1d92acc0..678b9e76 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyResolutionSkipperTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/DependencyResolutionSkipperTest.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect;
+package org.eclipse.aether.internal.impl.collect.bf;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +18,12 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.eclipse.aether.RepositoryException;
 import org.eclipse.aether.artifact.DefaultArtifact;
 import org.eclipse.aether.graph.DefaultDependencyNode;
@@ -27,12 +33,6 @@ import org.eclipse.aether.internal.test.util.TestVersion;
 import org.eclipse.aether.internal.test.util.TestVersionConstraint;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;