diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 0cd022d..ba6fd0f 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -25,7 +25,7 @@
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macOS-latest]
-        java: [8, 11, 14, 15-ea]
+        java: [8, 11, 14, 15, 16-ea]
       fail-fast: false
 
     runs-on: ${{ matrix.os }}
@@ -35,7 +35,7 @@
         uses: actions/checkout@v2
 
       - name: Set up cache for ~./m2/repository
-        uses: actions/cache@v1
+        uses: actions/cache@v2
         with:
           path: ~/.m2/repository
           key: maven-${{ matrix.os }}-java${{ matrix.java }}-${{ hashFiles('**/pom.xml') }}
diff --git a/.gitignore b/.gitignore
index 907eb16..41ea549 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,8 +5,5 @@
 .idea/
 .svn
 *.iml
-.settings
-.classpath
-.project
 .checkstyle
 
diff --git a/enforcer-api/pom.xml b/enforcer-api/pom.xml
index c27ddd6..0858cfc 100644
--- a/enforcer-api/pom.xml
+++ b/enforcer-api/pom.xml
@@ -41,11 +41,6 @@
       <artifactId>maven-plugin-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-container-default</artifactId>
-      <version>1.0-alpha-9</version>
-    </dependency>
-    <dependency>
       <groupId>com.google.code.findbugs</groupId>
       <artifactId>jsr305</artifactId>
       <version>3.0.0</version>
diff --git a/enforcer-api/src/main/assembly/custom-rule-sample.xml b/enforcer-api/src/main/assembly/custom-rule-sample.xml
index 5b72b90..63eb1c1 100644
--- a/enforcer-api/src/main/assembly/custom-rule-sample.xml
+++ b/enforcer-api/src/main/assembly/custom-rule-sample.xml
@@ -18,9 +18,9 @@
   * under the License. 
   *
 -->
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 https://maven.apache.org/xsd/assembly-2.1.0.xsd">
   <id>sample</id>
   <includeBaseDirectory>false</includeBaseDirectory>
   <formats>
diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml
index 3fb4426..c7d52a6 100644
--- a/enforcer-rules/pom.xml
+++ b/enforcer-rules/pom.xml
@@ -75,9 +75,9 @@
       <artifactId>enforcer-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.beanshell</groupId>
+      <groupId>org.apache-extras.beanshell</groupId>
       <artifactId>bsh</artifactId>
-      <version>2.0b4</version>
+      <version>2.0b6</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
@@ -103,9 +103,11 @@
       <groupId>org.apache.maven.resolver</groupId>
       <artifactId>maven-resolver-util</artifactId>
     </dependency>
+    <!-- needed for ArtifactCollector and maven-dependency-tree 2.2 -->
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-compat</artifactId>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.assertj</groupId>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java
index 50ba869..733f0cd 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java
@@ -42,6 +42,11 @@
             MavenSession mavenSession = (MavenSession) helper.evaluate( "${session}" );
             String mavenVersion = mavenSession.getSystemProperties().getProperty( "maven.version" );
             helper.getLog().debug( "Detected Maven Version: " + mavenVersion );
+            if ( mavenVersion == null )
+            {
+                throw new EnforcerRuleException(
+                        "Unable to detect Maven Version - missing system property - maven.version" );
+            }
             DefaultArtifactVersion detectedVersion = new DefaultArtifactVersion( mavenVersion );
             enforceVersion( helper.getLog(), "Maven", getVersion(), detectedVersion );
         }
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 0a4ba38..7eee9ae 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
@@ -42,6 +42,7 @@
 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.shared.utils.logging.MessageUtils;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
@@ -253,7 +254,18 @@
         {
             version = uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
         }
