diff --git a/.gitignore b/.gitignore
index e69de29..8315d67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1,12 @@
+/results_*
+/*.src.rpm
+
+/enforcer-1.0-beta-2.tar.xz
+/enforcer-1.0.tar.xz
+/enforcer-1.0.1-source-release.zip
+/enforcer-1.2-source-release.zip
+/enforcer-1.3.1-source-release.zip
+/enforcer-1.4-source-release.zip
+/enforcer-1.4.1-source-release.zip
+/enforcer-3.0.0-M2-source-release.zip
+/enforcer-3.0.0-M3-source-release.zip
diff --git a/0001-Port-to-Maven-3-API.patch b/0001-Port-to-Maven-3-API.patch
new file mode 100644
index 0000000..45538f5
--- /dev/null
+++ b/0001-Port-to-Maven-3-API.patch
@@ -0,0 +1,550 @@
+diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml
+index 187d38b..076c84a 100644
+--- a/enforcer-rules/pom.xml
++++ b/enforcer-rules/pom.xml
+@@ -43,12 +43,16 @@
+
+
+ org.apache.maven
+- maven-core
++ maven-compat
+
+
+ org.apache.maven.shared
+ maven-common-artifact-filters
+
++
++ org.apache.maven.shared
++ maven-artifact-transfer
++
+
+ org.codehaus.plexus
+ plexus-utils
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java
+index 2888a61..cfd5338 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java
+@@ -23,8 +23,10 @@ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
++import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.plugins.enforcer.utils.ArtifactUtils;
+ import org.apache.maven.project.MavenProject;
++import org.apache.maven.project.ProjectBuildingRequest;
+ import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
+ import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
+ import org.apache.maven.shared.dependency.graph.DependencyNode;
+@@ -53,10 +55,11 @@ public abstract class AbstractBanDependencies
+ {
+
+ // get the project
+- MavenProject project = null;
++ ProjectBuildingRequest projectBuildingRequest = null;
+ try
+ {
+- project = (MavenProject) helper.evaluate( "${project}" );
++ projectBuildingRequest = new DefaultProjectBuildingRequest( (ProjectBuildingRequest) helper.evaluate( "${session.projectBuildingRequest}" ) );
++ projectBuildingRequest.setProject( (MavenProject) helper.evaluate( "${project}" ) );
+ }
+ catch ( ExpressionEvaluationException eee )
+ {
+@@ -83,7 +86,7 @@ public abstract class AbstractBanDependencies
+ }
+
+ // get the correct list of dependencies
+- Set dependencies = getDependenciesToCheck( project );
++ Set dependencies = getDependenciesToCheck( projectBuildingRequest );
+
+ // look for banned dependencies
+ Set foundExcludes = checkDependencies( dependencies, helper.getLog() );
+@@ -114,12 +117,12 @@ public abstract class AbstractBanDependencies
+ return "Found Banned Dependency: " + artifact.getId() + System.lineSeparator();
+ }
+
+- protected Set getDependenciesToCheck( MavenProject project )
++ protected Set getDependenciesToCheck( ProjectBuildingRequest projectBuildingRequest )
+ {
+ Set dependencies = null;
+ try
+ {
+- DependencyNode node = graphBuilder.buildDependencyGraph( project, null );
++ DependencyNode node = graphBuilder.buildDependencyGraph( projectBuildingRequest, null );
+ if ( searchTransitive )
+ {
+ dependencies = ArtifactUtils.getAllDescendants( node );
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java
+index 6e1dcd4..b84f421 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java
+@@ -27,7 +27,9 @@ import org.apache.maven.enforcer.rule.api.EnforcerRule;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher;
++import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
++import org.apache.maven.project.ProjectBuildingRequest;
+ import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
+ import org.apache.maven.shared.dependency.graph.DependencyNode;
+ import org.apache.maven.shared.dependency.graph.internal.DefaultDependencyGraphBuilder;
+@@ -157,8 +159,9 @@ public class BanTransitiveDependencies
+
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- rootNode = createDependencyGraphBuilder().buildDependencyGraph( project, null );
++ ProjectBuildingRequest projectBuildingRequest = new DefaultProjectBuildingRequest( (ProjectBuildingRequest) helper.evaluate( "${session.projectBuildingRequest}" ) );
++ projectBuildingRequest.setProject( (MavenProject) helper.evaluate( "${project}" ) );
++ rootNode = createDependencyGraphBuilder().buildDependencyGraph( projectBuildingRequest, null );
+ }
+ catch ( Exception e )
+ {
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java
+index 03201fd..35bcd57 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java
+@@ -23,6 +23,7 @@ import java.util.Set;
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.project.MavenProject;
++import org.apache.maven.project.ProjectBuildingRequest;
+
+ /**
+ * This rule checks that lists of plugins are not included.
+@@ -33,9 +34,9 @@ public class BannedPlugins
+ extends BannedDependencies
+ {
+ @Override
+- protected Set getDependenciesToCheck( MavenProject project )
++ protected Set getDependenciesToCheck( ProjectBuildingRequest projectBuildingRequest )
+ {
+- return project.getPluginArtifacts();
++ return projectBuildingRequest.getProject().getPluginArtifacts();
+ }
+
+ @Override
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java
+index 684f984..4795634 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java
+@@ -24,20 +24,19 @@ import java.util.Collections;
+ import java.util.List;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+ import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.enforcer.rule.api.EnforcerRule;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap;
++import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.apache.maven.project.ProjectBuildingRequest;
++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.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+@@ -74,17 +73,13 @@ public class DependencyConvergence
+ {
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
++ ProjectBuildingRequest projectBuildingRequest = new DefaultProjectBuildingRequest( (ProjectBuildingRequest) helper.evaluate( "${session.projectBuildingRequest}" ) );
++ projectBuildingRequest.setProject( (MavenProject) helper.evaluate( "${project}" ) );
++ DependencyGraphBuilder dependencyGraphBuilder = (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
+ ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node = dependencyTreeBuilder.buildDependencyTree( project, repository, factory,
+- metadataSource, filter, collector );
++ projectBuildingRequest.setLocalRepository( repository );
++ DependencyNode node = dependencyGraphBuilder.buildDependencyGraph( projectBuildingRequest, filter );
+ return node;
+ }
+ catch ( ExpressionEvaluationException e )
+@@ -95,9 +90,9 @@ public class DependencyConvergence
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+- throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
++ throw new EnforcerRuleException( "Could not build dependency graph " + e.getLocalizedMessage(), e );
+ }
+ }
+
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
+index 34f0f20..1323b11 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
+@@ -36,7 +36,6 @@ import org.apache.maven.artifact.factory.ArtifactFactory;
+ import org.apache.maven.artifact.repository.ArtifactRepository;
+ import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+ import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+-import org.apache.maven.artifact.resolver.ArtifactResolver;
+ import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+ import org.apache.maven.artifact.versioning.VersionRange;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+@@ -62,8 +61,12 @@ import org.apache.maven.plugin.version.PluginVersionNotFoundException;
+ import org.apache.maven.plugin.version.PluginVersionResolutionException;
+ import org.apache.maven.plugins.enforcer.utils.EnforcerRuleUtils;
+ import org.apache.maven.plugins.enforcer.utils.PluginWrapper;
++import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
++import org.apache.maven.project.ProjectBuildingRequest;
+ import org.apache.maven.settings.Settings;
++import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
++import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.util.ReflectionUtils;
+@@ -166,12 +169,6 @@ public class RequirePluginVersions
+ /** The resolver. */
+ private ArtifactResolver resolver;
+
+- /** The local. */
+- private ArtifactRepository local;
+-
+- /** The remote repositories. */
+- private List remoteRepositories;
+-
+ /** The log. */
+ private Log log;
+
+@@ -205,8 +202,8 @@ public class RequirePluginVersions
+ pluginManager = (PluginManager) helper.getComponent( PluginManager.class );
+ factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+ resolver = (ArtifactResolver) helper.getComponent( ArtifactResolver.class );
+- local = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- remoteRepositories = project.getRemoteArtifactRepositories();
++ ProjectBuildingRequest projectBuildingRequest = new DefaultProjectBuildingRequest( (ProjectBuildingRequest) helper.evaluate( "${session.projectBuildingRequest}" ) );
++ projectBuildingRequest.setProject( project );
+
+ utils = new EnforcerRuleUtils( helper );
+
+@@ -254,7 +251,7 @@ public class RequirePluginVersions
+ // if anything was found, log it then append the optional message.
+ if ( !failures.isEmpty() )
+ {
+- handleMessagesToTheUser( project, failures );
++ handleMessagesToTheUser( projectBuildingRequest, failures );
+ }
+ }
+ catch ( ExpressionEvaluationException e )
+@@ -277,13 +274,9 @@ public class RequirePluginVersions
+ {
+ throw new EnforcerRuleException( e.getLocalizedMessage() );
+ }
+- catch ( ArtifactResolutionException e )
+- {
+- throw new EnforcerRuleException( e.getLocalizedMessage() );
+- }
+- catch ( ArtifactNotFoundException e )
++ catch ( ArtifactResolverException e )
+ {
+- throw new EnforcerRuleException( e.getLocalizedMessage() );
++ // What does this mean?
+ }
+ catch ( IOException e )
+ {
+@@ -299,7 +292,7 @@ public class RequirePluginVersions
+ }
+ }
+
+- private void handleMessagesToTheUser( MavenProject project, List failures )
++ private void handleMessagesToTheUser( ProjectBuildingRequest projectBuildingRequest, List failures )
+ throws EnforcerRuleException
+ {
+ StringBuilder newMsg = new StringBuilder();
+@@ -316,7 +309,7 @@ public class RequirePluginVersions
+ {
+ newMsg.append( ". \tThe version currently in use is " );
+
+- Plugin currentPlugin = findCurrentPlugin( plugin, project );
++ Plugin currentPlugin = findCurrentPlugin( plugin, projectBuildingRequest );
+
+ if ( currentPlugin != null )
+ {
+@@ -518,12 +511,12 @@ public class RequirePluginVersions
+ * @param project project to search
+ * @return matching plugin, null if not found.
+ */
+- protected Plugin findCurrentPlugin( Plugin plugin, MavenProject project )
++ protected Plugin findCurrentPlugin( Plugin plugin, ProjectBuildingRequest projectBuildingRequest )
+ {
+ Plugin found = null;
+ try
+ {
+- Model model = project.getModel();
++ Model model = projectBuildingRequest.getProject().getModel();
+ Map plugins = model.getBuild().getPluginsAsMap();
+ found = plugins.get( plugin.getKey() );
+ }
+@@ -534,7 +527,7 @@ public class RequirePluginVersions
+
+ if ( found == null )
+ {
+- found = resolvePlugin( plugin, project );
++ found = resolvePlugin( plugin, projectBuildingRequest );
+ }
+
+ return found;
+@@ -547,23 +540,18 @@ public class RequirePluginVersions
+ * @param project the project
+ * @return the plugin
+ */
+- protected Plugin resolvePlugin( Plugin plugin, MavenProject project )
++ protected Plugin resolvePlugin( Plugin plugin, ProjectBuildingRequest projectBuildingRequest )
+ {
+
+- List pluginRepositories = project.getPluginArtifactRepositories();
+ Artifact artifact = factory.createPluginArtifact( plugin.getGroupId(), plugin.getArtifactId(),
+ VersionRange.createFromVersion( "LATEST" ) );
+
+ try
+ {
+- this.resolver.resolve( artifact, pluginRepositories, this.local );
++ this.resolver.resolveArtifact( projectBuildingRequest, artifact );
+ plugin.setVersion( artifact.getVersion() );
+ }
+- catch ( ArtifactResolutionException e )
+- {
+- // What does this mean?
+- }
+- catch ( ArtifactNotFoundException e )
++ catch ( ArtifactResolverException e )
+ {
+ // What does this mean?
+ }
+@@ -1046,13 +1034,12 @@ public class RequirePluginVersions
+ *
+ * @param project the project
+ * @return the all plugin entries wrapped in a PluginWrapper Object
+- * @throws ArtifactResolutionException the artifact resolution exception
+- * @throws ArtifactNotFoundException the artifact not found exception
++ * @throws ArtifactResolverException the artifact resolution exception
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws XmlPullParserException the xml pull parser exception
+ */
+ protected List getAllPluginEntries( MavenProject project )
+- throws ArtifactResolutionException, ArtifactNotFoundException, IOException, XmlPullParserException
++ throws ArtifactResolverException, IOException, XmlPullParserException
+ {
+ List models = new ArrayList();
+
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 458554a..c48205f 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -26,10 +26,7 @@ import java.util.List;
+ import java.util.Map;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+ import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.artifact.versioning.ArtifactVersion;
+ import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+@@ -37,11 +34,13 @@ import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
++import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.project.ProjectBuildingRequest;
++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.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+@@ -105,18 +104,10 @@ public class RequireUpperBoundDeps
+ {
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
+- ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node =
+- dependencyTreeBuilder.buildDependencyTree( project, repository, factory, metadataSource, filter,
+- collector );
++ ProjectBuildingRequest projectBuildingRequest = new DefaultProjectBuildingRequest( (ProjectBuildingRequest) helper.evaluate( "${session.projectBuildingRequest}" ) );
++ projectBuildingRequest.setProject( (MavenProject) helper.evaluate( "${project}" ) );
++ DependencyGraphBuilder dependencyGraphBuilder = (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
++ DependencyNode node = dependencyGraphBuilder.buildDependencyGraph( projectBuildingRequest, null );
+ return node;
+ }
+ catch ( ExpressionEvaluationException e )
+@@ -127,7 +118,7 @@ public class RequireUpperBoundDeps
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+index b6213fa..2c2a645 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+@@ -26,8 +26,8 @@ import java.util.Map;
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.plugin.logging.Log;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+
+ /**
+ * @author Brian Fox
+@@ -132,4 +132,4 @@ public class DependencyVersionMap
+ }
+ return output;
+ }
+-}
+\ No newline at end of file
++}
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
+index c122e10..a9208f7 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
+@@ -23,12 +23,15 @@ import java.util.List;
+
+ import org.apache.maven.artifact.factory.ArtifactFactory;
+ import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactResolver;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.model.Plugin;
+ import org.apache.maven.model.ReportPlugin;
+ import org.apache.maven.plugin.logging.Log;
++import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
++import org.apache.maven.project.ProjectBuildingRequest;
++import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
++import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+@@ -46,42 +49,14 @@ public class EnforcerRuleUtils
+ /** The resolver. */
+ ArtifactResolver resolver;
+
+- /** The local. */
+- ArtifactRepository local;
+-
+- /** The remote repositories. */
+- List remoteRepositories;
+-
+ /** The log. */
+ Log log;
+
+ /** The project. */
+- MavenProject project;
++ ProjectBuildingRequest projectBuildingRequest;
+
+ private EnforcerRuleHelper helper;
+
+- /**
+- * Instantiates a new enforcer rule utils.
+- *
+- * @param theFactory the the factory
+- * @param theResolver the the resolver
+- * @param theLocal the the local
+- * @param theRemoteRepositories the the remote repositories
+- * @param project the project
+- * @param theLog the the log
+- */
+- public EnforcerRuleUtils( ArtifactFactory theFactory, ArtifactResolver theResolver, ArtifactRepository theLocal,
+- List theRemoteRepositories, MavenProject project, Log theLog )
+- {
+- super();
+- this.factory = theFactory;
+- this.resolver = theResolver;
+- this.local = theLocal;
+- this.remoteRepositories = theRemoteRepositories;
+- this.log = theLog;
+- this.project = project;
+- }
+-
+ /**
+ * Instantiates a new enforcer rule utils.
+ *
+@@ -97,9 +72,8 @@ public class EnforcerRuleUtils
+ {
+ factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+ resolver = (ArtifactResolver) helper.getComponent( ArtifactResolver.class );
+- local = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- project = (MavenProject) helper.evaluate( "${project}" );
+- remoteRepositories = project.getRemoteArtifactRepositories();
++ projectBuildingRequest = new DefaultProjectBuildingRequest( (ProjectBuildingRequest) helper.evaluate( "${session.projectBuildingRequest}" ) );
++ projectBuildingRequest.setProject( (MavenProject) helper.evaluate( "${project}" ) );
+ }
+ catch ( ComponentLookupException e )
+ {
+diff --git a/pom.xml b/pom.xml
+index 83306f1..79dd17f 100644
+--- a/pom.xml
++++ b/pom.xml
+@@ -63,7 +63,7 @@
+
+
+
+- 3.0
++ 3.3.1
+ enforcer-archives/enforcer-LATEST
+ 7
+
+@@ -139,16 +139,21 @@
+ commons-codec
+ 1.12
+
++
++ org.apache.maven.shared
++ maven-artifact-transfer
++ 3.0-SNAPSHOT
++
+
+ org.apache.maven.plugin-testing
+ maven-plugin-testing-harness
+- 2.1
++ 3.3.0
+ test
+
+
+ org.apache.maven.shared
+ maven-dependency-tree
+- 2.2
++ 3.0
+
+
+ org.apache.maven.resolver
diff --git a/0002-Port-to-artifact-transfer-0.11.0.patch b/0002-Port-to-artifact-transfer-0.11.0.patch
new file mode 100644
index 0000000..67b4bcc
--- /dev/null
+++ b/0002-Port-to-artifact-transfer-0.11.0.patch
@@ -0,0 +1,30 @@
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
+index f2e2cc7..c81de9d 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
+@@ -66,8 +66,8 @@ import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
+ import org.apache.maven.project.ProjectBuildingRequest;
+ import org.apache.maven.settings.Settings;
+-import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
+-import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
++import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
++import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.util.ReflectionUtils;
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
+index 3974a9e..d319e74 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
+@@ -30,8 +30,8 @@ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.project.DefaultProjectBuildingRequest;
+ import org.apache.maven.project.MavenProject;
+ import org.apache.maven.project.ProjectBuildingRequest;
+-import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
+-import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
++import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
++import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
diff --git a/maven-enforcer.spec b/maven-enforcer.spec
new file mode 100644
index 0000000..ba136cf
--- /dev/null
+++ b/maven-enforcer.spec
@@ -0,0 +1,247 @@
+Name: maven-enforcer
+Version: 3.0.0~M3
+Release: 3%{?dist}
+Summary: Maven Enforcer
+License: ASL 2.0
+
+%global upstream_version %(echo '%{version}' | tr '~' '-')
+
+URL: https://maven.apache.org/enforcer
+Source0: https://repo1.maven.org/maven2/org/apache/maven/enforcer/enforcer/%{upstream_version}/enforcer-%{upstream_version}-source-release.zip
+
+# TODO forward upstream
+# https://issues.apache.org/jira/browse/MENFORCER-267
+Patch0: 0001-Port-to-Maven-3-API.patch
+
+# port to maven-artifact-transfer 0.11.0
+Patch1: 0002-Port-to-artifact-transfer-0.11.0.patch
+
+BuildArch: noarch
+
+BuildRequires: maven-local
+BuildRequires: mvn(com.google.code.findbugs:jsr305)
+BuildRequires: mvn(commons-codec:commons-codec)
+BuildRequires: mvn(org.apache.commons:commons-lang3)
+BuildRequires: mvn(org.apache.maven.plugin-tools:maven-plugin-annotations)
+BuildRequires: mvn(org.apache.maven.plugins:maven-plugin-plugin)
+BuildRequires: mvn(org.apache.maven.resolver:maven-resolver-util)
+BuildRequires: mvn(org.apache.maven.shared:maven-artifact-transfer)
+BuildRequires: mvn(org.apache.maven.shared:maven-common-artifact-filters)
+BuildRequires: mvn(org.apache.maven.shared:maven-dependency-tree)
+BuildRequires: mvn(org.apache.maven:maven-artifact)
+BuildRequires: mvn(org.apache.maven:maven-compat)
+BuildRequires: mvn(org.apache.maven:maven-core)
+BuildRequires: mvn(org.apache.maven:maven-parent:pom:)
+BuildRequires: mvn(org.apache.maven:maven-plugin-api)
+BuildRequires: mvn(org.beanshell:bsh)
+BuildRequires: mvn(org.codehaus.plexus:plexus-container-default)
+BuildRequires: mvn(org.codehaus.plexus:plexus-utils)
+
+%description
+Enforcer is a build rule execution framework.
+
+%package javadoc
+Summary: Javadoc for %{name}
+
+%description javadoc
+API documentation for %{name}.
+
+%package api
+Summary: Enforcer API
+
+%description api
+This component provides the generic interfaces needed to
+implement custom rules for the maven-enforcer-plugin.
+
+%package rules
+Summary: Enforcer Rules
+
+%description rules
+This component contains the standard Enforcer Rules.
+
+%package plugin
+Summary: Enforcer Rules
+
+%description plugin
+This component contains the standard Enforcer Rules.
+
+
+%prep
+%setup -q -n enforcer-%{upstream_version}
+
+# Use Unix line endings
+find -name '*.java' -exec sed -i 's/\r//' {} \;
+find -name 'pom.xml' -exec sed -i 's/\r//' {} \;
+
+%patch0 -p1
+%patch1 -p1
+
+%pom_remove_plugin :maven-enforcer-plugin
+
+# Avoid dependency cycle
+%pom_xpath_inject pom:build/pom:pluginManagement/pom:plugins "
+
+ maven-enforcer-plugin
+ SYSTEM
+ "
+
+# Replace plexus-maven-plugin with plexus-component-metadata
+sed -e "s|plexus-maven-plugin|plexus-component-metadata|" \
+ -e "s|descriptor|generate-metadata|" \
+ -i enforcer-{api,rules}/pom.xml
+
+%build
+%mvn_build -s -f
+
+%install
+%mvn_install
+
+%files -f .mfiles-enforcer
+%doc LICENSE NOTICE
+
+%files api -f .mfiles-enforcer-api
+%doc LICENSE NOTICE
+
+%files rules -f .mfiles-enforcer-rules
+
+%files plugin -f .mfiles-maven-enforcer-plugin
+
+%files javadoc -f .mfiles-javadoc
+%doc LICENSE NOTICE
+
+%changelog
+* Tue Jul 28 2020 Fedora Release Engineering - 3.0.0~M3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Fri Jul 10 2020 Jiri Vanek - 3.0.0~M3-2
+- Rebuilt for JDK-11, see https://fedoraproject.org/wiki/Changes/Java11
+
+* Thu May 07 2020 Fabio Valentini - 3.0.0~M3-1
+- Update to version 3.0.0-M3.
+
+* Wed Jan 29 2020 Fedora Release Engineering - 3.0.0~M2-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Sun Nov 03 2019 Fabio Valentini - 3.0.0~M2-2
+- Port to maven-artifact-transfer 0.11.0.
+
+* Thu Aug 08 2019 Marian Koncek - 3.0.0~M2-1
+- Update to upstream verssion 3.0.0~M2
+
+* Thu Jul 25 2019 Fedora Release Engineering - 1.4.1-11
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Fri Feb 01 2019 Fedora Release Engineering - 1.4.1-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Fri Jul 13 2018 Fedora Release Engineering - 1.4.1-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Thu Feb 08 2018 Fedora Release Engineering - 1.4.1-8
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Thu Jan 25 2018 Mikolaj Izdebski - 1.4.1-7
+- Avoid dependency cycle during Maven build
+
+* Wed Jul 26 2017 Fedora Release Engineering - 1.4.1-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Fri Feb 10 2017 Fedora Release Engineering - 1.4.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Thu Feb 04 2016 Fedora Release Engineering - 1.4.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Mon Oct 12 2015 Mikolaj Izdebski - 1.4.1-3
+- Fix Maven 3 patch
+
+* Mon Oct 12 2015 Mikolaj Izdebski - 1.4.1-2
+- Port to Maven 3 API
+
+* Mon Aug 31 2015 Mikolaj Izdebski - 1.4.1-1
+- Update to upstream version 1.4.1
+
+* Wed Jun 17 2015 Fedora Release Engineering - 1.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Mon Feb 2 2015 Mikolaj Izdebski - 1.4-1
+- Update to upstream version 1.4
+
+* Tue Oct 14 2014 Mikolaj Izdebski - 1.3.1-4
+- Remove legacy Obsoletes/Provides for maven2 plugin
+
+* Mon Aug 4 2014 Mikolaj Izdebski - 1.3.1-3
+- Fix build-requires on parent POM
+
+* Sat Jun 07 2014 Fedora Release Engineering - 1.3.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Fri Aug 9 2013 Mikolaj Izdebski - 1.3.1-1
+- Update to upstream version 1.3.1
+
+* Sat Aug 03 2013 Fedora Release Engineering - 1.2-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Fri Apr 19 2013 Mikolaj Izdebski - 1.2-6
+- Build with xmvn
+- Update to current packaging guidelines
+
+* Fri Apr 19 2013 Mikolaj Izdebski - 1.2-5
+- Remove BR on maven-doxia
+- Resolves: rhbz#915611
+
+* Thu Feb 14 2013 Fedora Release Engineering - 1.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Wed Feb 06 2013 Java SIG - 1.2-3
+- Update for https://fedoraproject.org/wiki/Fedora_19_Maven_Rebuild
+- Replace maven BuildRequires with maven-local
+
+* Thu Dec 6 2012 Mikolaj Izdebski - 1.2-2
+- Add mising R: forge-parent
+
+* Mon Dec 3 2012 Mikolaj Izdebski - 1.2-1
+- Update to upstream version 1.2
+
+* Thu Nov 22 2012 Jaromir Capik - 1.1.1-3
+- Including LICENSE and NOTICE
+
+* Mon Oct 15 2012 Mikolaj Izdebski - 1.1.1-2
+- Remove RPM bug workaround
+
+* Fri Oct 12 2012 Mikolaj Izdebski - 1.1.1-1
+- Update to upstream version 1.1.1
+- Convert patches to POM macro
+- Remove patch for bug 748074, upstreamed
+
+* Thu Jul 19 2012 Fedora Release Engineering - 1.0.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Thu Feb 02 2012 Jaromir Capik - 1.0.1-4
+- Migration to plexus-containers-component-metadata
+- Maven3 compatibility patches
+- Minor spec file changes according to the latest guidelines
+
+* Fri Jan 13 2012 Fedora Release Engineering - 1.0.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Fri Jul 15 2011 Jaromir Capik - 1.0.1-2
+- Removal of plexus-maven-plugin dependency (not needed)
+
+* Tue Jun 28 2011 Alexander Kurtakov 1.0.1-1
+- Update to latest upstream 1.0.1.
+- Adapt to current guidelines.
+
+* Thu Mar 10 2011 Stanislav Ochotnicky - 1.0-1
+- Update to latest upstream (1.0)
+
+* Tue Feb 08 2011 Fedora Release Engineering - 1.0-0.3.b2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Dec 13 2010 Stanislav Ochotnicky - 1.0-0.2.b2
+- Fix FTBFS (#631388)
+- Use new maven plugin names
+- Versionless jars & javadocs
+
+* Wed May 19 2010 Alexander Kurtakov 1.0-0.1.b2
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..950df4a
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (enforcer-3.0.0-M3-source-release.zip) = ab3fe7f71bce102e2a5f4539c61f4a3476748829a77ec52495adf833b424ab81830b59058df37ad4175cf9e368d38d1932bc6bff26ece3c64163a2fdbea83134