[MSHARED-1004] Require Maven 3.2.5+
diff --git a/pom.xml b/pom.xml
index 08fc42f..25c3ed1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,7 +69,7 @@
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
-      <version>3.0.5</version>
+      <version>3.2.5</version>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
@@ -77,12 +77,6 @@
       <optional>true</optional>
     </dependency>
     <dependency>
-      <groupId>org.sonatype.aether</groupId>
-      <artifactId>aether-api</artifactId>
-      <version>1.13.1</version>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
       <groupId>org.eclipse.aether</groupId>
       <artifactId>aether-api</artifactId>
       <version>1.1.0</version>
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
index 9ece96f..38e60e5 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
@@ -23,7 +23,7 @@
 import org.apache.maven.project.ProjectBuildingRequest;
 
 /**
- * Maven project dependency raw dependency collector API, providing an abstraction layer against Maven 3 and Maven 3.1+
+ * Maven project dependency raw dependency collector API, providing an abstraction layer against Maven 3.1+
  * particular Aether implementations.
  * 
  * @author Gabriel Belingueres
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
index cab4ce8..3c9c37e 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
@@ -26,7 +26,7 @@
 import java.util.Collection;
 
 /**
- * Maven project dependency graph builder API, neutral against Maven 2 or Maven 3.
+ * Maven project dependency graph builder API, neutral Maven 3.
  *
  * @author Hervé Boutemy
  * @since 2.0
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
index cddf101..4f9db16 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
@@ -20,7 +20,6 @@
  */
 
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.execution.MavenSession;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
@@ -36,7 +35,7 @@
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
 /**
- * Default project dependency raw dependency collector API, providing an abstraction layer against Maven 3 and Maven
+ * Default project dependency raw dependency collector API, providing an abstraction layer against Maven
  * 3.1+ particular Aether implementations.
  * 
  * @author Gabriel Belingueres
@@ -55,17 +54,15 @@
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
 
             DependencyCollectorBuilder effectiveGraphBuilder =
-                (DependencyCollectorBuilder) container.lookup( DependencyCollectorBuilder.class.getCanonicalName(),
-                                                               hint );
+                    container.lookup( DependencyCollectorBuilder.class, "maven31" );
 
             if ( getLogger().isDebugEnabled() )
             {
                 MavenProject project = buildingRequest.getProject();
 
-                getLogger().debug( "building " + hint + " RAW dependency tree for " + project.getId() + " with "
+                getLogger().debug( "building Maven 3.1+ RAW dependency tree for " + project.getId() + " with "
                     + effectiveGraphBuilder.getClass().getSimpleName() );
             }
 
@@ -78,23 +75,6 @@
     }
 
     /**
-     * @return true if the current Maven version is Maven 3.1.
-     */
-    protected static boolean isMaven31()
-    {
-        try
-        {
-            Class<?> repoSessionClass =  MavenSession.class.getMethod( "getRepositorySession" ).getReturnType();
-            
-            return "org.eclipse.aether.RepositorySystemSession".equals( repoSessionClass.getName() );
-        }
-        catch ( NoSuchMethodException e )
-        {
-            throw new IllegalStateException( "Cannot determine return type of MavenSession.getRepositorySession" );
-        }
-    }
-
-    /**
      * Injects the Plexus content.
      *
      * @param context Plexus context to inject.
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
index 84f27f3..d183ba2 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
@@ -20,7 +20,6 @@
  */
 
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.execution.MavenSession;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
@@ -36,10 +35,8 @@
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
 /**
- * Default dependency graph builder that detects current Maven version to delegate to either Maven 3.0 or 3.1+ specific
- * code.
+ * Default dependency graph builder that detects current Maven version and delegate to 3.1+ specific code.
  *
- * @see Maven3DependencyGraphBuilder
  * @see Maven31DependencyGraphBuilder
  * @author Hervé Boutemy
  * @since 2.0
@@ -65,16 +62,14 @@
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
             DependencyGraphBuilder effectiveGraphBuilder =
-                (DependencyGraphBuilder) container.lookup( DependencyGraphBuilder.class.getCanonicalName(), hint );
+                    container.lookup( DependencyGraphBuilder.class, "maven31" );
             
             if ( getLogger().isDebugEnabled() )
             {
                 MavenProject project = buildingRequest.getProject();
                 
-                getLogger().debug( "building " + hint + " dependency graph for " + project.getId() + " with "
+                getLogger().debug( "building Maven 3.1+ dependency graph for " + project.getId() + " with "
                                 + effectiveGraphBuilder.getClass().getSimpleName() );
             }
 
@@ -87,23 +82,6 @@
     }
 
     /**
-     * @return true if the current Maven version is Maven 3.1.
-     */
-    protected static boolean isMaven31()
-    {
-        try
-        {
-            Class<?> repoSessionClass =  MavenSession.class.getMethod( "getRepositorySession" ).getReturnType();
-            
-            return "org.eclipse.aether.RepositorySystemSession".equals( repoSessionClass.getName() );
-        }
-        catch ( NoSuchMethodException e )
-        {
-            throw new IllegalStateException( "Cannot determine return type of MavenSession.getRepositorySession" );
-        }
-    }
-
-    /**
      * Injects the Plexus content.
      *
      * @param context   Plexus context to inject.
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java
deleted file mode 100644
index 8cc8851..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
-
-/**
- * Invokes method on objects using reflection.
- */
-final class Invoker
-{
-    private Invoker()
-    {
-        // do not instantiate
-    }
-
-    static <T extends Exception> Object invoke( Object object, String method, ExceptionHandler<T> exceptionHandler )
-        throws T
-    {
-        return invoke( object.getClass(), object, method, exceptionHandler );
-    }
-
-    static <T extends Exception> Object invoke( Class<?> objectClazz, Object object, String method,
-                                                ExceptionHandler<T> exceptionHandler )
-        throws T
-    {
-        try
-        {
-            return objectClazz.getMethod( method ).invoke( object );
-        }
-        catch ( ReflectiveOperationException e )
-        {
-            throw exceptionHandler.create( e.getMessage(), e );
-        }
-    }
-
-    static Object invoke( Object object, String method, Class<?> clazz, Object arg )
-        throws DependencyGraphBuilderException
-    {
-        try
-        {
-            final Class<?> objectClazz = object.getClass();
-            return objectClazz.getMethod( method, clazz ).invoke( object, arg );
-        }
-        catch ( ReflectiveOperationException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-    }
-    
-    static <T extends Exception> Object invoke( Class<?> objectClazz, String staticMethod,
-                                                               Class<?> argClazz, Object arg,
-                                                               ExceptionHandler<T> exceptionHandler )
-        throws T
-    {
-        try
-        {
-            return objectClazz.getMethod( staticMethod, argClazz ).invoke( null, arg );
-        }
-        catch ( ReflectiveOperationException e )
-        {
-            throw exceptionHandler.create( e.getMessage(), e );
-        }
-    }
-
-    static <T extends Exception> Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz1,
-                                                Class<?> argClazz2, Object arg1, Object arg2,
-                                                ExceptionHandler<T> exceptionHandler )
-        throws T
-    {
-        try
-        {
-            return objectClazz.getMethod( staticMethod, argClazz1, argClazz2 ).invoke( null, arg1, arg2 );
-        }
-        catch ( ReflectiveOperationException e )
-        {
-            throw exceptionHandler.create( e.getMessage(), e );
-        }
-    }
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
index 73d06de..f8517e4 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
@@ -40,6 +40,7 @@
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.ArtifactTypeRegistry;
 import org.eclipse.aether.collection.CollectRequest;
 import org.eclipse.aether.collection.CollectResult;
@@ -60,6 +61,8 @@
 import org.eclipse.aether.util.graph.visitor.TreeDependencyVisitor;
 import org.eclipse.aether.version.VersionConstraint;
 
+import static org.apache.maven.RepositoryUtils.toArtifact;
+
 /**
  * Project dependency raw dependency collector API, abstracting Maven 3.1+'s Aether implementation.
  * 
@@ -93,9 +96,15 @@
             Artifact projectArtifact = project.getArtifact();
             List<ArtifactRepository> remoteArtifactRepositories = project.getRemoteArtifactRepositories();
 
-            DefaultRepositorySystemSession repositorySession =
-                (DefaultRepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession",
-                                                                 exceptionHandler );
+            RepositorySystemSession repositorySession;
+            try
+            {
+                repositorySession = buildingRequest.getRepositorySession();
+            }
+            catch ( Exception e )
+            {
+                throw exceptionHandler.create( e.getMessage(), e );
+            }
 
             session = new DefaultRepositorySystemSession( repositorySession );
 
@@ -113,17 +122,25 @@
             session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, true );
             session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, true );
 
-            org.eclipse.aether.artifact.Artifact aetherArtifact =
-                (org.eclipse.aether.artifact.Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                                                       Artifact.class, projectArtifact,
-                                                                       exceptionHandler );
+            org.eclipse.aether.artifact.Artifact aetherArtifact;
+            try
+            {
+                aetherArtifact = RepositoryUtils.toArtifact( projectArtifact );
+            }
+            catch ( Exception e )
+            {
+                throw exceptionHandler.create( e.getMessage(), e );
+            }
 
-            @SuppressWarnings( "unchecked" )
-            List<org.eclipse.aether.repository.RemoteRepository> aetherRepos =
-                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
-                                                                                       List.class,
-                                                                                       remoteArtifactRepositories,
-                                                                                       exceptionHandler );
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepos;
+            try
+            {
+                aetherRepos = RepositoryUtils.toRepos( remoteArtifactRepositories );
+            }
+            catch ( Exception e )
+            {
+                throw exceptionHandler.create( e.getMessage(), e );
+            }
 
             CollectRequest collectRequest = new CollectRequest();
             collectRequest.setRootArtifact( aetherArtifact );
@@ -202,8 +219,7 @@
     {
         for ( Dependency dependency : project.getDependencies() )
         {
-            org.eclipse.aether.graph.Dependency aetherDep = toAetherDependency( stereotypes, dependency );
-            collectRequest.addDependency( aetherDep );
+            collectRequest.addDependency( toAetherDependency( stereotypes, dependency ) );
         }
     }
 
@@ -212,33 +228,23 @@
                                                                     Dependency dependency )
         throws DependencyCollectorBuilderException
     {
-        return (org.eclipse.aether.graph.Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency",
-                                                              Dependency.class,
-                                                              ArtifactTypeRegistry.class,
-                                                              dependency, stereotypes, exceptionHandler );
+        try
+        {
+            return RepositoryUtils.toDependency( dependency, stereotypes );
+        }
+        catch ( Exception e )
+        {
+            throw exceptionHandler.create( e.getMessage(), e );
+        }
     }
     // CHECKSTYLE_ON: LineLength
 
     private Artifact getDependencyArtifact( org.eclipse.aether.graph.Dependency dep )
     {
-        org.eclipse.aether.artifact.Artifact artifact = dep.getArtifact();
-
-        try
-        {
-            Artifact mavenArtifact =
-                (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                           org.eclipse.aether.artifact.Artifact.class, artifact, exceptionHandler );
-
-            mavenArtifact.setScope( dep.getScope() );
-            mavenArtifact.setOptional( dep.isOptional() );
-
-            return mavenArtifact;
-        }
-        catch ( DependencyCollectorBuilderException e )
-        {
-            // ReflectionException should not happen
-            throw new RuntimeException( e.getMessage(), e );
-        }
+        Artifact mavenArtifact = toArtifact( dep.getArtifact() );
+        mavenArtifact.setScope( dep.getScope() );
+        mavenArtifact.setOptional( dep.isOptional() );
+        return mavenArtifact;
     }
 
     private DependencyNode buildDependencyNode( DependencyNode parent, org.eclipse.aether.graph.DependencyNode node,
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
index bdecb91..59c678d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
@@ -19,13 +19,13 @@
  * under the License.
  */
 
+import static org.apache.maven.RepositoryUtils.toArtifact;
 import static org.eclipse.aether.util.graph.manager.DependencyManagerUtils.NODE_DATA_PREMANAGED_VERSION;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.DefaultDependencyResolutionRequest;
@@ -44,7 +44,6 @@
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.graph.Dependency;
-import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.graph.Exclusion;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
 import org.eclipse.aether.version.VersionConstraint;
@@ -64,11 +63,8 @@
     @Requirement
     private ProjectDependenciesResolver resolver;
 
-    private final ExceptionHandler<DependencyGraphBuilderException> exceptionHandler;
-    
     public Maven31DependencyGraphBuilder()
     {
-        this.exceptionHandler = DependencyGraphBuilderException::new;
     }
 
     /**
@@ -85,10 +81,7 @@
     {
         MavenProject project = buildingRequest.getProject();
 
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession", exceptionHandler );
-
-        
+        RepositorySystemSession session = buildingRequest.getRepositorySession();
         if ( Boolean.TRUE != session.getConfigProperties().get( NODE_DATA_PREMANAGED_VERSION ) )
         {
             DefaultRepositorySystemSession newSession = new DefaultRepositorySystemSession( session );
@@ -98,17 +91,13 @@
 
         final DependencyResolutionRequest request = new DefaultDependencyResolutionRequest();
         request.setMavenProject( project );
-        Invoker.invoke( request, "setRepositorySession", RepositorySystemSession.class, session );
+        request.setRepositorySession( session );
         // only download the poms, not the artifacts
-        DependencyFilter collectFilter = ( node, parents ) -> false;
-        Invoker.invoke( request, "setResolutionFilter", DependencyFilter.class, collectFilter );
+        request.setResolutionFilter( ( node, parents ) -> false );
 
-        final DependencyResolutionResult result = resolveDependencies( request );
-        org.eclipse.aether.graph.DependencyNode graph =
-            (org.eclipse.aether.graph.DependencyNode) Invoker.invoke( DependencyResolutionResult.class, result,
-                                                                      "getDependencyGraph", exceptionHandler );
+        DependencyResolutionResult result = resolveDependencies( request );
 
-        return buildDependencyNode( null, graph, project.getArtifact(), filter );
+        return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter );
     }
 
     private DependencyResolutionResult resolveDependencies( DependencyResolutionRequest request )
@@ -125,27 +114,6 @@
         }
     }
 
-    private Artifact getDependencyArtifact( Dependency dep )
-    {
-        org.eclipse.aether.artifact.Artifact artifact = dep.getArtifact();
-
-        try
-        {
-            Artifact mavenArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                              org.eclipse.aether.artifact.Artifact.class, artifact, exceptionHandler );
-
-            mavenArtifact.setScope( dep.getScope() );
-            mavenArtifact.setOptional( dep.isOptional() );
-
-            return mavenArtifact;
-        }
-        catch ( DependencyGraphBuilderException e )
-        {
-            // ReflectionException should not happen
-            throw new RuntimeException( e.getMessage(), e );
-        }
-    }
-
     private DependencyNode buildDependencyNode( DependencyNode parent, org.eclipse.aether.graph.DependencyNode node,
                                                 Artifact artifact, ArtifactFilter filter )
     {
@@ -174,11 +142,14 @@
         List<DependencyNode> nodes = new ArrayList<>( node.getChildren().size() );
         for ( org.eclipse.aether.graph.DependencyNode child : node.getChildren() )
         {
-            Artifact childArtifact = getDependencyArtifact( child.getDependency() );
+            Dependency dep = child.getDependency();
+            Artifact mavenArtifact = toArtifact( dep.getArtifact() );
+            mavenArtifact.setScope( dep.getScope() );
+            mavenArtifact.setOptional( dep.isOptional() );
 
-            if ( ( filter == null ) || filter.include( childArtifact ) )
+            if ( ( filter == null ) || filter.include( mavenArtifact ) )
             {
-                nodes.add( buildDependencyNode( current, child, childArtifact, filter ) );
+                nodes.add( buildDependencyNode( current, child, mavenArtifact, filter ) );
             }
         }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
deleted file mode 100644
index 2a3a555..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
+++ /dev/null
@@ -1,321 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilderException;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver;
-import org.apache.maven.shared.dependency.graph.internal.maven30.JavaScopeDeriver;
-import org.apache.maven.shared.dependency.graph.internal.maven30.Maven3DirectScopeDependencySelector;
-import org.apache.maven.shared.dependency.graph.internal.maven30.NearestVersionSelector;
-import org.apache.maven.shared.dependency.graph.internal.maven30.SimpleOptionalitySelector;
-import org.apache.maven.shared.dependency.graph.internal.maven30.VerboseJavaScopeSelector;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.sonatype.aether.RepositorySystem;
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.artifact.ArtifactTypeRegistry;
-import org.sonatype.aether.collection.CollectRequest;
-import org.sonatype.aether.collection.CollectResult;
-import org.sonatype.aether.collection.DependencyCollectionException;
-import org.sonatype.aether.collection.DependencyGraphTransformer;
-import org.sonatype.aether.collection.DependencySelector;
-import org.sonatype.aether.graph.DependencyVisitor;
-import org.sonatype.aether.graph.Exclusion;
-import org.sonatype.aether.util.DefaultRepositorySystemSession;
-import org.sonatype.aether.util.artifact.JavaScopes;
-import org.sonatype.aether.util.graph.TreeDependencyVisitor;
-import org.sonatype.aether.util.graph.selector.AndDependencySelector;
-import org.sonatype.aether.util.graph.selector.ExclusionDependencySelector;
-import org.sonatype.aether.util.graph.selector.OptionalDependencySelector;
-import org.sonatype.aether.version.VersionConstraint;
-
-/**
- * Project dependency raw dependency collector API, abstracting Maven 3's Aether implementation.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-@Component( role = DependencyCollectorBuilder.class, hint = "maven3" )
-public class Maven3DependencyCollectorBuilder
-    extends AbstractLogEnabled
-    implements DependencyCollectorBuilder
-{
-    @Requirement
-    private RepositorySystem repositorySystem;
-    
-    private final ExceptionHandler<DependencyCollectorBuilderException> exceptionHandler;
-    
-    public Maven3DependencyCollectorBuilder()
-    {
-        this.exceptionHandler = DependencyCollectorBuilderException::new;
-    }
-
-    @Override
-    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
-        throws DependencyCollectorBuilderException
-    {
-        try
-        {
-            MavenProject project = buildingRequest.getProject();
-
-            Artifact projectArtifact = project.getArtifact();
-            List<ArtifactRepository> remoteArtifactRepositories = project.getRemoteArtifactRepositories();
-
-            // throws ClassCastException (classloading issues?)
-            // DefaultRepositorySystemSession repositorySystemSession =
-            // (DefaultRepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-            RepositorySystemSession repositorySystemSession = buildingRequest.getRepositorySession();
-
-            DefaultRepositorySystemSession session = new DefaultRepositorySystemSession( repositorySystemSession );
-
-            DependencyGraphTransformer transformer =
-                new ConflictResolver( new NearestVersionSelector(), new VerboseJavaScopeSelector(),
-                                      new SimpleOptionalitySelector(), new JavaScopeDeriver() );
-            session.setDependencyGraphTransformer( transformer );
-
-            DependencySelector depFilter =
-                new AndDependencySelector( new Maven3DirectScopeDependencySelector( JavaScopes.TEST ),
-                                           new OptionalDependencySelector(), 
-                                           new ExclusionDependencySelector() );
-            session.setDependencySelector( depFilter );
-
-            session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, true );
-            session.setConfigProperty( "aether.dependencyManager.verbose", true );
-
-            org.sonatype.aether.artifact.Artifact aetherArtifact =
-                (org.sonatype.aether.artifact.Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                                                        Artifact.class, projectArtifact,
-                                                                        exceptionHandler );
-
-            @SuppressWarnings( "unchecked" )
-            List<org.sonatype.aether.repository.RemoteRepository> aetherRepos =
-                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
-                                                                                        "toRepos", List.class,
-                                                                                        remoteArtifactRepositories,
-                                                                                        exceptionHandler );
-
-            CollectRequest collectRequest = new CollectRequest();
-            collectRequest.setRoot( new org.sonatype.aether.graph.Dependency( aetherArtifact, "" ) );
-            collectRequest.setRepositories( aetherRepos );
-
-            org.sonatype.aether.artifact.ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry();
-            collectDependencyList( collectRequest, project, stereotypes );
-            collectManagedDependencyList( collectRequest, project, stereotypes );
-
-            CollectResult collectResult = repositorySystem.collectDependencies( session, collectRequest );
-
-            org.sonatype.aether.graph.DependencyNode rootNode = collectResult.getRoot();
-
-            if ( getLogger().isDebugEnabled() )
-            {
-                logTree( rootNode );
-            }
-
-            return buildDependencyNode( null, rootNode, projectArtifact, filter );
-        }
-        catch ( DependencyCollectionException e )
-        {
-            throw new DependencyCollectorBuilderException( "Could not collect dependencies: " + e.getResult(), e );
-        }
-    }
-
-    private void logTree( org.sonatype.aether.graph.DependencyNode rootNode )
-    {
-        // print the node tree with its associated data Map
-        rootNode.accept( new TreeDependencyVisitor( new DependencyVisitor()
-        {
-            String indent = "";
-
-            @Override
-            public boolean visitEnter( org.sonatype.aether.graph.DependencyNode dependencyNode )
-            {
-                StringBuilder sb = new StringBuilder();
-                sb.append( indent ).append( "Aether node: " ).append( dependencyNode );
-                if ( !dependencyNode.getData().isEmpty() )
-                {
-                    sb.append( "data map: " ).append( dependencyNode.getData() );
-                }
-                if ( dependencyNode.getPremanagedVersion() != null && !dependencyNode.getPremanagedVersion().isEmpty() )
-                {
-                    sb.append( "Premanaged.version: " ).append( dependencyNode.getPremanagedVersion() );
-                }
-                if ( dependencyNode.getPremanagedScope() != null && !dependencyNode.getPremanagedScope().isEmpty() )
-                {
-                    sb.append( "Premanaged.scope: " ).append( dependencyNode.getPremanagedScope() );
-                }
-                getLogger().debug( sb.toString() );
-                indent += "    ";
-                return true;
-            }
-
-            @Override
-            public boolean visitLeave( org.sonatype.aether.graph.DependencyNode dependencyNode )
-            {
-                indent = indent.substring( 0, indent.length() - 4 );
-                return true;
-            }
-        } ) );
-    }
-
-    private void collectManagedDependencyList( CollectRequest collectRequest, MavenProject project,
-                                               ArtifactTypeRegistry stereotypes )
-        throws DependencyCollectorBuilderException
-    {
-        if ( project.getDependencyManagement() != null )
-        {
-            for ( Dependency dependency : project.getDependencyManagement().getDependencies() )
-            {
-                org.sonatype.aether.graph.Dependency aetherDep = toAetherDependency( stereotypes, dependency );
-                collectRequest.addManagedDependency( aetherDep );
-            }
-        }
-    }
-
-    private void collectDependencyList( CollectRequest collectRequest, MavenProject project,
-                                        org.sonatype.aether.artifact.ArtifactTypeRegistry stereotypes )
-        throws DependencyCollectorBuilderException
-    {
-        for ( Dependency dependency : project.getDependencies() )
-        {
-            org.sonatype.aether.graph.Dependency aetherDep = toAetherDependency( stereotypes, dependency );
-            collectRequest.addDependency( aetherDep );
-        }
-    }
-
-    // CHECKSTYLE_OFF: LineLength
-    private org.sonatype.aether.graph.Dependency toAetherDependency( org.sonatype.aether.artifact.ArtifactTypeRegistry stereotypes,
-                                                                    Dependency dependency )
-        throws DependencyCollectorBuilderException
-    {
-        return (org.sonatype.aether.graph.Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency",
-                                                              Dependency.class,
-                                                               ArtifactTypeRegistry.class,
-                                                              dependency, stereotypes, exceptionHandler );
-    }
-    // CHECKSTYLE_ON: LineLength
-
-    private Artifact getDependencyArtifact( org.sonatype.aether.graph.Dependency dep )
-    {
-        org.sonatype.aether.artifact.Artifact artifact = dep.getArtifact();
-
-        try
-        {
-            Artifact mavenArtifact =
-                (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                           org.sonatype.aether.artifact.Artifact.class, artifact, exceptionHandler );
-
-            mavenArtifact.setScope( dep.getScope() );
-            mavenArtifact.setOptional( dep.isOptional() );
-
-            return mavenArtifact;
-        }
-        catch ( DependencyCollectorBuilderException e )
-        {
-            // ReflectionException should not happen
-            throw new RuntimeException( e.getMessage(), e );
-        }
-    }
-
-    private DependencyNode buildDependencyNode( DependencyNode parent, org.sonatype.aether.graph.DependencyNode node,
-                                                Artifact artifact, ArtifactFilter filter )
-    {
-        String premanagedVersion = node.getPremanagedVersion();
-        String premanagedScope = node.getPremanagedScope();
-
-        Boolean optional = null;
-        if ( node.getDependency() != null )
-        {
-            optional = node.getDependency().isOptional();
-        }
-
-        List<org.apache.maven.model.Exclusion> exclusions = null;
-        if ( node.getDependency() != null )
-        {
-            exclusions = new ArrayList<>( node.getDependency().getExclusions().size() );
-            for ( Exclusion exclusion : node.getDependency().getExclusions() )
-            {
-                org.apache.maven.model.Exclusion modelExclusion = new org.apache.maven.model.Exclusion();
-                modelExclusion.setGroupId( exclusion.getGroupId() );
-                modelExclusion.setArtifactId( exclusion.getArtifactId() );
-                exclusions.add( modelExclusion );
-            }
-        }
-
-        org.sonatype.aether.graph.DependencyNode winner =
-            (org.sonatype.aether.graph.DependencyNode) node.getData().get( ConflictResolver.NODE_DATA_WINNER );
-        String winnerVersion = null;
-        String ignoredScope = null;
-        if ( winner != null )
-        {
-            winnerVersion = winner.getVersion().toString();
-        }
-        else
-        {
-            ignoredScope = (String) node.getData().get( VerboseJavaScopeSelector.REDUCED_SCOPE );
-        }
-
-        ConflictData data = new ConflictData( winnerVersion, ignoredScope );
-
-        VerboseDependencyNode current =
-            new VerboseDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
-                                       getVersionSelectedFromRange( node.getVersionConstraint() ), optional, exclusions,
-                                       data );
-
-        List<DependencyNode> nodes = new ArrayList<>( node.getChildren().size() );
-        for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
-        {
-            Artifact childArtifact = getDependencyArtifact( child.getDependency() );
-
-            if ( ( filter == null ) || filter.include( childArtifact ) )
-            {
-                nodes.add( buildDependencyNode( current, child, childArtifact, filter ) );
-            }
-        }
-
-        current.setChildren( Collections.unmodifiableList( nodes ) );
-
-        return current;
-    }
-
-    private String getVersionSelectedFromRange( VersionConstraint constraint )
-    {
-        if ( ( constraint == null ) || ( constraint.getVersion() != null ) || ( constraint.getRanges().isEmpty() ) )
-        {
-            return null;
-        }
-
-        return constraint.getRanges().iterator().next().toString();
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
deleted file mode 100644
index 2ec8f94..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.project.DefaultDependencyResolutionRequest;
-import org.apache.maven.project.DependencyResolutionException;
-import org.apache.maven.project.DependencyResolutionRequest;
-import org.apache.maven.project.DependencyResolutionResult;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.project.ProjectDependenciesResolver;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.sonatype.aether.graph.DependencyFilter;
-import org.sonatype.aether.graph.Dependency;
-import org.sonatype.aether.version.VersionConstraint;
-
-/**
- * Wrapper around Maven 3 dependency resolver.
- *
- * @see ProjectDependenciesResolver
- * @author Hervé Boutemy
- * @since 2.0
- */
-@Component( role = DependencyGraphBuilder.class, hint = "maven3" )
-public class Maven3DependencyGraphBuilder
-    extends AbstractLogEnabled
-    implements DependencyGraphBuilder
-{
-    @Requirement
-    private ProjectDependenciesResolver resolver;
-
-    /**
-     * Builds the dependency graph for Maven 3.
-     *
-     * @param buildingRequest the buildingRequest
-     * @param filter artifact filter (can be <code>null</code>)
-     * @return DependencyNode containing the dependency graph.
-     * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
-     */
-    @Override
-    public DependencyNode buildDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
-        throws DependencyGraphBuilderException
-    {
-        MavenProject project = buildingRequest.getProject();
-
-        DependencyResolutionRequest request =
-            new DefaultDependencyResolutionRequest( project, buildingRequest.getRepositorySession() );
-
-        // only download the poms, not the artifacts
-        DependencyFilter collectFilter = ( node, parents ) -> false;
-        request.setResolutionFilter( collectFilter );
-
-        DependencyResolutionResult result = resolveDependencies( request );
-
-        return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter );
-    }
-
-    private DependencyResolutionResult resolveDependencies( DependencyResolutionRequest request )
-        throws DependencyGraphBuilderException
-    {
-        try
-        {
-            return resolver.resolve( request );
-        }
-        catch ( DependencyResolutionException e )
-        {
-            throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "
-                + e.getResult().getUnresolvedDependencies(), e );
-        }
-    }
-
-    private Artifact getDependencyArtifact( Dependency dep )
-    {
-        Artifact mavenArtifact = RepositoryUtils.toArtifact( dep.getArtifact() );
-
-        mavenArtifact.setScope( dep.getScope() );
-        mavenArtifact.setOptional( dep.isOptional() );
-
-        return mavenArtifact;
-    }
-
-    private DependencyNode buildDependencyNode( DependencyNode parent, org.sonatype.aether.graph.DependencyNode node,
-                                                Artifact artifact, ArtifactFilter filter )
-    {
-        DefaultDependencyNode current =
-            new DefaultDependencyNode( parent, artifact,
-                                       null /* node.getPremanagedVersion() */,
-                                       null /* node.getPremanagedScope() */,
-                                       getVersionSelectedFromRange( node.getVersionConstraint() ) );
-
-        List<DependencyNode> nodes = new ArrayList<>( node.getChildren().size() );
-        for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
-        {
-            Artifact childArtifact = getDependencyArtifact( child.getDependency() );
-
-            if ( ( filter == null ) || filter.include( childArtifact ) )
-            {
-                nodes.add( buildDependencyNode( current, child, childArtifact, filter ) );
-            }
-        }
-
-        current.setChildren( Collections.unmodifiableList( nodes ) );
-
-        return current;
-    }
-
-    private String getVersionSelectedFromRange( VersionConstraint constraint )
-    {
-        if ( ( constraint == null ) || ( constraint.getVersion() != null ) )
-        {
-            return null;
-        }
-
-        StringBuilder sb = new StringBuilder();
-        for ( org.sonatype.aether.version.VersionRange range : constraint.getRanges() )
-        {
-            if ( sb.length() > 0 )
-            {
-                sb.append( ',' );
-            }
-            sb.append( range );
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java
deleted file mode 100644
index 35cb5a8..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java
+++ /dev/null
@@ -1,370 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.sonatype.aether.RepositoryException;
-import org.sonatype.aether.collection.DependencyGraphTransformationContext;
-import org.sonatype.aether.collection.DependencyGraphTransformer;
-import org.sonatype.aether.graph.DependencyNode;
-import org.sonatype.aether.util.graph.transformer.ConflictMarker;
-import org.sonatype.aether.util.graph.transformer.TransformationContextKeys;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public final class ConflictIdSorter
-    implements DependencyGraphTransformer
-{
-
-    public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
-        throws RepositoryException
-    {
-        Map<?, ?> conflictIds = (Map<?, ?>) context.get( TransformationContextKeys.CONFLICT_IDS );
-        if ( conflictIds == null )
-        {
-            ConflictMarker marker = new ConflictMarker();
-            marker.transformGraph( node, context );
-
-            conflictIds = (Map<?, ?>) context.get( TransformationContextKeys.CONFLICT_IDS );
-        }
-
-//        @SuppressWarnings( "unchecked" )
-//        Map<String, Object> stats = (Map<String, Object>) context.get( TransformationContextKeys.STATS );
-//        long time1 = System.currentTimeMillis();
-
-        Map<Object, ConflictId> ids = new LinkedHashMap<>( 256 );
-
-        // CHECKSTYLE_OFF: AvoidNestedBlocks
-        {
-            ConflictId id = null;
-            Object key = conflictIds.get( node );
-            if ( key != null )
-            {
-                id = new ConflictId( key, 0 );
-                ids.put( key, id );
-            }
-
-            Map<DependencyNode, Object> visited = new IdentityHashMap<>( conflictIds.size() );
-
-            buildConflitIdDAG( ids, node, id, 0, visited, conflictIds );
-        }
-        // CHECKSTYLE_NO: AvoidNestedBlocks
-
-//        long time2 = System.currentTimeMillis();
-
-        topsortConflictIds( ids.values(), context );
-//        int cycles = topsortConflictIds( ids.values(), context );
-
-//        if ( stats != null )
-//        {
-//            long time3 = System.currentTimeMillis();
-//            stats.put( "ConflictIdSorter.graphTime", time2 - time1 );
-//            stats.put( "ConflictIdSorter.topsortTime", time3 - time2 );
-//            stats.put( "ConflictIdSorter.conflictIdCount", ids.size() );
-//            stats.put( "ConflictIdSorter.conflictIdCycleCount", cycles );
-//        }
-
-        return node;
-    }
-
-    private void buildConflitIdDAG( Map<Object, ConflictId> ids, DependencyNode node, ConflictId id, int depth,
-                                    Map<DependencyNode, Object> visited, Map<?, ?> conflictIds )
-    {
-        if ( visited.put( node, Boolean.TRUE ) != null )
-        {
-            return;
-        }
-
-        depth++;
-
-        for ( DependencyNode child : node.getChildren() )
-        {
-            Object key = conflictIds.get( child );
-            ConflictId childId = ids.get( key );
-            if ( childId == null )
-            {
-                childId = new ConflictId( key, depth );
-                ids.put( key, childId );
-            }
-            else
-            {
-                childId.pullup( depth );
-            }
-
-            if ( id != null )
-            {
-                id.add( childId );
-            }
-
-            buildConflitIdDAG( ids, child, childId, depth, visited, conflictIds );
-        }
-    }
-
-    private int topsortConflictIds( Collection<ConflictId> conflictIds, DependencyGraphTransformationContext context )
-    {
-        List<Object> sorted = new ArrayList<>( conflictIds.size() );
-
-        RootQueue roots = new RootQueue( conflictIds.size() / 2 );
-        for ( ConflictId id : conflictIds )
-        {
-            if ( id.inDegree <= 0 )
-            {
-                roots.add( id );
-            }
-        }
-
-        processRoots( sorted, roots );
-
-        boolean cycle = sorted.size() < conflictIds.size();
-
-        while ( sorted.size() < conflictIds.size() )
-        {
-            // cycle -> deal gracefully with nodes still having positive in-degree
-
-            ConflictId nearest = null;
-            for ( ConflictId id : conflictIds )
-            {
-                if ( id.inDegree <= 0 )
-                {
-                    continue;
-                }
-                if ( nearest == null || id.minDepth < nearest.minDepth
-                    || ( id.minDepth == nearest.minDepth && id.inDegree < nearest.inDegree ) )
-                {
-                    nearest = id;
-                }
-            }
-
-            nearest.inDegree = 0;
-            roots.add( nearest );
-
-            processRoots( sorted, roots );
-        }
-
-        Collection<Collection<Object>> cycles = Collections.emptySet();
-        if ( cycle )
-        {
-            cycles = findCycles( conflictIds );
-        }
-
-        context.put( TransformationContextKeys.SORTED_CONFLICT_IDS, sorted );
-        context.put( TransformationContextKeys.CYCLIC_CONFLICT_IDS, cycles );
-
-        return cycles.size();
-    }
-
-    private void processRoots( List<Object> sorted, RootQueue roots )
-    {
-        while ( !roots.isEmpty() )
-        {
-            ConflictId root = roots.remove();
-
-            sorted.add( root.key );
-
-            for ( ConflictId child : root.children )
-            {
-                child.inDegree--;
-                if ( child.inDegree == 0 )
-                {
-                    roots.add( child );
-                }
-            }
-        }
-    }
-
-    private Collection<Collection<Object>> findCycles( Collection<ConflictId> conflictIds )
-    {
-        Collection<Collection<Object>> cycles = new HashSet<>();
-
-        Map<Object, Integer> stack = new HashMap<>( 128 );
-        Map<ConflictId, Object> visited = new IdentityHashMap<>( conflictIds.size() );
-        for ( ConflictId id : conflictIds )
-        {
-            findCycles( id, visited, stack, cycles );
-        }
-
-        return cycles;
-    }
-
-    private void findCycles( ConflictId id, Map<ConflictId, Object> visited, Map<Object, Integer> stack,
-                             Collection<Collection<Object>> cycles )
-    {
-        Integer depth = stack.put( id.key, stack.size() );
-        if ( depth != null )
-        {
-            stack.put( id.key, depth );
-            Collection<Object> cycle = new HashSet<>();
-            for ( Map.Entry<Object, Integer> entry : stack.entrySet() )
-            {
-                if ( entry.getValue() >= depth )
-                {
-                    cycle.add( entry.getKey() );
-                }
-            }
-            cycles.add( cycle );
-        }
-        else
-        {
-            if ( visited.put( id, Boolean.TRUE ) == null )
-            {
-                for ( ConflictId childId : id.children )
-                {
-                    findCycles( childId, visited, stack, cycles );
-                }
-            }
-            stack.remove( id.key );
-        }
-    }
-
-    static final class ConflictId
-    {
-
-        final Object key;
-
-        Collection<ConflictId> children = Collections.emptySet();
-
-        int inDegree;
-
-        int minDepth;
-
-        ConflictId( Object key, int depth )
-        {
-            this.key = key;
-            this.minDepth = depth;
-        }
-
-        public void add( ConflictId child )
-        {
-            if ( children.isEmpty() )
-            {
-                children = new HashSet<>();
-            }
-            if ( children.add( child ) )
-            {
-                child.inDegree++;
-            }
-        }
-
-        public void pullup( int depth )
-        {
-            if ( depth < minDepth )
-            {
-                minDepth = depth;
-                depth++;
-                for ( ConflictId child : children )
-                {
-                    child.pullup( depth );
-                }
-            }
-        }
-
-        @Override
-        public boolean equals( Object obj )
-        {
-            if ( this == obj )
-            {
-                return true;
-            }
-            else if ( !( obj instanceof ConflictId ) )
-            {
-                return false;
-            }
-            ConflictId that = (ConflictId) obj;
-            return this.key.equals( that.key );
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return key.hashCode();
-        }
-
-        @Override
-        public String toString()
-        {
-            return key + " @ " + minDepth + " <" + inDegree;
-        }
-
-    }
-
-    static final class RootQueue
-    {
-
-        private int nextOut;
-
-        private int nextIn;
-
-        private ConflictId[] ids;
-
-        RootQueue( int capacity )
-        {
-            ids = new ConflictId[capacity + 16];
-        }
-
-        boolean isEmpty()
-        {
-            return nextOut >= nextIn;
-        }
-
-        void add( ConflictId id )
-        {
-            if ( nextOut >= nextIn && nextOut > 0 )
-            {
-                nextIn -= nextOut;
-                nextOut = 0;
-            }
-            if ( nextIn >= ids.length )
-            {
-                ConflictId[] tmp = new ConflictId[ids.length + ids.length / 2 + 16];
-                System.arraycopy( ids, nextOut, tmp, 0, nextIn - nextOut );
-                ids = tmp;
-                nextIn -= nextOut;
-                nextOut = 0;
-            }
-            int i;
-            for ( i = nextIn - 1; i >= nextOut && id.minDepth < ids[i].minDepth; i-- )
-            {
-                ids[i + 1] = ids[i];
-            }
-            ids[i + 1] = id;
-            nextIn++;
-        }
-
-        ConflictId remove()
-        {
-            return ids[nextOut++];
-        }
-
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java
deleted file mode 100644
index 329c028..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java
+++ /dev/null
@@ -1,1314 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import org.sonatype.aether.RepositoryException;
-import org.sonatype.aether.artifact.Artifact;
-import org.sonatype.aether.collection.DependencyGraphTransformationContext;
-import org.sonatype.aether.collection.DependencyGraphTransformer;
-import org.sonatype.aether.graph.Dependency;
-import org.sonatype.aether.graph.DependencyNode;
-import org.sonatype.aether.util.ConfigUtils;
-import org.sonatype.aether.util.graph.DefaultDependencyNode;
-import org.sonatype.aether.util.graph.transformer.TransformationContextKeys;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public final class ConflictResolver
-    implements DependencyGraphTransformer
-{
-
-    /**
-     * The key in the repository session's {@link org.sonatype.aether.RepositorySystemSession#getConfigProperties()
-     * configuration properties} used to store a {@link Boolean} flag controlling the transformer's verbose mode.
-     */
-    public static final String CONFIG_PROP_VERBOSE = "aether.conflictResolver.verbose";
-
-    /**
-     * The key in the dependency node's {@link DependencyNode#getData() custom data} under which a reference to the
-     * {@link DependencyNode} which has won the conflict is stored.
-     */
-    public static final String NODE_DATA_WINNER = "conflict.winner";
-
-    /**
-     * The key in the dependency node's {@link DependencyNode#getData() custom data} under which the scope of the
-     * dependency before scope derivation and conflict resolution is stored.
-     */
-    public static final String NODE_DATA_ORIGINAL_SCOPE = "conflict.originalScope";
-
-    /**
-     * The key in the dependency node's {@link DependencyNode#getData() custom data} under which the optional flag of
-     * the dependency before derivation and conflict resolution is stored.
-     */
-    public static final String NODE_DATA_ORIGINAL_OPTIONALITY = "conflict.originalOptionality";
-
-    private final VersionSelector versionSelector;
-
-    private final ScopeSelector scopeSelector;
-
-    private final ScopeDeriver scopeDeriver;
-
-    private final OptionalitySelector optionalitySelector;
-
-    /**
-     * Creates a new conflict resolver instance with the specified hooks.
-     * 
-     * @param versionSelector The version selector to use, must not be {@code null}.
-     * @param scopeSelector The scope selector to use, must not be {@code null}.
-     * @param optionalitySelector The optionality selector ot use, must not be {@code null}.
-     * @param scopeDeriver The scope deriver to use, must not be {@code null}.
-     */
-    public ConflictResolver( VersionSelector versionSelector, ScopeSelector scopeSelector,
-                             OptionalitySelector optionalitySelector, ScopeDeriver scopeDeriver )
-    {
-        if ( versionSelector == null )
-        {
-            throw new IllegalArgumentException( "version selector not specified" );
-        }
-        this.versionSelector = versionSelector;
-        if ( scopeSelector == null )
-        {
-            throw new IllegalArgumentException( "scope selector not specified" );
-        }
-        this.scopeSelector = scopeSelector;
-        if ( scopeDeriver == null )
-        {
-            throw new IllegalArgumentException( "scope deriver not specified" );
-        }
-        this.scopeDeriver = scopeDeriver;
-        if ( optionalitySelector == null )
-        {
-            throw new IllegalArgumentException( "optionality selector not specified" );
-        }
-        this.optionalitySelector = optionalitySelector;
-    }
-
-    public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
-        throws RepositoryException
-    {
-        List<?> sortedConflictIds = (List<?>) context.get( TransformationContextKeys.SORTED_CONFLICT_IDS );
-        if ( sortedConflictIds == null )
-        {
-            ConflictIdSorter sorter = new ConflictIdSorter();
-            sorter.transformGraph( node, context );
-
-            sortedConflictIds = (List<?>) context.get( TransformationContextKeys.SORTED_CONFLICT_IDS );
-        }
-
-//        @SuppressWarnings( "unchecked" )
-//        Map<String, Object> stats = (Map<String, Object>) context.get( TransformationContextKeys.STATS );
-//        long time1 = System.currentTimeMillis();
-
-        @SuppressWarnings( "unchecked" )
-        Collection<Collection<?>> conflictIdCycles =
-            (Collection<Collection<?>>) context.get( TransformationContextKeys.CYCLIC_CONFLICT_IDS );
-        if ( conflictIdCycles == null )
-        {
-            throw new RepositoryException( "conflict id cycles have not been identified" );
-        }
-
-        Map<?, ?> conflictIds = (Map<?, ?>) context.get( TransformationContextKeys.CONFLICT_IDS );
-        if ( conflictIds == null )
-        {
-            throw new RepositoryException( "conflict groups have not been identified" );
-        }
-
-        Map<Object, Collection<Object>> cyclicPredecessors = new HashMap<>();
-        for ( Collection<?> cycle : conflictIdCycles )
-        {
-            for ( Object conflictId : cycle )
-            {
-                Collection<Object> predecessors =
-                        cyclicPredecessors.computeIfAbsent( conflictId, k -> new HashSet<>() );
-                predecessors.addAll( cycle );
-            }
-        }
-
-        State state = new State( node, conflictIds, sortedConflictIds.size(), context );
-        for ( Iterator<?> it = sortedConflictIds.iterator(); it.hasNext(); )
-        {
-            Object conflictId = it.next();
-
-            // reset data structures for next graph walk
-            state.prepare( conflictId, cyclicPredecessors.get( conflictId ) );
-
-            // find nodes with the current conflict id and while walking the graph (more deeply), nuke leftover losers
-            gatherConflictItems( node, state );
-
-            // now that we know the min depth of the parents, update depth of conflict items
-            state.finish();
-
-            // earlier runs might have nuked all parents of the current conflict id, so it might not exist anymore
-            if ( !state.items.isEmpty() )
-            {
-                ConflictContext ctx = state.conflictCtx;
-                state.versionSelector.selectVersion( ctx );
-                if ( ctx.winner == null )
-                {
-                    throw new RepositoryException( "conflict resolver did not select winner among " + state.items );
-                }
-                DependencyNode winner = ctx.winner.node;
-
-                state.scopeSelector.selectScope( ctx );
-                if ( state.verbose )
-                {
-                    winner.setData( NODE_DATA_ORIGINAL_SCOPE, winner.getDependency().getScope() );
-                }
-                winner.setScope( ctx.scope );
-
-                state.optionalitySelector.selectOptionality( ctx );
-                if ( state.verbose )
-                {
-                    winner.setData( NODE_DATA_ORIGINAL_OPTIONALITY, winner.getDependency().isOptional() );
-                }
-                winner.getDependency().setOptional( ctx.optional );
-//                winner.setOptional( ctx.optional );
-
-                removeLosers( state );
-            }
-
-            // record the winner so we can detect leftover losers during future graph walks
-            state.winner();
-
-            // in case of cycles, trigger final graph walk to ensure all leftover losers are gone
-            if ( !it.hasNext() && !conflictIdCycles.isEmpty() && state.conflictCtx.winner != null )
-            {
-                DependencyNode winner = state.conflictCtx.winner.node;
-                state.prepare( state, null );
-                gatherConflictItems( winner, state );
-            }
-        }
-
-//        if ( stats != null )
-//        {
-//            long time2 = System.currentTimeMillis();
-//            stats.put( "ConflictResolver.totalTime", time2 - time1 );
-//            stats.put( "ConflictResolver.conflictItemCount", state.totalConflictItems );
-//        }
-
-        return node;
-    }
-
-    private boolean gatherConflictItems( DependencyNode node, State state )
-        throws RepositoryException
-    {
-        Object conflictId = state.conflictIds.get( node );
-        if ( state.currentId.equals( conflictId ) )
-        {
-            // found it, add conflict item (if not already done earlier by another path)
-            state.add( node );
-            // we don't recurse here so we might miss losers beneath us, those will be nuked during future walks below
-        }
-        else if ( state.loser( node, conflictId ) )
-        {
-            // found a leftover loser (likely in a cycle) of an already processed conflict id, tell caller to nuke it
-            return false;
-        }
-        else if ( state.push( node, conflictId ) )
-        {
-            // found potential parent, no cycle and not visisted before with the same derived scope, so recurse
-            for ( Iterator<DependencyNode> it = node.getChildren().iterator(); it.hasNext(); )
-            {
-                DependencyNode child = it.next();
-                if ( !gatherConflictItems( child, state ) )
-                {
-                    it.remove();
-                }
-            }
-            state.pop();
-        }
-        return true;
-    }
-
-    private void removeLosers( State state )
-    {
-        ConflictItem winner = state.conflictCtx.winner;
-        List<DependencyNode> previousParent = null;
-        ListIterator<DependencyNode> childIt = null;
-        boolean conflictVisualized = false;
-        for ( ConflictItem item : state.items )
-        {
-            if ( item == winner )
-            {
-                continue;
-            }
-            if ( item.parent != previousParent )
-            {
-                childIt = item.parent.listIterator();
-                previousParent = item.parent;
-                conflictVisualized = false;
-            }
-            while ( childIt.hasNext() )
-            {
-                DependencyNode child = childIt.next();
-                if ( child == item.node )
-                {
-                    if ( state.verbose && !conflictVisualized && item.parent != winner.parent )
-                    {
-                        conflictVisualized = true;
-                        DependencyNode loser = new DefaultDependencyNode( child );
-                        loser.setData( NODE_DATA_WINNER, winner.node );
-                        loser.setData( NODE_DATA_ORIGINAL_SCOPE, loser.getDependency().getScope() );
-                        loser.setData( NODE_DATA_ORIGINAL_OPTIONALITY, loser.getDependency().isOptional() );
-                        loser.setScope( item.getScopes().iterator().next() );
-//                        loser.setChildren( Collections.<DependencyNode>emptyList() );
-                        childIt.set( loser );
-                    }
-                    else
-                    {
-                        childIt.remove();
-                    }
-                    break;
-                }
-            }
-        }
-        // there might still be losers beneath the winner (e.g. in case of cycles)
-        // those will be nuked during future graph walks when we include the winner in the recursion
-    }
-
-    static final class NodeInfo
-    {
-
-        /**
-         * The smallest depth at which the node was seen, used for "the" depth of its conflict items.
-         */
-        int minDepth;
-
-        /**
-         * The set of derived scopes the node was visited with, used to check whether an already seen node needs to be
-         * revisited again in context of another scope. To conserve memory, we start with {@code String} and update to
-         * {@code Set<String>} if needed.
-         */
-        Object derivedScopes;
-
-        /**
-         * The set of derived optionalities the node was visited with, used to check whether an already seen node needs
-         * to be revisited again in context of another optionality. To conserve memory, encoded as bit field (bit 0 ->
-         * optional=false, bit 1 -> optional=true).
-         */
-        int derivedOptionalities;
-
-        /**
-         * The conflict items which are immediate children of the node, used to easily update those conflict items after
-         * a new parent scope/optionality was encountered.
-         */
-        List<ConflictItem> children;
-
-        static final int CHANGE_SCOPE = 0x01;
-
-        static final int CHANGE_OPTIONAL = 0x02;
-
-        private static final int OPT_FALSE = 0x01;
-
-        private static final int OPT_TRUE = 0x02;
-
-        NodeInfo( int depth, String derivedScope, boolean optional )
-        {
-            minDepth = depth;
-            derivedScopes = derivedScope;
-            derivedOptionalities = optional ? OPT_TRUE : OPT_FALSE;
-        }
-
-        @SuppressWarnings( "unchecked" )
-        int update( int depth, String derivedScope, boolean optional )
-        {
-            if ( depth < minDepth )
-            {
-                minDepth = depth;
-            }
-            int changes;
-            if ( derivedScopes.equals( derivedScope ) )
-            {
-                changes = 0;
-            }
-            else if ( derivedScopes instanceof Collection )
-            {
-                changes = ( (Collection<String>) derivedScopes ).add( derivedScope ) ? CHANGE_SCOPE : 0;
-            }
-            else
-            {
-                Collection<String> scopes = new HashSet<>();
-                scopes.add( (String) derivedScopes );
-                scopes.add( derivedScope );
-                derivedScopes = scopes;
-                changes = CHANGE_SCOPE;
-            }
-            int bit = optional ? OPT_TRUE : OPT_FALSE;
-            if ( ( derivedOptionalities & bit ) == 0 )
-            {
-                derivedOptionalities |= bit;
-                changes |= CHANGE_OPTIONAL;
-            }
-            return changes;
-        }
-
-        void add( ConflictItem item )
-        {
-            if ( children == null )
-            {
-                children = new ArrayList<>( 1 );
-            }
-            children.add( item );
-        }
-
-    }
-
-    final class State
-    {
-
-        /**
-         * The conflict id currently processed.
-         */
-        Object currentId;
-
-        /**
-         * Stats counter.
-         */
-        int totalConflictItems;
-
-        /**
-         * Flag whether we should keep losers in the graph to enable visualization/troubleshooting of conflicts.
-         */
-        final boolean verbose;
-
-        /**
-         * A mapping from conflict id to winner node, helps to recognize nodes that have their effective
-         * scope&optionality set or are leftovers from previous removals.
-         */
-        final Map<Object, DependencyNode> resolvedIds;
-
-        /**
-         * The set of conflict ids which could apply to ancestors of nodes with the current conflict id, used to avoid
-         * recursion early on. This is basically a superset of the key set of resolvedIds, the additional ids account
-         * for cyclic dependencies.
-         */
-        final Collection<Object> potentialAncestorIds;
-
-        /**
-         * The output from the conflict marker
-         */
-        final Map<?, ?> conflictIds;
-
-        /**
-         * The conflict items we have gathered so far for the current conflict id.
-         */
-        final List<ConflictItem> items;
-
-        /**
-         * The (conceptual) mapping from nodes to extra infos, technically keyed by the node's child list which better
-         * captures the identity of a node since we're basically concerned with effects towards children.
-         */
-        final Map<List<DependencyNode>, NodeInfo> infos;
-
-        /**
-         * The set of nodes on the DFS stack to detect cycles, technically keyed by the node's child list to match the
-         * dirty graph structure produced by the dependency collector for cycles.
-         */
-        final Map<List<DependencyNode>, Object> stack;
-
-        /**
-         * The stack of parent nodes.
-         */
-        final List<DependencyNode> parentNodes;
-
-        /**
-         * The stack of derived scopes for parent nodes.
-         */
-        final List<String> parentScopes;
-
-        /**
-         * The stack of derived optional flags for parent nodes.
-         */
-        final List<Boolean> parentOptionals;
-
-        /**
-         * The stack of node infos for parent nodes, may contain {@code null} which is used to disable creating new
-         * conflict items when visiting their parent again (conflict items are meant to be unique by parent-node combo).
-         */
-        final List<NodeInfo> parentInfos;
-
-        /**
-         * The conflict context passed to the version/scope/optionality selectors, updated as we move along rather than
-         * recreated to avoid tmp objects.
-         */
-        final ConflictContext conflictCtx;
-
-        /**
-         * The scope context passed to the scope deriver, updated as we move along rather than recreated to avoid tmp
-         * objects.
-         */
-        final ScopeContext scopeCtx;
-
-        /**
-         * The effective version selector, i.e. after initialization.
-         */
-        final VersionSelector versionSelector;
-
-        /**
-         * The effective scope selector, i.e. after initialization.
-         */
-        final ScopeSelector scopeSelector;
-
-        /**
-         * The effective scope deriver, i.e. after initialization.
-         */
-        final ScopeDeriver scopeDeriver;
-
-        /**
-         * The effective optionality selector, i.e. after initialization.
-         */
-        final OptionalitySelector optionalitySelector;
-
-        State( DependencyNode root, Map<?, ?> conflictIds, int conflictIdCount,
-               DependencyGraphTransformationContext context )
-            throws RepositoryException
-        {
-            this.conflictIds = conflictIds;
-            verbose = ConfigUtils.getBoolean( context.getSession(), false, CONFIG_PROP_VERBOSE );
-            potentialAncestorIds = new HashSet<>( conflictIdCount * 2 );
-            resolvedIds = new HashMap<>( conflictIdCount * 2 );
-            items = new ArrayList<>( 256 );
-            infos = new IdentityHashMap<>( 64 );
-            stack = new IdentityHashMap<>( 64 );
-            parentNodes = new ArrayList<>( 64 );
-            parentScopes = new ArrayList<>( 64 );
-            parentOptionals = new ArrayList<>( 64 );
-            parentInfos = new ArrayList<>( 64 );
-            conflictCtx = new ConflictContext( root, conflictIds, items );
-            scopeCtx = new ScopeContext( null, null );
-            versionSelector = ConflictResolver.this.versionSelector.getInstance( root, context );
-            scopeSelector = ConflictResolver.this.scopeSelector.getInstance( root, context );
-            scopeDeriver = ConflictResolver.this.scopeDeriver.getInstance( root, context );
-            optionalitySelector = ConflictResolver.this.optionalitySelector.getInstance( root, context );
-        }
-
-        void prepare( Object conflictId, Collection<Object> cyclicPredecessors )
-        {
-            currentId = conflictId;
-            conflictCtx.conflictId = conflictId;
-            conflictCtx.winner = null;
-            conflictCtx.scope = null;
-            conflictCtx.optional = null;
-            items.clear();
-            infos.clear();
-            if ( cyclicPredecessors != null )
-            {
-                potentialAncestorIds.addAll( cyclicPredecessors );
-            }
-        }
-
-        void finish()
-        {
-            List<DependencyNode> previousParent = null;
-            int previousDepth = 0;
-            totalConflictItems += items.size();
-            for ( int i = items.size() - 1; i >= 0; i-- )
-            {
-                ConflictItem item = items.get( i );
-                if ( item.parent == previousParent )
-                {
-                    item.depth = previousDepth;
-                }
-                else if ( item.parent != null )
-                {
-                    previousParent = item.parent;
-                    NodeInfo info = infos.get( previousParent );
-                    previousDepth = info.minDepth + 1;
-                    item.depth = previousDepth;
-                }
-            }
-            potentialAncestorIds.add( currentId );
-        }
-
-        void winner()
-        {
-            resolvedIds.put( currentId, ( conflictCtx.winner != null ) ? conflictCtx.winner.node : null );
-        }
-
-        boolean loser( DependencyNode node, Object conflictId )
-        {
-            DependencyNode winner = resolvedIds.get( conflictId );
-            return winner != null && winner != node;
-        }
-
-        boolean push( DependencyNode node, Object conflictId )
-            throws RepositoryException
-        {
-            if ( conflictId == null )
-            {
-                if ( node.getDependency() != null )
-                {
-                    if ( node.getData().get( NODE_DATA_WINNER ) != null )
-                    {
-                        return false;
-                    }
-                    throw new RepositoryException( "missing conflict id for node " + node );
-                }
-            }
-            else if ( !potentialAncestorIds.contains( conflictId ) )
-            {
-                return false;
-            }
-
-            List<DependencyNode> graphNode = node.getChildren();
-            if ( stack.put( graphNode, Boolean.TRUE ) != null )
-            {
-                return false;
-            }
-
-            int depth = depth();
-            String scope = deriveScope( node, conflictId );
-            boolean optional = deriveOptional( node, conflictId );
-            NodeInfo info = infos.get( graphNode );
-            if ( info == null )
-            {
-                info = new NodeInfo( depth, scope, optional );
-                infos.put( graphNode, info );
-                parentInfos.add( info );
-                parentNodes.add( node );
-                parentScopes.add( scope );
-                parentOptionals.add( optional );
-            }
-            else
-            {
-                int changes = info.update( depth, scope, optional );
-                if ( changes == 0 )
-                {
-                    stack.remove( graphNode );
-                    return false;
-                }
-                parentInfos.add( null ); // disable creating new conflict items, we update the existing ones below
-                parentNodes.add( node );
-                parentScopes.add( scope );
-                parentOptionals.add( optional );
-                if ( info.children != null )
-                {
-                    if ( ( changes & NodeInfo.CHANGE_SCOPE ) != 0 )
-                    {
-                        for ( int i = info.children.size() - 1; i >= 0; i-- )
-                        {
-                            ConflictItem item = info.children.get( i );
-                            String childScope = deriveScope( item.node, null );
-                            item.addScope( childScope );
-                        }
-                    }
-                    if ( ( changes & NodeInfo.CHANGE_OPTIONAL ) != 0 )
-                    {
-                        for ( int i = info.children.size() - 1; i >= 0; i-- )
-                        {
-                            ConflictItem item = info.children.get( i );
-                            boolean childOptional = deriveOptional( item.node, null );
-                            item.addOptional( childOptional );
-                        }
-                    }
-                }
-            }
-
-            return true;
-        }
-
-        void pop()
-        {
-            int last = parentInfos.size() - 1;
-            parentInfos.remove( last );
-            parentScopes.remove( last );
-            parentOptionals.remove( last );
-            DependencyNode node = parentNodes.remove( last );
-            stack.remove( node.getChildren() );
-        }
-
-        void add( DependencyNode node )
-            throws RepositoryException
-        {
-            DependencyNode parent = parent();
-            if ( parent == null )
-            {
-                ConflictItem item = newConflictItem( parent, node );
-                items.add( item );
-            }
-            else
-            {
-                NodeInfo info = parentInfos.get( parentInfos.size() - 1 );
-                if ( info != null )
-                {
-                    ConflictItem item = newConflictItem( parent, node );
-                    info.add( item );
-                    items.add( item );
-                }
-            }
-        }
-
-        private ConflictItem newConflictItem( DependencyNode parent, DependencyNode node )
-            throws RepositoryException
-        {
-            return new ConflictItem( parent, node, deriveScope( node, null ), deriveOptional( node, null ) );
-        }
-
-        private int depth()
-        {
-            return parentNodes.size();
-        }
-
-        private DependencyNode parent()
-        {
-            int size = parentNodes.size();
-            return ( size <= 0 ) ? null : parentNodes.get( size - 1 );
-        }
-
-        private String deriveScope( DependencyNode node, Object conflictId )
-            throws RepositoryException
-        {
-            if ( node.getPremanagedScope() != null
-                || ( conflictId != null && resolvedIds.containsKey( conflictId ) ) )
-//            if ( ( node.getManagedBits() & DependencyNode.MANAGED_SCOPE ) != 0
-//                || ( conflictId != null && resolvedIds.containsKey( conflictId ) ) )
-            {
-                return scope( node.getDependency() );
-            }
-
-            int depth = parentNodes.size();
-            scopes( depth, node.getDependency() );
-            if ( depth > 0 )
-            {
-                scopeDeriver.deriveScope( scopeCtx );
-            }
-            return scopeCtx.derivedScope;
-        }
-
-        private void scopes( int parent, Dependency child )
-        {
-            scopeCtx.parentScope = ( parent > 0 ) ? parentScopes.get( parent - 1 ) : null;
-            scopeCtx.derivedScope = scope( child );
-            scopeCtx.childScope = scopeCtx.derivedScope;
-        }
-
-        private String scope( Dependency dependency )
-        {
-            return ( dependency != null ) ? dependency.getScope() : null;
-        }
-
-        private boolean deriveOptional( DependencyNode node, Object conflictId )
-        {
-            Dependency dep = node.getDependency();
-            boolean optional = dep != null && dep.isOptional();
-            if ( optional
-                || ( node.getData().get( NODE_DATA_ORIGINAL_OPTIONALITY ) != null
-                    && (Boolean) node.getData().get( NODE_DATA_ORIGINAL_OPTIONALITY ) )
-                || ( conflictId != null && resolvedIds.containsKey( conflictId ) ) )
-//            if ( optional || ( node.getManagedBits() & DependencyNode.MANAGED_OPTIONAL ) != 0
-//                || ( conflictId != null && resolvedIds.containsKey( conflictId ) ) )
-            {
-                return optional;
-            }
-            int depth = parentNodes.size();
-            return ( depth > 0 ) ? parentOptionals.get( depth - 1 ) : false;
-        }
-
-    }
-
-    /**
-     * A context used to hold information that is relevant for deriving the scope of a child dependency.
-     * 
-     * @see ScopeDeriver
-     * This class is not intended to be instantiated by clients in production code, the constructor may
-     *                change without notice and only exists to enable unit testing.
-     */
-    public static final class ScopeContext
-    {
-
-        String parentScope;
-
-        String childScope;
-
-        String derivedScope;
-
-        /**
-         * Creates a new scope context with the specified properties.
-         * 
-         * @param parentScope The scope of the parent dependency, may be {@code null}.
-         * @param childScope The scope of the child dependency, may be {@code null}.
-         * This class is not intended to be instantiated by clients in production code, the constructor may
-         *              change without notice and only exists to enable unit testing.
-         */
-        public ScopeContext( String parentScope, String childScope )
-        {
-            this.parentScope = ( parentScope != null ) ? parentScope : "";
-            derivedScope = ( childScope != null ) ? childScope : "";
-            this.childScope = derivedScope;
-        }
-
-        /**
-         * Gets the scope of the parent dependency. This is usually the scope that was derived by earlier invocations of
-         * the scope deriver.
-         * 
-         * @return The scope of the parent dependency, never {@code null}.
-         */
-        public String getParentScope()
-        {
-            return parentScope;
-        }
-
-        /**
-         * Gets the original scope of the child dependency. This is the scope that was declared in the artifact
-         * descriptor of the parent dependency.
-         * 
-         * @return The original scope of the child dependency, never {@code null}.
-         */
-        public String getChildScope()
-        {
-            return childScope;
-        }
-
-        /**
-         * Gets the derived scope of the child dependency. This is initially equal to {@link #getChildScope()} until the
-         * scope deriver makes changes.
-         * 
-         * @return The derived scope of the child dependency, never {@code null}.
-         */
-        public String getDerivedScope()
-        {
-            return derivedScope;
-        }
-
-        /**
-         * Sets the derived scope of the child dependency.
-         * 
-         * @param derivedScope The derived scope of the dependency, may be {@code null}.
-         */
-        public void setDerivedScope( String derivedScope )
-        {
-            this.derivedScope = ( derivedScope != null ) ? derivedScope : "";
-        }
-
-    }
-
-    /**
-     * A conflicting dependency.
-     * 
-     * This class is not intended to be instantiated by clients in production code, the constructor may
-     *                change without notice and only exists to enable unit testing.
-     */
-    public static final class ConflictItem
-    {
-
-        // nodes can share child lists, we care about the unique owner of a child node which is the child list
-        final List<DependencyNode> parent;
-
-        // only for debugging/toString() to help identify the parent node(s)
-        final Artifact artifact;
-
-        final DependencyNode node;
-
-        int depth;
-
-        // we start with String and update to Set<String> if needed
-        Object scopes;
-
-        // bit field of OPTIONAL_FALSE and OPTIONAL_TRUE
-        int optionalities;
-
-        /**
-         * Bit flag indicating whether one or more paths consider the dependency non-optional.
-         */
-        public static final int OPTIONAL_FALSE = 0x01;
-
-        /**
-         * Bit flag indicating whether one or more paths consider the dependency optional.
-         */
-        public static final int OPTIONAL_TRUE = 0x02;
-
-        ConflictItem( DependencyNode parent, DependencyNode node, String scope, boolean optional )
-        {
-            if ( parent != null )
-            {
-                this.parent = parent.getChildren();
-                this.artifact = parent.getDependency().getArtifact();
-//                this.artifact = parent.getArtifact();
-            }
-            else
-            {
-                this.parent = null;
-                this.artifact = null;
-            }
-            this.node = node;
-            this.scopes = scope;
-            this.optionalities = optional ? OPTIONAL_TRUE : OPTIONAL_FALSE;
-        }
-
-        /**
-         * Creates a new conflict item with the specified properties.
-         * 
-         * @param parent The parent node of the conflicting dependency, may be {@code null}.
-         * @param node The conflicting dependency, must not be {@code null}.
-         * @param depth The zero-based depth of the conflicting dependency.
-         * @param optionalities The optionalities the dependency was encountered with, encoded as a bit field consisting
-         *            of {@link ConflictResolver.ConflictItem#OPTIONAL_TRUE} and
-         *            {@link ConflictResolver.ConflictItem#OPTIONAL_FALSE}.
-         * @param scopes The derived scopes of the conflicting dependency, must not be {@code null}.
-         * This class is not intended to be instantiated by clients in production code, the constructor may
-         *              change without notice and only exists to enable unit testing.
-         */
-        public ConflictItem( DependencyNode parent, DependencyNode node, int depth, int optionalities,
-                             String... scopes )
-        {
-            this.parent = ( parent != null ) ? parent.getChildren() : null;
-            this.artifact = ( parent != null ) ? parent.getDependency().getArtifact() : null;
-//            this.artifact = ( parent != null ) ? parent.getArtifact() : null;
-            this.node = node;
-            this.depth = depth;
-            this.optionalities = optionalities;
-            this.scopes = Arrays.asList( scopes );
-        }
-
-        /**
-         * Determines whether the specified conflict item is a sibling of this item.
-         * 
-         * @param item The other conflict item, must not be {@code null}.
-         * @return {@code true} if the given item has the same parent as this item, {@code false} otherwise.
-         */
-        public boolean isSibling( ConflictItem item )
-        {
-            return parent == item.parent;
-        }
-
-        /**
-         * Gets the dependency node involved in the conflict.
-         * 
-         * @return The involved dependency node, never {@code null}.
-         */
-        public DependencyNode getNode()
-        {
-            return node;
-        }
-
-        /**
-         * Gets the dependency involved in the conflict, short for {@code getNode.getDependency()}.
-         * 
-         * @return The involved dependency, never {@code null}.
-         */
-        public Dependency getDependency()
-        {
-            return node.getDependency();
-        }
-
-        /**
-         * Gets the zero-based depth at which the conflicting node occurs in the graph. As such, the depth denotes the
-         * number of parent nodes. If actually multiple paths lead to the node, the return value denotes the smallest
-         * possible depth.
-         * 
-         * @return The zero-based depth of the node in the graph.
-         */
-        public int getDepth()
-        {
-            return depth;
-        }
-
-        /**
-         * Gets the derived scopes of the dependency. In general, the same dependency node could be reached via
-         * different paths and each path might result in a different derived scope.
-         * 
-         * @see ScopeDeriver
-         * @return The (read-only) set of derived scopes of the dependency, never {@code null}.
-         */
-        @SuppressWarnings( "unchecked" )
-        public Collection<String> getScopes()
-        {
-            if ( scopes instanceof String )
-            {
-                return Collections.singleton( (String) scopes );
-            }
-            return (Collection<String>) scopes;
-        }
-
-        @SuppressWarnings( "unchecked" )
-        void addScope( String scope )
-        {
-            if ( scopes instanceof Collection )
-            {
-                ( (Collection<String>) scopes ).add( scope );
-            }
-            else if ( !scopes.equals( scope ) )
-            {
-                Collection<Object> set = new HashSet<>();
-                set.add( scopes );
-                set.add( scope );
-                scopes = set;
-            }
-        }
-
-        /**
-         * Gets the derived optionalities of the dependency. In general, the same dependency node could be reached via
-         * different paths and each path might result in a different derived optionality.
-         * 
-         * @return A bit field consisting of {@link ConflictResolver.ConflictItem#OPTIONAL_FALSE} and/or
-         *         {@link ConflictResolver.ConflictItem#OPTIONAL_TRUE} indicating the derived optionalities the
-         *         dependency was encountered with.
-         */
-        public int getOptionalities()
-        {
-            return optionalities;
-        }
-
-        void addOptional( boolean optional )
-        {
-            optionalities |= optional ? OPTIONAL_TRUE : OPTIONAL_FALSE;
-        }
-
-        @Override
-        public String toString()
-        {
-            return node + " @ " + depth + " < " + artifact;
-        }
-
-    }
-
-    /**
-     * A context used to hold information that is relevant for resolving version and scope conflicts.
-     * 
-     * @see VersionSelector
-     * @see ScopeSelector
-     * This class is not intended to be instantiated by clients in production code, the constructor may
-     *                change without notice and only exists to enable unit testing.
-     */
-    public static final class ConflictContext
-    {
-
-        final DependencyNode root;
-
-        final Map<?, ?> conflictIds;
-
-        final Collection<ConflictItem> items;
-
-        Object conflictId;
-
-        ConflictItem winner;
-
-        String scope;
-
-        Boolean optional;
-
-        ConflictContext( DependencyNode root, Map<?, ?> conflictIds, Collection<ConflictItem> items )
-        {
-            this.root = root;
-            this.conflictIds = conflictIds;
-            this.items = Collections.unmodifiableCollection( items );
-        }
-
-        /**
-         * Creates a new conflict context.
-         * 
-         * @param root The root node of the dependency graph, must not be {@code null}.
-         * @param conflictId The conflict id for the set of conflicting dependencies in this context, must not be
-         *            {@code null}.
-         * @param conflictIds The mapping from dependency node to conflict id, must not be {@code null}.
-         * @param items The conflict items in this context, must not be {@code null}.
-         * This class is not intended to be instantiated by clients in production code, the constructor may
-         *              change without notice and only exists to enable unit testing.
-         */
-        public ConflictContext( DependencyNode root, Object conflictId, Map<DependencyNode, Object> conflictIds,
-                                Collection<ConflictItem> items )
-        {
-            this( root, conflictIds, items );
-            this.conflictId = conflictId;
-        }
-
-        /**
-         * Gets the root node of the dependency graph being transformed.
-         * 
-         * @return The root node of the dependeny graph, never {@code null}.
-         */
-        public DependencyNode getRoot()
-        {
-            return root;
-        }
-
-        /**
-         * Determines whether the specified dependency node belongs to this conflict context.
-         * 
-         * @param node The dependency node to check, must not be {@code null}.
-         * @return {@code true} if the given node belongs to this conflict context, {@code false} otherwise.
-         */
-        public boolean isIncluded( DependencyNode node )
-        {
-            return conflictId.equals( conflictIds.get( node ) );
-        }
-
-        /**
-         * Gets the collection of conflict items in this context.
-         * 
-         * @return The (read-only) collection of conflict items in this context, never {@code null}.
-         */
-        public Collection<ConflictItem> getItems()
-        {
-            return items;
-        }
-
-        /**
-         * Gets the conflict item which has been selected as the winner among the conflicting dependencies.
-         * 
-         * @return The winning conflict item or {@code null} if not set yet.
-         */
-        public ConflictItem getWinner()
-        {
-            return winner;
-        }
-
-        /**
-         * Sets the conflict item which has been selected as the winner among the conflicting dependencies.
-         * 
-         * @param winner The winning conflict item, may be {@code null}.
-         */
-        public void setWinner( ConflictItem winner )
-        {
-            this.winner = winner;
-        }
-
-        /**
-         * Gets the effective scope of the winning dependency.
-         * 
-         * @return The effective scope of the winning dependency or {@code null} if none.
-         */
-        public String getScope()
-        {
-            return scope;
-        }
-
-        /**
-         * Sets the effective scope of the winning dependency.
-         * 
-         * @param scope The effective scope, may be {@code null}.
-         */
-        public void setScope( String scope )
-        {
-            this.scope = scope;
-        }
-
-        /**
-         * Gets the effective optional flag of the winning dependency.
-         * 
-         * @return The effective optional flag or {@code null} if none.
-         */
-        public Boolean getOptional()
-        {
-            return optional;
-        }
-
-        /**
-         * Sets the effective optional flag of the winning dependency.
-         * 
-         * @param optional The effective optional flag, may be {@code null}.
-         */
-        public void setOptional( Boolean optional )
-        {
-            this.optional = optional;
-        }
-
-        @Override
-        public String toString()
-        {
-            return winner + " @ " + scope + " < " + items;
-        }
-
-    }
-
-    /**
-     * An extension point of {@link ConflictResolver} that determines the winner among conflicting dependencies. The
-     * winning node (and its children) will be retained in the dependency graph, the other nodes will get removed. The
-     * version selector does not need to deal with potential scope conflicts, these will be addressed afterwards by the
-     * {@link ScopeSelector}. Implementations must be stateless.
-     */
-    public abstract static class VersionSelector
-    {
-
-        /**
-         * Retrieves the version selector for use during the specified graph transformation. The conflict resolver calls
-         * this method once per
-         * {@link ConflictResolver#transformGraph(DependencyNode, DependencyGraphTransformationContext)} invocation to
-         * allow implementations to prepare any auxiliary data that is needed for their operation. Given that
-         * implementations need to be stateless, a new instance needs to be returned to hold such auxiliary data. The
-         * default implementation simply returns the current instance which is appropriate for implementations which do
-         * not require auxiliary data.
-         * 
-         * @param root The root node of the (possibly cyclic!) graph to transform, must not be {@code null}.
-         * @param context The graph transformation context, must not be {@code null}.
-         * @return The scope deriver to use for the given graph transformation, never {@code null}.
-         * @throws RepositoryException If the instance could not be retrieved.
-         */
-        public VersionSelector getInstance( DependencyNode root, DependencyGraphTransformationContext context )
-            throws RepositoryException
-        {
-            return this;
-        }
-
-        /**
-         * Determines the winning node among conflicting dependencies. Implementations will usually iterate
-         * {@link ConflictContext#getItems()}, inspect {@link ConflictItem#getNode()} and eventually call
-         * {@link ConflictContext#setWinner(ConflictResolver.ConflictItem)} to deliver the winner. Failure to select a
-         * winner will automatically fail the entire conflict resolution.
-         * 
-         * @param context The conflict context, must not be {@code null}.
-         * @throws RepositoryException If the version selection failed.
-         */
-        public abstract void selectVersion( ConflictContext context )
-            throws RepositoryException;
-
-    }
-
-    /**
-     * An extension point of {@link ConflictResolver} that determines the effective scope of a dependency from a
-     * potentially conflicting set of {@link ScopeDeriver derived scopes}. The scope selector gets invoked after the
-     * {@link VersionSelector} has picked the winning node. Implementations must be stateless.
-     */
-    public abstract static class ScopeSelector
-    {
-
-        /**
-         * Retrieves the scope selector for use during the specified graph transformation. The conflict resolver calls
-         * this method once per
-         * {@link ConflictResolver#transformGraph(DependencyNode, DependencyGraphTransformationContext)} invocation to
-         * allow implementations to prepare any auxiliary data that is needed for their operation. Given that
-         * implementations need to be stateless, a new instance needs to be returned to hold such auxiliary data. The
-         * default implementation simply returns the current instance which is appropriate for implementations which do
-         * not require auxiliary data.
-         * 
-         * @param root The root node of the (possibly cyclic!) graph to transform, must not be {@code null}.
-         * @param context The graph transformation context, must not be {@code null}.
-         * @return The scope selector to use for the given graph transformation, never {@code null}.
-         * @throws RepositoryException If the instance could not be retrieved.
-         */
-        public ScopeSelector getInstance( DependencyNode root, DependencyGraphTransformationContext context )
-            throws RepositoryException
-        {
-            return this;
-        }
-
-        /**
-         * Determines the effective scope of the dependency given by {@link ConflictContext#getWinner()}.
-         * Implementations will usually iterate {@link ConflictContext#getItems()}, inspect
-         * {@link ConflictItem#getScopes()} and eventually call {@link ConflictContext#setScope(String)} to deliver the
-         * effective scope.
-         * 
-         * @param context The conflict context, must not be {@code null}.
-         * @throws RepositoryException If the scope selection failed.
-         */
-        public abstract void selectScope( ConflictContext context )
-            throws RepositoryException;
-
-    }
-
-    /**
-     * An extension point of {@link ConflictResolver} that determines the scope of a dependency in relation to the scope
-     * of its parent. Implementations must be stateless.
-     */
-    public abstract static class ScopeDeriver
-    {
-
-        /**
-         * Retrieves the scope deriver for use during the specified graph transformation. The conflict resolver calls
-         * this method once per
-         * {@link ConflictResolver#transformGraph(DependencyNode, DependencyGraphTransformationContext)} invocation to
-         * allow implementations to prepare any auxiliary data that is needed for their operation. Given that
-         * implementations need to be stateless, a new instance needs to be returned to hold such auxiliary data. The
-         * default implementation simply returns the current instance which is appropriate for implementations which do
-         * not require auxiliary data.
-         * 
-         * @param root The root node of the (possibly cyclic!) graph to transform, must not be {@code null}.
-         * @param context The graph transformation context, must not be {@code null}.
-         * @return The scope deriver to use for the given graph transformation, never {@code null}.
-         * @throws RepositoryException If the instance could not be retrieved.
-         */
-        public ScopeDeriver getInstance( DependencyNode root, DependencyGraphTransformationContext context )
-            throws RepositoryException
-        {
-            return this;
-        }
-
-        /**
-         * Determines the scope of a dependency in relation to the scope of its parent. Implementors need to call
-         * {@link ScopeContext#setDerivedScope(String)} to deliver the result of their calculation. If said method is
-         * not invoked, the conflict resolver will assume the scope of the child dependency remains unchanged.
-         * 
-         * @param context The scope context, must not be {@code null}.
-         * @throws RepositoryException If the scope deriviation failed.
-         */
-        public abstract void deriveScope( ScopeContext context )
-            throws RepositoryException;
-
-    }
-
-    /**
-     * An extension point of {@link ConflictResolver} that determines the effective optional flag of a dependency from a
-     * potentially conflicting set of derived optionalities. The optionality selector gets invoked after the
-     * {@link VersionSelector} has picked the winning node. Implementations must be stateless.
-     */
-    public abstract static class OptionalitySelector
-    {
-
-        /**
-         * Retrieves the optionality selector for use during the specified graph transformation. The conflict resolver
-         * calls this method once per
-         * {@link ConflictResolver#transformGraph(DependencyNode, DependencyGraphTransformationContext)} invocation to
-         * allow implementations to prepare any auxiliary data that is needed for their operation. Given that
-         * implementations need to be stateless, a new instance needs to be returned to hold such auxiliary data. The
-         * default implementation simply returns the current instance which is appropriate for implementations which do
-         * not require auxiliary data.
-         * 
-         * @param root The root node of the (possibly cyclic!) graph to transform, must not be {@code null}.
-         * @param context The graph transformation context, must not be {@code null}.
-         * @return The optionality selector to use for the given graph transformation, never {@code null}.
-         * @throws RepositoryException If the instance could not be retrieved.
-         */
-        public OptionalitySelector getInstance( DependencyNode root, DependencyGraphTransformationContext context )
-            throws RepositoryException
-        {
-            return this;
-        }
-
-        /**
-         * Determines the effective optional flag of the dependency given by {@link ConflictContext#getWinner()}.
-         * Implementations will usually iterate {@link ConflictContext#getItems()}, inspect
-         * {@link ConflictItem#getOptionalities()} and eventually call {@link ConflictContext#setOptional(Boolean)} to
-         * deliver the effective optional flag.
-         * 
-         * @param context The conflict context, must not be {@code null}.
-         * @throws RepositoryException If the optionality selection failed.
-         */
-        public abstract void selectOptionality( ConflictContext context )
-            throws RepositoryException;
-
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java
deleted file mode 100644
index 2808595..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.Collection;
-import java.util.Comparator;
-import java.util.TreeSet;
-
-import org.sonatype.aether.artifact.Artifact;
-import org.sonatype.aether.collection.DependencyCollectionContext;
-import org.sonatype.aether.collection.DependencySelector;
-import org.sonatype.aether.graph.Dependency;
-import org.sonatype.aether.graph.Exclusion;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public class ExclusionDependencySelector
-    implements DependencySelector
-{
-
-    // sorted and dupe-free array, faster to iterate than LinkedHashSet
-    private final Exclusion[] exclusions;
-
-    private int hashCode;
-
-    /**
-     * Creates a new selector without any exclusions.
-     */
-    public ExclusionDependencySelector()
-    {
-        this.exclusions = new Exclusion[0];
-    }
-
-    /**
-     * Creates a new selector with the specified exclusions.
-     * 
-     * @param exclusions The exclusions, may be {@code null}.
-     */
-    public ExclusionDependencySelector( Collection<Exclusion> exclusions )
-    {
-        if ( exclusions != null && !exclusions.isEmpty() )
-        {
-            TreeSet<Exclusion> sorted = new TreeSet<>( ExclusionComparator.INSTANCE );
-            sorted.addAll( exclusions );
-            this.exclusions = sorted.toArray( new Exclusion[0] );
-        }
-        else
-        {
-            this.exclusions = new Exclusion[0];
-        }
-    }
-
-    private ExclusionDependencySelector( Exclusion[] exclusions )
-    {
-        this.exclusions = exclusions;
-    }
-
-    public boolean selectDependency( Dependency dependency )
-    {
-        Artifact artifact = dependency.getArtifact();
-        for ( Exclusion exclusion : exclusions )
-        {
-            if ( matches( exclusion, artifact ) )
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean matches( Exclusion exclusion, Artifact artifact )
-    {
-        if ( !matches( exclusion.getArtifactId(), artifact.getArtifactId() ) )
-        {
-            return false;
-        }
-        if ( !matches( exclusion.getGroupId(), artifact.getGroupId() ) )
-        {
-            return false;
-        }
-        if ( !matches( exclusion.getExtension(), artifact.getExtension() ) )
-        {
-            return false;
-        }
-        if ( !matches( exclusion.getClassifier(), artifact.getClassifier() ) )
-        {
-            return false;
-        }
-        return true;
-    }
-
-    private boolean matches( String pattern, String value )
-    {
-        return "*".equals( pattern ) || pattern.equals( value );
-    }
-
-    public DependencySelector deriveChildSelector( DependencyCollectionContext context )
-    {
-        Dependency dependency = context.getDependency();
-        Collection<Exclusion> exclusions = ( dependency != null ) ? dependency.getExclusions() : null;
-        if ( exclusions == null || exclusions.isEmpty() )
-        {
-            return this;
-        }
-
-        Exclusion[] merged = this.exclusions;
-        int count = merged.length;
-        for ( Exclusion exclusion : exclusions )
-        {
-            int index = Arrays.binarySearch( merged, exclusion, ExclusionComparator.INSTANCE );
-            if ( index < 0 )
-            {
-                index = -( index + 1 );
-                if ( count >= merged.length )
-                {
-                    Exclusion[] tmp = new Exclusion[merged.length + exclusions.size()];
-                    System.arraycopy( merged, 0, tmp, 0, index );
-                    tmp[index] = exclusion;
-                    System.arraycopy( merged, index, tmp, index + 1, count - index );
-                    merged = tmp;
-                }
-                else
-                {
-                    System.arraycopy( merged, index, merged, index + 1, count - index );
-                    merged[index] = exclusion;
-                }
-                count++;
-            }
-        }
-        if ( merged == this.exclusions )
-        {
-            return this;
-        }
-        if ( merged.length != count )
-        {
-            Exclusion[] tmp = new Exclusion[count];
-            System.arraycopy( merged, 0, tmp, 0, count );
-            merged = tmp;
-        }
-
-        return new ExclusionDependencySelector( merged );
-    }
-
-    @Override
-    public boolean equals( Object obj )
-    {
-        if ( this == obj )
-        {
-            return true;
-        }
-        else if ( null == obj || !getClass().equals( obj.getClass() ) )
-        {
-            return false;
-        }
-
-        ExclusionDependencySelector that = (ExclusionDependencySelector) obj;
-        return Arrays.equals( exclusions, that.exclusions );
-    }
-
-    @Override
-    public int hashCode()
-    {
-        if ( hashCode == 0 )
-        {
-            int hash = getClass().hashCode();
-            hash = hash * 31 + Arrays.hashCode( exclusions );
-            hashCode = hash;
-        }
-        return hashCode;
-    }
-
-    private static class ExclusionComparator
-        implements Comparator<Exclusion>
-    {
-
-        static final ExclusionComparator INSTANCE = new ExclusionComparator();
-
-        public int compare( Exclusion e1, Exclusion e2 )
-        {
-            if ( e1 == null )
-            {
-                return ( e2 == null ) ? 0 : 1;
-            }
-            else if ( e2 == null )
-            {
-                return -1;
-            }
-            int rel = e1.getArtifactId().compareTo( e2.getArtifactId() );
-            if ( rel == 0 )
-            {
-                rel = e1.getGroupId().compareTo( e2.getGroupId() );
-                if ( rel == 0 )
-                {
-                    rel = e1.getExtension().compareTo( e2.getExtension() );
-                    if ( rel == 0 )
-                    {
-                        rel = e1.getClassifier().compareTo( e2.getClassifier() );
-                    }
-                }
-            }
-            return rel;
-        }
-
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java
deleted file mode 100644
index d35abf0..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.graph.internal.maven30.ConflictResolver.ScopeContext;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ScopeDeriver;
-import org.sonatype.aether.RepositoryException;
-import org.sonatype.aether.util.artifact.JavaScopes;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public class JavaScopeDeriver
-    extends ScopeDeriver
-{
-
-    @Override
-    public void deriveScope( ScopeContext context )
-        throws RepositoryException
-    {
-        context.setDerivedScope( getDerivedScope( context.getParentScope(), context.getChildScope() ) );
-    }
-
-    private String getDerivedScope( String parentScope, String childScope )
-    {
-        String derivedScope;
-
-        if ( JavaScopes.SYSTEM.equals( childScope ) || JavaScopes.TEST.equals( childScope ) )
-        {
-            derivedScope = childScope;
-        }
-        else if ( parentScope == null || parentScope.length() <= 0 || JavaScopes.COMPILE.equals( parentScope ) )
-        {
-            derivedScope = childScope;
-        }
-        else if ( JavaScopes.TEST.equals( parentScope ) || JavaScopes.RUNTIME.equals( parentScope ) )
-        {
-            derivedScope = parentScope;
-        }
-        else if ( JavaScopes.SYSTEM.equals( parentScope ) || JavaScopes.PROVIDED.equals( parentScope ) )
-        {
-            derivedScope = JavaScopes.PROVIDED;
-        }
-        else
-        {
-            derivedScope = JavaScopes.RUNTIME;
-        }
-
-        return derivedScope;
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java
deleted file mode 100644
index 1950a92..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictContext;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictItem;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ScopeSelector;
-import org.sonatype.aether.RepositoryException;
-import org.sonatype.aether.util.artifact.JavaScopes;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public final class JavaScopeSelector
-    extends ScopeSelector
-{
-
-    @Override
-    public void selectScope( ConflictContext context )
-        throws RepositoryException
-    {
-        String scope = context.getWinner().getDependency().getScope();
-        if ( !JavaScopes.SYSTEM.equals( scope ) )
-        {
-            scope = chooseEffectiveScope( context.getItems() );
-        }
-        context.setScope( scope );
-    }
-
-    private String chooseEffectiveScope( Collection<ConflictItem> items )
-    {
-        Set<String> scopes = new HashSet<>();
-        for ( ConflictItem item : items )
-        {
-            if ( item.getDepth() <= 1 )
-            {
-                return item.getDependency().getScope();
-            }
-            scopes.addAll( item.getScopes() );
-        }
-        return chooseEffectiveScope( scopes );
-    }
-
-    private String chooseEffectiveScope( Set<String> scopes )
-    {
-        if ( scopes.size() > 1 )
-        {
-            scopes.remove( JavaScopes.SYSTEM );
-        }
-
-        String effectiveScope = "";
-
-        if ( scopes.size() == 1 )
-        {
-            effectiveScope = scopes.iterator().next();
-        }
-        else if ( scopes.contains( JavaScopes.COMPILE ) )
-        {
-            effectiveScope = JavaScopes.COMPILE;
-        }
-        else if ( scopes.contains( JavaScopes.RUNTIME ) )
-        {
-            effectiveScope = JavaScopes.RUNTIME;
-        }
-        else if ( scopes.contains( JavaScopes.PROVIDED ) )
-        {
-            effectiveScope = JavaScopes.PROVIDED;
-        }
-        else if ( scopes.contains( JavaScopes.TEST ) )
-        {
-            effectiveScope = JavaScopes.TEST;
-        }
-
-        return effectiveScope;
-    }
-
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java
deleted file mode 100644
index 9373b90..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.sonatype.aether.collection.DependencyCollectionContext;
-import org.sonatype.aether.collection.DependencySelector;
-import org.sonatype.aether.graph.Dependency;
-
-/**
- * A dependency selector that excludes dependencies of an specific Scope which occur beyond level one of the dependency
- * graph.
- * 
- * @see Dependency#getScope()
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public class Maven3DirectScopeDependencySelector
-    implements DependencySelector
-{
-
-    private final String scope;
-
-    private final int depth;
-
-    public Maven3DirectScopeDependencySelector( String scope )
-    {
-        this( scope, 0 );
-    }
-
-    private Maven3DirectScopeDependencySelector( String scope, int depth )
-    {
-        if ( scope == null )
-        {
-            throw new IllegalArgumentException( "scope is null!" );
-        }
-        this.scope = scope;
-        this.depth = depth;
-    }
-
-    /**
-     * Decides whether the specified dependency should be included in the dependency graph.
-     * 
-     * @param dependency The dependency to check, must not be {@code null}.
-     * @return {@code false} if the dependency should be excluded from the children of the current node, {@code true}
-     *         otherwise.
-     */
-    @Override
-    public boolean selectDependency( Dependency dependency )
-    {
-        return depth < 2 || !scope.equals( dependency.getScope() );
-    }
-
-    /**
-     * Derives a dependency selector for the specified collection context. When calculating the child selector,
-     * implementors are strongly advised to simply return the current instance if nothing changed to help save memory.
-     * 
-     * @param context The dependency collection context, must not be {@code null}.
-     * @return The dependency selector for the target node, must not be {@code null}.
-     */
-    @Override
-    public DependencySelector deriveChildSelector( DependencyCollectionContext context )
-    {
-        if ( depth >= 2 )
-        {
-            return this;
-        }
-
-        return new Maven3DirectScopeDependencySelector( scope, depth + 1 );
-    }
-
-    @Override
-    public int hashCode()
-    {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + depth;
-        result = prime * result + ( ( scope == null ) ? 0 : scope.hashCode() );
-        return result;
-    }
-
-    @Override
-    public boolean equals( Object obj )
-    {
-        if ( this == obj )
-        {
-            return true;
-        }
-        if ( obj == null )
-        {
-            return false;
-        }
-        if ( getClass() != obj.getClass() )
-        {
-            return false;
-        }
-        Maven3DirectScopeDependencySelector other = (Maven3DirectScopeDependencySelector) obj;
-        if ( depth != other.depth )
-        {
-            return false;
-        }
-        if ( scope == null )
-        {
-            if ( other.scope != null )
-            {
-                return false;
-            }
-        }
-        else if ( !scope.equals( other.scope ) )
-        {
-            return false;
-        }
-        return true;
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java
deleted file mode 100644
index 31af5b8..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.HashSet;
-import java.util.Iterator;
-
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictContext;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictItem;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.VersionSelector;
-import org.sonatype.aether.RepositoryException;
-import org.sonatype.aether.collection.UnsolvableVersionConflictException;
-import org.sonatype.aether.graph.DependencyFilter;
-import org.sonatype.aether.graph.DependencyNode;
-import org.sonatype.aether.util.graph.PathRecordingDependencyVisitor;
-import org.sonatype.aether.version.Version;
-import org.sonatype.aether.version.VersionConstraint;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public final class NearestVersionSelector
-    extends VersionSelector
-{
-
-    @Override
-    public void selectVersion( ConflictContext context )
-        throws RepositoryException
-    {
-        ConflictGroup group = new ConflictGroup();
-        for ( ConflictItem item : context.getItems() )
-        {
-            DependencyNode node = item.getNode();
-            VersionConstraint constraint = node.getVersionConstraint();
-
-            boolean backtrack = false;
-            boolean hardConstraint = !constraint.getRanges().isEmpty();
-//            boolean hardConstraint = constraint.getRange() != null;
-
-            if ( hardConstraint )
-            {
-                if ( group.constraints.add( constraint ) )
-                {
-                    if ( group.winner != null && !constraint.containsVersion( group.winner.getNode().getVersion() ) )
-                    {
-                        backtrack = true;
-                    }
-                }
-            }
-
-            if ( isAcceptable( group, node.getVersion() ) )
-            {
-                group.candidates.add( item );
-
-                if ( backtrack )
-                {
-                    backtrack( group, context );
-                }
-                else if ( group.winner == null || isNearer( item, group.winner ) )
-                {
-                    group.winner = item;
-                }
-            }
-            else if ( backtrack )
-            {
-                backtrack( group, context );
-            }
-        }
-        context.setWinner( group.winner );
-    }
-
-    private void backtrack( ConflictGroup group, ConflictContext context )
-        throws UnsolvableVersionConflictException
-    {
-        group.winner = null;
-
-        for ( Iterator<ConflictItem> it = group.candidates.iterator(); it.hasNext(); )
-        {
-            ConflictItem candidate = it.next();
-
-            if ( !isAcceptable( group, candidate.getNode().getVersion() ) )
-            {
-                it.remove();
-            }
-            else if ( group.winner == null || isNearer( candidate, group.winner ) )
-            {
-                group.winner = candidate;
-            }
-        }
-
-        if ( group.winner == null )
-        {
-            throw newFailure( context );
-        }
-    }
-
-    private boolean isAcceptable( ConflictGroup group, Version version )
-    {
-        for ( VersionConstraint constraint : group.constraints )
-        {
-            if ( !constraint.containsVersion( version ) )
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isNearer( ConflictItem item1, ConflictItem item2 )
-    {
-        if ( item1.isSibling( item2 ) )
-        {
-            return item1.getNode().getVersion().compareTo( item2.getNode().getVersion() ) > 0;
-        }
-        else
-        {
-            return item1.getDepth() < item2.getDepth();
-        }
-    }
-
-    private UnsolvableVersionConflictException newFailure( final ConflictContext context )
-    {
-        DependencyFilter filter = ( node, parents ) -> context.isIncluded( node );
-        PathRecordingDependencyVisitor visitor = new PathRecordingDependencyVisitor( filter );
-        context.getRoot().accept( visitor );
-        return new UnsolvableVersionConflictException( visitor.getPaths(), context.conflictId );
-//        return new UnsolvableVersionConflictException( visitor.getPaths() );
-    }
-
-    static final class ConflictGroup
-    {
-
-        final Collection<VersionConstraint> constraints;
-
-        final Collection<ConflictItem> candidates;
-
-        ConflictItem winner;
-
-        ConflictGroup()
-        {
-            constraints = new HashSet<>();
-            candidates = new ArrayList<>( 64 );
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.valueOf( winner );
-        }
-
-    }
-
-
-}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java
deleted file mode 100644
index d63df0b..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.Collection;
-
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictContext;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictItem;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.OptionalitySelector;
-import org.sonatype.aether.RepositoryException;
-
-/**
- * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
- * 
- * @author Gabriel Belingueres
- * @since 3.1.0
- */
-public class SimpleOptionalitySelector
-    extends OptionalitySelector
-{
-
-    @Override
-    public void selectOptionality( ConflictContext context )
-        throws RepositoryException
-    {
-        boolean optional = chooseEffectiveOptionality( context.getItems() );
-        context.setOptional( optional );
-    }
-
-    private boolean chooseEffectiveOptionality( Collection<ConflictItem> items )
-    {
-        boolean optional = true;
-        for ( ConflictItem item : items )
-        {
-            if ( item.getDepth() <= 1 )
-            {
-                return item.getDependency().isOptional();
-            }
-            if ( ( item.getOptionalities() & ConflictItem.OPTIONAL_FALSE ) != 0 )
-            {
-                optional = false;
-            }
-        }
-        return optional;
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/VerboseJavaScopeSelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/VerboseJavaScopeSelector.java
deleted file mode 100644
index 85b660d..0000000
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/VerboseJavaScopeSelector.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.apache.maven.shared.dependency.graph.internal.maven30;
-
-/*
- * 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.Comparator;
-import java.util.List;
-
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ConflictContext;
-import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver.ScopeSelector;
-import org.sonatype.aether.RepositoryException;
-
-/**
- * A JavaScopeSelector that keeps track of reduced scopes
- * 
- */
-public class VerboseJavaScopeSelector extends ScopeSelector
-{
-    public static final String REDUCED_SCOPE = "REDUCED_SCOPE";
-    
-    private final ScopeSelector scopeSelector = new JavaScopeSelector();
-
-    @Override
-    public void selectScope( ConflictContext context )
-        throws RepositoryException
-    {
-        scopeSelector.selectScope( context );
-        
-        context.getItems().stream()
-            .flatMap( i -> i.getScopes().stream() )
-            .distinct()
-            .max( new ScopeComparator() )
-            .filter( s -> s != context.getScope() )
-            .ifPresent( s -> context.getWinner().getNode().setData( REDUCED_SCOPE, s ) );
-    }
-    
-    static class ScopeComparator implements Comparator<String>
-    {
-        List<String> orderedScopes = Arrays.asList( "compile", "runtime", "provided", "test" );
-
-        @Override
-        public int compare( String lhs, String rhs )
-        {
-            return orderedScopes.indexOf( rhs ) - orderedScopes.indexOf( lhs );
-        }
-    }    
-}