-        return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version;
+        String result = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version;
+
+        if ( "compile".equals( artifact.getScope() ) )
+        {
+            return MessageUtils.buffer().strong( result ).toString();
+        }
+        if ( artifact.getScope() != null )
+        {
+            return result + " [" + artifact.getScope() + ']';
+        }
+
+        return result;
     }
 
     private static class RequireUpperBoundDepsVisitor
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
index 29014a5..763a2a5 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
@@ -36,7 +36,6 @@
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.sonatype.aether.RepositorySystemSession;
 
 /**
  * The Class EnforcerTestUtils.
@@ -62,7 +61,7 @@
         when( mer.getSystemProperties() ).thenReturn( systemProperties );
 
         MavenExecutionResult meresult = mock( MavenExecutionResult.class );
-        return new MavenSession( mock, (RepositorySystemSession) null, mer, meresult );
+        return new MavenSession( mock, null, mer, meresult );
     }
 
     /**
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPlexusContainer.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPlexusContainer.java
deleted file mode 100644
index a73cbbd..0000000
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPlexusContainer.java
+++ /dev/null
@@ -1,662 +0,0 @@
-package org.apache.maven.plugins.enforcer;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.Reader;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.maven.execution.RuntimeInformation;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.classworlds.ClassRealm;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.PlexusContainerException;
-import org.codehaus.plexus.component.composition.UndefinedComponentComposerException;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
-import org.codehaus.plexus.component.factory.ComponentInstantiationException;
-import org.codehaus.plexus.component.repository.ComponentDescriptor;
-import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.codehaus.plexus.configuration.PlexusConfigurationResourceException;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.logging.LoggerManager;
-
-/**
- * The Class MockPlexusContainer.
- *
- * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
- */
-public class MockPlexusContainer
-    implements PlexusContainer
-{
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookup(java.lang.String)
-     */
-    public Object lookup( String theComponentKey )
-        throws ComponentLookupException
-    {
-        if ( theComponentKey.equals( MavenProject.class.getName() ) )
-        {
-            return new MavenProject();
-        }
-        else if ( theComponentKey.equals( RuntimeInformation.class.getName() ) )
-        {
-            return new MockRuntimeInformation();
-        }
-
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addComponentDescriptor(org.codehaus.plexus.component.repository.ComponentDescriptor)
-     */
-    public void addComponentDescriptor( ComponentDescriptor theComponentDescriptor )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addContextValue(java.lang.Object, java.lang.Object)
-     */
-    public void addContextValue( Object theKey, Object theValue )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addJarRepository(java.io.File)
-     */
-    public void addJarRepository( File theRepository )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addJarResource(java.io.File)
-     */
-    public void addJarResource( File theResource )
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#composeComponent(java.lang.Object,
-     *      org.codehaus.plexus.component.repository.ComponentDescriptor)
-     */
-    public void composeComponent( Object theComponent, ComponentDescriptor theComponentDescriptor )
-        throws UndefinedComponentComposerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#createChildContainer(java.lang.String, java.util.List, java.util.Map)
-     */
-    public PlexusContainer createChildContainer( String theName, List theClasspathJars, Map theContext )
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#createChildContainer(java.lang.String, java.util.List, java.util.Map,
-     *      java.util.List)
-     */
-    public PlexusContainer createChildContainer( String theName, List theClasspathJars, Map theContext,
-                                                 List theDiscoveryListeners )
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#createComponentInstance(org.codehaus.plexus.component.repository.ComponentDescriptor)
-     */
-    public Object createComponentInstance( ComponentDescriptor theComponentDescriptor )
-        throws ComponentInstantiationException, ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#dispose()
-     */
-    public void dispose()
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getChildContainer(java.lang.String)
-     */
-    public PlexusContainer getChildContainer( String theName )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentDescriptor(java.lang.String)
-     */
-    public ComponentDescriptor getComponentDescriptor( String theComponentKey )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentDescriptorList(java.lang.String)
-     */
-    public List getComponentDescriptorList( String theRole )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentDescriptorMap(java.lang.String)
-     */
-    public Map getComponentDescriptorMap( String theRole )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentRealm(java.lang.String)
-     */
-    public ClassRealm getComponentRealm( String theComponentKey )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getContext()
-     */
-    public Context getContext()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getCreationDate()
-     */
-    public Date getCreationDate()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getLogger()
-     */
-    public Logger getLogger()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getLoggerManager()
-     */
-    public LoggerManager getLoggerManager()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#hasChildContainer(java.lang.String)
-     */
-    public boolean hasChildContainer( String theName )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#hasComponent(java.lang.String)
-     */
-    public boolean hasComponent( String theComponentKey )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#hasComponent(java.lang.String, java.lang.String)
-     */
-    public boolean hasComponent( String theRole, String theRoleHint )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#initialize()
-     */
-    public void initialize()
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#isInitialized()
-     */
-    public boolean isInitialized()
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#isStarted()
-     */
-    public boolean isStarted()
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookup(java.lang.String, java.lang.String)
-     */
-    public Object lookup( String theRole, String theRoleHint )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookupList(java.lang.String)
-     */
-    public List lookupList( String theRole )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookupMap(java.lang.String)
-     */
-    public Map lookupMap( String theRole )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#registerComponentDiscoveryListener(org.codehaus.plexus.component.discovery.ComponentDiscoveryListener)
-     */
-    public void registerComponentDiscoveryListener( ComponentDiscoveryListener theListener )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#release(java.lang.Object)
-     */
-    public void release( Object theComponent )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#releaseAll(java.util.Map)
-     */
-    public void releaseAll( Map theComponents )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#releaseAll(java.util.List)
-     */
-    public void releaseAll( List theComponents )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#removeChildContainer(java.lang.String)
-     */
-    public void removeChildContainer( String theName )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#removeComponentDiscoveryListener(org.codehaus.plexus.component.discovery.ComponentDiscoveryListener)
-     */
-    public void removeComponentDiscoveryListener( ComponentDiscoveryListener theListener )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#resume(java.lang.Object)
-     */
-    public void resume( Object theComponent )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#setConfigurationResource(java.io.Reader)
-     */
-    public void setConfigurationResource( Reader theConfiguration )
-        throws PlexusConfigurationResourceException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#setLoggerManager(org.codehaus.plexus.logging.LoggerManager)
-     */
-    public void setLoggerManager( LoggerManager theLoggerManager )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#setParentPlexusContainer(org.codehaus.plexus.PlexusContainer)
-     */
-    public void setParentPlexusContainer( PlexusContainer theParentContainer )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#start()
-     */
-    public void start()
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#suspend(java.lang.Object)
-     */
-    public void suspend( Object theComponent )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public <T> T lookup( Class<T> role )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> T lookup( Class<T> role, String hint )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> T lookup( Class<T> type, String role, String hint )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> List<T> lookupList( Class<T> role )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> Map<String, T> lookupMap( Class<T> role )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean hasComponent( Class<?> role )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean hasComponent( Class<?> role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean hasComponent( Class<?> type, String role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public void addComponent( Object component, String role )
-    {
-        // TODO Auto-generated method stub
-        
-    }
-
-    @Override
-    public <T> void addComponent( T component, Class<?> role, String hint )
-    {
-        // TODO Auto-generated method stub
-        
-    }
-
-    @Override
-    public ComponentDescriptor<?> getComponentDescriptor( String role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> ComponentDescriptor<T> getComponentDescriptor( Class<T> type, String role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> List<ComponentDescriptor<T>> getComponentDescriptorList( Class<T> type, String role )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> Map<String, ComponentDescriptor<T>> getComponentDescriptorMap( Class<T> type, String role )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public List<ComponentDescriptor<?>> discoverComponents( org.codehaus.plexus.classworlds.realm.ClassRealm classRealm )
-        throws PlexusConfigurationException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm getContainerRealm()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm setLookupRealm( org.codehaus.plexus.classworlds.realm.ClassRealm realm )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm getLookupRealm()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm createChildRealm( String id )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
index 581bd82..06c9060 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
@@ -22,7 +22,14 @@
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 
-import junit.framework.TestCase;
+import org.apache.maven.execution.MavenSession;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Properties;
+
+import static org.junit.Assert.fail;
 
 /**
  * The Class TestMavenVersion.
@@ -30,7 +37,6 @@
  * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
  */
 public class TestMavenVersion
-    extends TestCase
 {
 
     /**
@@ -38,6 +44,7 @@
      *
      * @throws EnforcerRuleException the enforcer rule exception
      */
+    @Test
     public void testRule()
         throws EnforcerRuleException
     {
@@ -70,8 +77,46 @@
     }
 
     /**
+     * Test few more cases
+     *
+     * @throws EnforcerRuleException the enforcer rule exception
+     */
+    @Test
+    public void checkRequireVersionMatrix() throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        RequireMavenVersion rule = new RequireMavenVersion();
+
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
+        MavenSession mavenSession = (MavenSession) helper.evaluate( "${session}" );
+        Properties systemProperties = mavenSession.getSystemProperties();
+
+        systemProperties.setProperty( "maven.version", "3.6.1" );
+        rule.setVersion( "3.6.0" );
+        rule.execute( helper );
+
+        systemProperties.setProperty( "maven.version", "3.6.2" );
+        rule.setVersion( "3.6.0" );
+        rule.execute( helper );
+        rule.setVersion( "3.6.1" );
+        rule.execute( helper );
+        rule.setVersion( "3.6.2" );
+        rule.execute( helper );
+        rule.setVersion( "3.6.3" );
+        try
+        {
+            rule.execute( helper );
+            fail( "Expected an exception." );
+        }
+        catch ( EnforcerRuleException e )
+        {
+            // expected to catch this.
+        }
+    }
+
+    /**
      * Test id.
      */
+    @Test
     public void testId()
     {
         RequireMavenVersion rule = new RequireMavenVersion();
diff --git a/maven-enforcer-plugin/pom.xml b/maven-enforcer-plugin/pom.xml
index 78a56f5..a3a7518 100644
--- a/maven-enforcer-plugin/pom.xml
+++ b/maven-enforcer-plugin/pom.xml
@@ -159,7 +159,7 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-invoker-plugin</artifactId>
-            <version>3.2.1</version>
+            <version>3.2.2</version>
             <configuration>
               <debug>true</debug>
               <projectsDirectory>src/it/projects</projectsDirectory>
@@ -192,7 +192,7 @@
           <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>mrm-maven-plugin</artifactId>
-            <version>1.0.0</version>
+            <version>1.2.0</version>
             <executions>
               <execution>
                 <goals>
diff --git a/.travis.yml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/invoker.properties
similarity index 80%
rename from .travis.yml
rename to maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/invoker.properties
index e00391c..c98ac4c 100644
--- a/.travis.yml
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/invoker.properties
@@ -15,19 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-language: java
-sudo: false
-
-cache:
-  directories:
-  - "$HOME/.m2"
-
-jobs:
-  include:
-  - stage: test
-    jdk: openjdk11
-    script: mvn verify -Prun-its
-
-branches:
-  only:
-  - master
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/pom.xml
new file mode 100644
index 0000000..ef8eddc
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  * 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. 
+  *
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+  <artifactId>menforcer313</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_api</artifactId>
+      <version>1.4.0</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+      <scope>provided</scope>
+      <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <configuration>
+              <rules>
+                <RequireUpperBoundDeps/>
+              </rules>
+            </configuration>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/verify.groovy
new file mode 100644
index 0000000..f916d09
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/verify.groovy
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+def LS = System.getProperty( "line.separator" )
+File buildLog = new File( basedir, 'build.log' )
+
+assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )
+def message = 
+'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 [runtime] paths to dependency are:'+LS+
+'+-org.apache.maven.plugins.enforcer.its:menforcer313:1.0-SNAPSHOT'+LS+
+'  +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 [runtime]'+LS+
+'and'+LS+
+'+-org.apache.maven.plugins.enforcer.its:menforcer313:1.0-SNAPSHOT'+LS+
+'  +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9 [provided]'+LS+
+'    +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 [provided]'+LS
+assert buildLog.text.contains( message )
diff --git a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
index fe985df..4c08b7d 100644
--- a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
@@ -43,7 +43,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
-        <version>3.0.0</version>
+        <version>3.2.0</version>
         <executions>
           <execution>
             <id>assemble</id>
diff --git a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
index a3b5433..1c0f795 100644
--- a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
@@ -9,10 +9,10 @@
   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. -->
-<assembly   xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+<assembly   xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
-                                http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+            xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0
+                                https://maven.apache.org/xsd/assembly-2.1.0.xsd">
     <id>extjars</id>
     <formats>
         <format>zip</format>
diff --git a/pom.xml b/pom.xml
index 1d1ea38..6902e5c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,6 +24,7 @@
     <artifactId>maven-parent</artifactId>
     <groupId>org.apache.maven</groupId>
     <version>34</version>
+    <relativePath />
   </parent>
   <groupId>org.apache.maven.enforcer</groupId>
   <artifactId>enforcer</artifactId>
@@ -63,7 +64,7 @@
   </distributionManagement>
 
   <properties>
-    <maven.version>3.0</maven.version>
+    <maven.version>3.1.1</maven.version>
     <maven.site.path>enforcer-archives/enforcer-LATEST</maven.site.path>
     <javaVersion>7</javaVersion>
     <project.build.outputTimestamp>2020-04-17T21:04:00Z</project.build.outputTimestamp>
@@ -107,12 +108,12 @@
         <groupId>org.apache.maven</groupId>
         <artifactId>maven-compat</artifactId>
         <version>${maven.version}</version>
+        <scope>test</scope>
       </dependency>
-
       <dependency>
         <groupId>org.apache.maven.shared</groupId>
         <artifactId>maven-common-artifact-filters</artifactId>
-        <version>3.1.0</version>
+        <version>3.2.0</version>
       </dependency>
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
@@ -122,7 +123,7 @@
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.13</version>
+        <version>4.13.1</version>
       </dependency>
       <dependency>
         <groupId>org.mockito</groupId>
@@ -138,18 +139,24 @@
       <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
-        <version>1.14</version>
+        <version>1.15</version>
       </dependency>
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
-        <version>2.5</version><!-- same version as used by maven-shared-utils -->
+        <version>2.6</version>
       </dependency>
       <dependency>
         <groupId>org.apache.maven.plugin-testing</groupId>
         <artifactId>maven-plugin-testing-harness</artifactId>
-        <version>2.1</version>
+        <version>3.1.0</version>
         <scope>test</scope>
+        <exclusions>
+          <exclusion>
+            <artifactId>plexus-container-default</artifactId>
+            <groupId>org.codehaus.plexus</groupId>
+          </exclusion>
+        </exclusions>
       </dependency>
       <dependency>
         <groupId>org.apache.maven.shared</groupId>
@@ -159,12 +166,12 @@
       <dependency>
         <groupId>org.apache.maven.resolver</groupId>
         <artifactId>maven-resolver-util</artifactId>
-        <version>1.4.1</version>
+        <version>1.6.1</version>
       </dependency>
       <dependency>
         <groupId>org.assertj</groupId>
         <artifactId>assertj-core</artifactId>
-        <version>1.7.1</version>
+        <version>2.9.1</version><!-- Java 7 -->
       </dependency>
     </dependencies>
   </dependencyManagement>
