[maven-enforcer] 01/08: New upstream version 1.4.2

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Fri Jul 28 14:33:11 UTC 2017


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to branch master
in repository maven-enforcer.

commit 4d44d1ecd1c28d527396869244acfd4e3a2c1e91
Author: Emmanuel Bourg <ebourg at apache.org>
Date:   Wed Jul 19 16:29:42 2017 +0200

    New upstream version 1.4.2
---
 .gitignore                                         |  10 +
 maven-enforcer-plugin/LICENSE => LICENSE           | 178 +-------
 NOTICE                                             |   5 +
 README.TXT                                         |  24 ++
 deploySite.bat                                     |  21 +
 deploySite.sh                                      |  23 +
 enforcer-api/pom.xml                               |  30 +-
 enforcer-api/src/custom-rule-sample/pom.xml        |  19 +
 .../apache/maven/enforcer/rule/MyCustomRule.java   |  19 +
 .../src/custom-rule-sample/src/usage-pom.xml       |  20 +
 enforcer-api/src/custom-rule-sample/usage-pom.xml  |  20 +
 .../src/main/assembly/custom-rule-sample.xml       |  24 +-
 .../maven/enforcer/rule/api/EnforcerLevel.java     |  30 +-
 .../maven/enforcer/rule/api/EnforcerRule.java      |  10 +-
 .../maven/enforcer/rule/api/EnforcerRule2.java     |  23 +-
 .../enforcer/rule/api/EnforcerRuleException.java   |   1 -
 .../enforcer/rule/api/EnforcerRuleHelper.java      |  11 +-
 .../src/site/apt/writing-a-custom-rule.apt.vm      |   4 +-
 enforcer-api/src/site/site.xml                     |   2 +-
 enforcer-rules/pom.xml                             |  63 ++-
 .../plugins/enforcer/AbstractBanDependencies.java  | 112 +++--
 .../enforcer/AbstractPropertyEnforcerRule.java     | 150 +++++++
 .../plugins/enforcer/AbstractRequireFiles.java     |  54 ++-
 .../enforcer/AbstractStandardEnforcerRule.java     |  41 +-
 .../plugins/enforcer/AbstractVersionEnforcer.java  |  45 +-
 .../apache/maven/plugins/enforcer/AlwaysFail.java  |   4 +-
 .../apache/maven/plugins/enforcer/AlwaysPass.java  |   5 +-
 .../enforcer/BanDistributionManagement.java        | 151 +++++++
 .../BanDuplicatePomDependencyVersions.java         | 217 ++++++++++
 .../enforcer/BanTransitiveDependencies.java        | 202 +++++++++
 .../maven/plugins/enforcer/BannedDependencies.java | 169 ++++----
 .../maven/plugins/enforcer/BannedPlugins.java      |   2 +-
 .../maven/plugins/enforcer/BannedRepositories.java | 220 ++++++++++
 .../enforcer/DefaultEnforcementRuleHelper.java     |  10 +-
 .../plugins/enforcer/DependencyConvergence.java    | 316 ++++++++------
 .../enforcer/EnforcerExpressionEvaluator.java      |  27 +-
 .../maven/plugins/enforcer/EvaluateBeanshell.java  |  25 +-
 .../apache/maven/plugins/enforcer/NoSnapshots.java |  12 +-
 .../plugins/enforcer/ReactorModuleConvergence.java | 478 +++++++++++++++++++++
 .../plugins/enforcer/RequireActiveProfile.java     |  77 ++--
 .../enforcer/RequireEnvironmentVariable.java       |  91 ++++
 .../plugins/enforcer/RequireFileChecksum.java      | 146 +++++++
 .../plugins/enforcer/RequireFilesDontExist.java    |   2 +-
 .../maven/plugins/enforcer/RequireFilesExist.java  |   2 +-
 .../maven/plugins/enforcer/RequireFilesSize.java   |  72 ++--
 .../maven/plugins/enforcer/RequireJavaVersion.java |  26 +-
 .../plugins/enforcer/RequireMavenVersion.java      |  20 +-
 .../plugins/enforcer/RequireNoRepositories.java    | 106 +++--
 .../apache/maven/plugins/enforcer/RequireOS.java   | 114 +++--
 .../plugins/enforcer/RequirePluginVersions.java    | 354 ++++++++-------
 .../plugins/enforcer/RequirePrerequisite.java      | 134 ++++++
 .../maven/plugins/enforcer/RequireProperty.java    |  68 ++-
 .../maven/plugins/enforcer/RequireReleaseDeps.java |  84 ++--
 .../plugins/enforcer/RequireReleaseVersion.java    |  16 +-
 .../plugins/enforcer/RequireSameVersions.java      | 129 ++++++
 ...aseVersion.java => RequireSnapshotVersion.java} |  53 +--
 .../plugins/enforcer/RequireUpperBoundDeps.java    | 403 +++++++++++++++++
 .../plugins/enforcer/utils/ArtifactMatcher.java    | 219 ++++++++++
 .../enforcer/utils/DependencyVersionMap.java       | 176 ++++----
 .../utils/DistributionManagementCheck.java         |  87 ++++
 .../plugins/enforcer/utils/EnforcerRuleUtils.java  | 106 +++--
 .../plugins/enforcer/utils/PluginWrapper.java      |  18 +-
 enforcer-rules/src/site/apt/Images.odp             | Bin 0 -> 13598 bytes
 .../src/site/apt/banDistributionManagement.apt.vm  | 174 ++++++++
 ...vm => banDuplicatePomDependencyVersions.apt.vm} |  34 +-
 ...ies.apt.vm => banTransitiveDependencies.apt.vm} |  58 ++-
 .../src/site/apt/bannedDependencies.apt.vm         |  51 ++-
 ...requireProperty.apt.vm => bannedPlugins.apt.vm} |  56 +--
 .../src/site/apt/bannedRepositories.apt.vm         | 119 +++++
 .../src/site/apt/dependencyConvergence.apt.vm      |  34 +-
 enforcer-rules/src/site/apt/index.apt              |  58 ++-
 .../src/site/apt/reactorModuleConvergence.apt.vm   | 257 +++++++++++
 ...Property.apt.vm => requireActiveProfile.apt.vm} |  70 ++-
 ...on.apt.vm => requireEnvironmentVariable.apt.vm} |  29 +-
 .../src/site/apt/requireFileChecksum.apt.vm        |  98 +++++
 .../src/site/apt/requireJavaVersion.apt.vm         |   6 +-
 .../src/site/apt/requireMavenVersion.apt.vm        |   8 +-
 .../src/site/apt/requireNoRepositories.apt.vm      |  58 +--
 enforcer-rules/src/site/apt/requireOS.apt.vm       |  10 +-
 .../src/site/apt/requirePluginVersions.apt.vm      |   4 +-
 .../src/site/apt/requirePrerequisite.apt.vm        |  74 ++++
 enforcer-rules/src/site/apt/requireProperty.apt.vm |  26 +-
 .../src/site/apt/requireSameVersions.apt.vm        |  86 ++++
 ...ersion.apt.vm => requireSnapshotVersion.apt.vm} |  33 +-
 ...ergence.apt.vm => requireUpperBoundDeps.apt.vm} |  84 ++--
 enforcer-rules/src/site/apt/versionRanges.apt      |   2 +-
 .../src/site/resources/images/module.png           | Bin 0 -> 16967 bytes
 .../site/resources/images/root-with-modules.png    | Bin 0 -> 10294 bytes
 .../images/root-with-parent-and-modules.png        | Bin 0 -> 16919 bytes
 .../src/site/resources/images/root-with-parent.png | Bin 0 -> 10154 bytes
 enforcer-rules/src/site/resources/images/root.png  | Bin 0 -> 3588 bytes
 enforcer-rules/src/site/site.xml                   |   2 +-
 .../enforcer/BanDistributionManagementTest.java    | 285 ++++++++++++
 .../enforcer/BannedDependenciesTestSetup.java      | 109 +++++
 .../maven/plugins/enforcer/EnforcerTestUtils.java  |  46 +-
 .../maven/plugins/enforcer/MockPathTranslator.java |   1 -
 .../plugins/enforcer/MockPlexusContainer.java      | 156 ++++++-
 .../apache/maven/plugins/enforcer/MockProject.java |   7 +-
 .../enforcer/ReactorModuleConvergenceTest.java     | 338 +++++++++++++++
 .../plugins/enforcer/RequireActiveProfileTest.java | 193 +++++++++
 .../plugins/enforcer/RequirePrerequisiteTest.java  | 165 +++++++
 .../plugins/enforcer/TestBannedDependencies.java   | 405 ++++++++++-------
 .../plugins/enforcer/TestBannedRepositories.java   | 159 +++++++
 .../plugins/enforcer/TestEvaluateBeanshell.java    |  40 +-
 .../maven/plugins/enforcer/TestMavenVersion.java   |   9 +-
 .../maven/plugins/enforcer/TestNoSnapshots.java    |  21 +-
 ...ty.java => TestRequireEnvironmentVariable.java} |  41 +-
 .../plugins/enforcer/TestRequireFileChecksum.java  | 233 ++++++++++
 .../enforcer/TestRequireFilesDontExist.java        |  20 +-
 .../plugins/enforcer/TestRequireFilesExist.java    |  22 +-
 .../plugins/enforcer/TestRequireFilesSize.java     |  26 +-
 .../plugins/enforcer/TestRequireJavaVersion.java   |  87 ++--
 .../enforcer/TestRequireNoRepositories.java        |  26 +-
 .../maven/plugins/enforcer/TestRequireOS.java      |   3 +-
 .../enforcer/TestRequirePluginVersions.java        |  92 ++--
 .../plugins/enforcer/TestRequireProperty.java      |  10 +-
 .../plugins/enforcer/TestRequireReleaseDeps.java   |  24 +-
 ...seDeps.java => TestRequireSnapshotVersion.java} | 102 ++---
 .../utils/MockEnforcerExpressionEvaluator.java     |   4 +-
 .../enforcer/utils/TestArtifactMatcher.java        | 163 +++++++
 .../no-repositories/child/pom.xml                  |  22 +-
 .../requireNoRepositories/no-repositories/pom.xml  |  22 +-
 .../snapshot-plugin-repositories/child/pom.xml     |  22 +-
 .../snapshot-plugin-repositories/pom.xml           |  22 +-
 .../snapshot-repositories/child/pom.xml            |  22 +-
 .../snapshot-repositories/pom.xml                  |  22 +-
 .../with-plugin-repositories/child/pom.xml         |  22 +-
 .../with-plugin-repositories/pom.xml               |  22 +-
 .../with-repositories/child/pom.xml                |  22 +-
 .../with-repositories/pom.xml                      |  22 +-
 .../checkPluginPropertyVersion/pom.xml             |  22 +-
 .../checkPluginVersionProfile/pom.xml              |  22 +-
 .../getPomRecursively/b/c/pom.xml                  |  22 +-
 .../getPomRecursively/b/pom.xml                    |  22 +-
 .../getPomRecursively/pom.xml                      |  22 +-
 .../parentExpression/child/pom.xml                 |  22 +-
 .../requirePluginVersions/parentExpression/pom.xml |  22 +-
 .../parentRelativePath/parent/pom.xml              |  22 +-
 .../parentRelativePath/pom.xml                     |  22 +-
 .../parentRelativePathDirectory/parent/pom.xml     |  22 +-
 .../parentRelativePathDirectory/pom.xml            |  22 +-
 maven-enforcer-plugin/NOTICE                       |   9 -
 maven-enforcer-plugin/pom.xml                      | 143 +++---
 .../src/it/always-fail/invoker.properties          |   1 -
 .../src/it/builds_a_pom_noop/module/pom.xml        |  12 -
 .../src/it/builds_a_pom_noop/pom.xml               |  31 --
 .../src/it/dependencies_converge/module/pom.xml    |  12 -
 .../dependencies_not_converging/invoker.properties |   1 -
 .../it/dependencies_not_converging/module/pom.xml  |  12 -
 .../invoker.properties                             |   1 -
 .../module/pom.xml                                 |  12 -
 .../repository/menforcer126_maven-plugin-1.0.pom   |  27 ++
 .../it/mrm/repository/menforcer128_api-1.4.0.pom   |  26 ++
 .../it/mrm/repository/menforcer128_api-1.5.0.pom   |  26 ++
 .../it/mrm/repository/menforcer128_api-1.6.0.pom   |  26 ++
 .../mrm/repository/menforcer128_classic-0.9.9.pom  |  34 ++
 ...menforcer134_model-1.0-20130423.042904-7222.pom |  26 ++
 ...menforcer134_model-1.0-20130423.044324-5638.pom |  26 ++
 .../menforcer134_modelbuilder-1.0-SNAPSHOT.pom     |  34 ++
 .../menforcer134_project-1.0-SNAPSHOT.pom          |  39 ++
 .../mrm/repository/menforcer138_archiver-2.1.1.pom |  44 ++
 .../menforcer138_classworlds-1.1-alpha-2.pom       |  26 ++
 ...r138_container-default-1.0-alpha-9-stable-1.pom |  39 ++
 .../it/mrm/repository/menforcer138_io-2.0.3.pom    |  34 ++
 .../it/mrm/repository/menforcer138_utils-1.0.4.pom |  26 ++
 .../it/mrm/repository/menforcer138_utils-3.0.pom   |  26 ++
 .../src/it/mrm/repository/menforcer146_b-1.0.pom   |  34 ++
 .../src/it/mrm/repository/menforcer146_x-1.1.pom   |  26 ++
 .../src/it/mrm/repository/menforcer146_x-2.1.pom   |  26 ++
 .../src/it/mrm/repository/menforcer146_x-3.1.pom   |  26 ++
 .../src/it/mrm/repository/menforcer152-1.0.pom     |  27 ++
 .../it/mrm/repository/menforcer158_utils-1.0.pom   |  26 ++
 .../it/mrm/repository/menforcer72_junit-3.8.1.pom  |  26 ++
 .../mrm/repository/menforcer72_logging-1.1.1.pom   |  27 ++
 .../repository/menforcer85_api-1.0-SNAPSHOT.pom    |  26 ++
 maven-enforcer-plugin/src/it/mrm/settings.xml      |  73 ++++
 maven-enforcer-plugin/src/it/pom.xml               |  20 +
 .../projects/always-fail-warn/invoker.properties   |  18 +
 .../always-fail-warn}/pom.xml                      |   5 +-
 .../src/it/projects/always-fail-warn/verify.groovy |  19 +-
 .../src/it/projects/always-fail/invoker.properties |  18 +
 .../src/it/{ => projects}/always-fail/pom.xml      |   0
 .../src/it/{ => projects}/always-pass/pom.xml      |   0
 .../invoker.properties                             |  18 +
 .../module1/pom.xml                                |  33 +-
 .../module2/pom.xml                                |  30 +-
 .../pom.xml                                        |  24 +-
 .../verify.groovy                                  |  22 +-
 .../module1/pom.xml                                |  31 +-
 .../module2}/pom.xml                               |  47 +-
 .../pom.xml                                        |  27 +-
 .../verify.groovy                                  |  20 +-
 .../ban-distribution-management}/pom.xml           |   5 +-
 .../ban-distribution-management/verify.groovy      |  20 +-
 .../ban-pom-dependency-version/invoker.properties  |  18 +
 .../ban-pom-dependency-version}/pom.xml            |  32 +-
 .../ban-pom-dependency-version/verify.groovy       |  60 ++-
 .../invoker.properties                             |  18 +
 .../ban-transitive-dependencies-fail}/pom.xml      |  36 +-
 .../ban-transitive-dependencies-fail/verify.groovy |  55 +--
 .../ban-transitive-dependencies}/pom.xml           |  36 +-
 .../invoker.properties                             |  18 +
 .../banned-dependencies-versionrange-fail}/pom.xml |  16 +-
 .../verify.groovy                                  |  21 +-
 .../banned-dependencies-versionrange}/pom.xml      |  14 +-
 .../banned-dependencies-wildcards/pom.xml          |  12 +-
 .../it/{ => projects}/banned-dependencies/pom.xml  |   2 +-
 .../src/it/{ => projects}/banned-plugins/pom.xml   |   0
 .../it/projects/builds_a_pom_noop/module/pom.xml   |  30 ++
 .../src/it/projects/builds_a_pom_noop/pom.xml      |  49 +++
 .../projects/dependencies_converge/module/pom.xml  |  30 ++
 .../{ => projects}/dependencies_converge/pom.xml   |  22 +-
 .../dependencies_not_converging/invoker.properties |  18 +
 .../dependencies_not_converging/module/pom.xml     |  30 ++
 .../dependencies_not_converging/pom.xml            |  22 +-
 .../invoker.properties                             |  18 +
 .../module/pom.xml                                 |  30 ++
 .../dependencies_not_converging_test_scope/pom.xml |  22 +-
 .../it/{ => projects}/evaluate-beanshell/pom.xml   |   0
 .../src/it/projects/multimodule/invoker.properties |  18 +
 .../src/it/projects/multimodule/module1/pom.xml    |  62 +--
 .../src/it/projects/multimodule/module2/pom.xml    |  70 +--
 .../{always-pass => projects/multimodule}/pom.xml  | 111 ++---
 .../require-active-profile-all}/pom.xml            |  17 +-
 .../require-active-profile-from-settings}/pom.xml  |  18 +-
 .../{ => projects}/require-active-profile/pom.xml  |   0
 .../src/it/projects/require-file-checksum/LICENSE  |  16 +-
 .../require-file-checksum}/pom.xml                 |  28 +-
 .../require-files-dont-exist/pom.xml               |   0
 .../it/{ => projects}/require-files-exist/pom.xml  |   0
 .../it/{ => projects}/require-files-size/pom.xml   |   0
 .../it/{ => projects}/require-java-version/pom.xml |   0
 .../{ => projects}/require-maven-version/pom.xml   |   0
 .../{ => projects}/require-no-repositories/pom.xml |   0
 .../invoker.properties                             |  18 +
 .../require-no-repositories_failure}/pom.xml       | 115 ++---
 .../require-no-repositories_failure/verify.groovy  |  56 +--
 .../pom.xml                                        |   0
 .../invoker.properties                             |  25 ++
 .../require-plugin-versions-expressions/pom.xml    | 155 +++++++
 .../pom.xml                                        |  94 ++++
 .../META-INF/MANIFEST.MF                           |   2 +
 .../invoker.properties                             |  18 +
 .../pom.xml                                        |  94 ++++
 .../pom.xml                                        | 101 +++++
 .../{ => projects}/require-plugin-versions/pom.xml |   0
 .../src/it/{ => projects}/require-property/pom.xml |   0
 .../require-release-dependencies-excludes/pom.xml  |  63 +++
 .../invoker.properties                             |  18 +
 .../pom.xml                                        |  63 +++
 .../require-release-dependencies/pom.xml           |   0
 .../{ => projects}/require-release-version/pom.xml |   0
 .../invoker.properties                             |  18 +
 .../projects/require-same-versions_failure/pom.xml |  87 ++++
 .../projects/require-same-versions_success/pom.xml |  88 ++++
 .../invoker.properties                             |  18 +
 .../require-snapshot-version_failure}/pom.xml      |   7 +-
 .../require-snapshot-version_success}/pom.xml      |   9 +-
 .../invoker.properties                             |  18 +
 .../pom.xml                                        |  67 +++
 .../verify.groovy                                  |  29 ++
 .../pom.xml                                        |  67 +++
 .../invoker.properties                             |  18 +
 .../pom.xml                                        |  60 +++
 .../verify.groovy                                  |  55 +--
 .../pom.xml                                        |  58 +++
 .../invoker.properties                             |  18 +
 .../module/pom.xml                                 |  30 ++
 .../require-upper-bound-deps_failure/pom.xml       |  62 +++
 .../require-upper-bound-deps_failure/verify.groovy |  32 ++
 .../module/pom.xml                                 |  30 ++
 .../require-upper-bound-deps_ignored/pom.xml       |  66 +++
 .../require-upper-bound-deps_ignored/verify.groovy |  56 +--
 .../module/pom.xml                                 |  30 ++
 .../require-upper-bound-deps_success/pom.xml       |  62 +++
 .../invoker.properties                             |  18 +
 .../projects/resolve_collect_dependencies/pom.xml  |  72 ++++
 .../src/assembly/extjars.xml                       |  31 ++
 .../resolve_collect_dependencies/verify.groovy     |  54 +--
 .../goals.txt                                      |   1 -
 .../require-release-dependencies-excludes/pom.xml  |  44 --
 maven-enforcer-plugin/src/it/settings.xml          |  55 ---
 .../maven/plugins/enforcer/DisplayInfoMojo.java    |  55 +--
 .../apache/maven/plugins/enforcer/EnforceMojo.java | 349 ++++++++-------
 .../maven/plugins/enforcer/util/EnforcerUtils.java |  18 +
 .../META-INF/m2e/lifecycle-mapping-metadata.xml    |  35 ++
 maven-enforcer-plugin/src/site/apt/index.apt       |  12 +-
 maven-enforcer-plugin/src/site/apt/usage.apt.vm    |  28 +-
 maven-enforcer-plugin/src/site/site.xml            |   7 +-
 .../enforcer/TestDefaultEnforcementRuleHelper.java |   8 +-
 .../maven/plugins/enforcer/TestEnforceMojo.java    | 136 +++---
 pom.xml                                            | 243 ++++-------
 src/site/resources/download.cgi                    |  22 +
 src/site/site.xml                                  |  28 +-
 src/site/xdoc/download.xml.vm                      | 126 ++++++
 295 files changed, 12235 insertions(+), 3190 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6e0a5c5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+target
+.project
+.classpath
+.settings
+.idea/
+.svn
+*.iml
+.settings
+.classpath
+.project
diff --git a/maven-enforcer-plugin/LICENSE b/LICENSE
similarity index 52%
rename from maven-enforcer-plugin/LICENSE
rename to LICENSE
index 9acab8f..d645695 100644
--- a/maven-enforcer-plugin/LICENSE
+++ b/LICENSE
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -199,180 +200,3 @@
    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.
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-   
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..3233760
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,5 @@
+Apache Maven Enforcer
+Copyright 2007-2013 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.TXT b/README.TXT
new file mode 100644
index 0000000..71e0c62
--- /dev/null
+++ b/README.TXT
@@ -0,0 +1,24 @@
+Deploying web site
+-------------------
+You can use the deploySite(.sh|.bat) script
+Without any profile, the site will be deployed to http://maven.apache.org/enforcer-archives/enforcer-${project.version}
+sh ./deploySite.sh -Preporting
+
+To deploy main version http://maven.apache.org/enforcer, use
+sh ./deploySite.sh -Preporting -Psite-release
+
+Note you can add arguments to the script to pass your svn credentials:
+-Dusername=
+-Dpassword=
+
+Workflow for site when releasing
+--------------------------------
+Once release staged, you can publish a staged site.
+cd target/checkout
+sh ./deploySite.sh -Preporting
+content will be in http://maven.apache.org/enforcer-archives/enforcer-${project.version}
+
+Once vote passed, redeploy main site:
+cd target/checkout (or use the version tag)
+sh ./deploySite.sh -Preporting -Psite-release
+
diff --git a/deploySite.bat b/deploySite.bat
new file mode 100644
index 0000000..24510e9
--- /dev/null
+++ b/deploySite.bat
@@ -0,0 +1,21 @@
+ at REM ----------------------------------------------------------------------------
+ at REM Licensed to the Apache Software Foundation (ASF) under one
+ at REM or more contributor license agreements.  See the NOTICE file
+ at REM distributed with this work for additional information
+ at REM regarding copyright ownership.  The ASF licenses this file
+ at REM to you under the Apache License, Version 2.0 (the
+ at REM "License"); you may not use this file except in compliance
+ at REM with the License.  You may obtain a copy of the License at
+ at REM
+ at REM    http://www.apache.org/licenses/LICENSE-2.0
+ at REM
+ at REM Unless required by applicable law or agreed to in writing,
+ at REM software distributed under the License is distributed on an
+ at REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ at REM KIND, either express or implied.  See the License for the
+ at REM specific language governing permissions and limitations
+ at REM under the License.
+ at REM ----------------------------------------------------------------------------
+
+mvn -Preporting clean site site:stage %*
+mvn scm-publish:publish-scm %*
diff --git a/deploySite.sh b/deploySite.sh
new file mode 100755
index 0000000..7d693d2
--- /dev/null
+++ b/deploySite.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+#
+# 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.
+#
+
+mvn -Preporting clean site site:stage $@
+mvn scm-publish:publish-scm $@
diff --git a/enforcer-api/pom.xml b/enforcer-api/pom.xml
index 668a3fc..8aad0be 100644
--- a/enforcer-api/pom.xml
+++ b/enforcer-api/pom.xml
@@ -24,14 +24,13 @@
   <parent>
     <groupId>org.apache.maven.enforcer</groupId>
     <artifactId>enforcer</artifactId>
-    <version>1.0.1</version>
+    <version>1.4.2</version>
   </parent>
 
   <artifactId>enforcer-api</artifactId>
-  <version>1.0.1</version>
   <packaging>jar</packaging>
 
-  <name>Enforcer API</name>
+  <name>Apache Maven Enforcer API</name>
   <description>
     This component provides the generic interfaces needed to implement custom rules for the maven-enforcer-plugin.
   </description>
@@ -46,32 +45,19 @@
       <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>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
 
   <build>
     <plugins>
       <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>descriptor</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
-        <version>2.2-beta-2</version>
         <executions>
           <execution>
             <id>custom-rule</id>
diff --git a/enforcer-api/src/custom-rule-sample/pom.xml b/enforcer-api/src/custom-rule-sample/pom.xml
index 1d0d5c9..5ae0f9e 100644
--- a/enforcer-api/src/custom-rule-sample/pom.xml
+++ b/enforcer-api/src/custom-rule-sample/pom.xml
@@ -1,4 +1,23 @@
 <?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>custom-rule</groupId>
diff --git a/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java b/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java
index 210e415..b9792d1 100644
--- a/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java
+++ b/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java
@@ -1,5 +1,24 @@
 package org.apache.maven.enforcer.rule;
 
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.enforcer.rule.api.EnforcerRule;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
diff --git a/enforcer-api/src/custom-rule-sample/src/usage-pom.xml b/enforcer-api/src/custom-rule-sample/src/usage-pom.xml
index c40d97b..713b269 100644
--- a/enforcer-api/src/custom-rule-sample/src/usage-pom.xml
+++ b/enforcer-api/src/custom-rule-sample/src/usage-pom.xml
@@ -1,3 +1,23 @@
+<?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</groupId>
diff --git a/enforcer-api/src/custom-rule-sample/usage-pom.xml b/enforcer-api/src/custom-rule-sample/usage-pom.xml
index 179cd69..0a4efb4 100644
--- a/enforcer-api/src/custom-rule-sample/usage-pom.xml
+++ b/enforcer-api/src/custom-rule-sample/usage-pom.xml
@@ -1,3 +1,23 @@
+<?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</groupId>
diff --git a/enforcer-api/src/main/assembly/custom-rule-sample.xml b/enforcer-api/src/main/assembly/custom-rule-sample.xml
index f57bc8a..1abdf30 100644
--- a/enforcer-api/src/main/assembly/custom-rule-sample.xml
+++ b/enforcer-api/src/main/assembly/custom-rule-sample.xml
@@ -1,4 +1,26 @@
-<assembly>
+<?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. 
+  *
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+    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">
   <id>sample</id>
   <includeBaseDirectory>false</includeBaseDirectory>
   <formats>
diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLevel.java
similarity index 55%
rename from maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java
rename to enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLevel.java
index 10fb5d4..ec99364 100644
--- a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java
+++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLevel.java
@@ -1,6 +1,4 @@
-package org.apache.maven.plugins.enforcer;
-
-import org.apache.maven.plugin.MojoExecutionException;
+package org.apache.maven.enforcer.rule.api;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -22,22 +20,18 @@ import org.apache.maven.plugin.MojoExecutionException;
  */
 
 /**
- * This goal has been deprecated.
+ * Levels steering whether a rule should fail a build or just display a warning.
+ *
+ * @author Mirko Friedenhagen
  * 
- * @deprecated
- * @goal enforce-once
- * @phase validate
- * @requiresDependencyResolution test
- * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: EnforceOnceMojo.java 694549 2008-09-11 23:55:34Z brianf $
+ * @since 1.4
  */
-public class EnforceOnceMojo
-    extends EnforceMojo
+public enum EnforcerLevel 
 {
-    public void execute()
-        throws MojoExecutionException
-    {
-        this.getLog().warn( "enforcer:enforce-once is deprecated. Use enforcer:enforce instead. See MENFORCER-11/MENFORCER-12 for more information." );
-        super.execute();
-    }
+
+    /** Fail the build. */
+    ERROR,
+    /** Just warn. */
+    WARN
+    
 }
diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
index 8992b7e..080bdb7 100644
--- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
+++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
@@ -19,11 +19,14 @@ package org.apache.maven.enforcer.rule.api;
  * under the License.
  */
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 /**
  * Interface to be implemented by any rules executed by the enforcer.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: EnforcerRule.java 987781 2010-08-21 16:23:40Z dennisl $
+ * @version $Id: EnforcerRule.java 1663790 2015-03-03 21:07:38Z khmarbaise $
  */
 public interface EnforcerRule
 {
@@ -40,7 +43,7 @@ public interface EnforcerRule
      *
      * @throws EnforcerRuleException the enforcer rule exception
      */
-    void execute( EnforcerRuleHelper helper )
+    void execute( @Nonnull EnforcerRuleHelper helper )
         throws EnforcerRuleException;
 
     /**
@@ -61,7 +64,7 @@ public interface EnforcerRule
      *
      * @return <code>true</code> if the stored results are valid for the same id.
      */
-    boolean isResultValid( EnforcerRule cachedRule );
+    boolean isResultValid( @Nonnull EnforcerRule cachedRule );
 
     /**
      * If the rule is to be cached, this id is used as part of the key. This can allow rules to take parameters
@@ -70,6 +73,7 @@ public interface EnforcerRule
      * @return id to be used by the enforcer to determine uniqueness of cache results. The ids only need to be unique
      * within a given rule implementation as the full key will be [classname]-[id]
      */
+    @Nullable
     String getCacheId();
 
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java
similarity index 63%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java
index 5594174..ba9903c 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java
@@ -1,4 +1,4 @@
-package org.apache.maven.plugins.enforcer;
+package org.apache.maven.enforcer.rule.api;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,16 +19,23 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
+import javax.annotation.Nonnull;
 
 /**
- * The Class AbstractStandardEnforcerRule.
+ * Interface to be implemented by any rules as of version 2.0 executed by the enforcer.
+ *
+ * @author Mirko Friedenhagen
+ * @version $Id: EnforcerRule2.java 1663790 2015-03-03 21:07:38Z khmarbaise $
+ * @since 1.4
  */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
+public interface EnforcerRule2 extends EnforcerRule
 {
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
+    /**
+     * Returns the level of enforcement.
+     *
+     * @return level
+     */
+    @Nonnull
+    EnforcerLevel getLevel();
 
 }
diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java
index ee559cb..d90c8e3 100644
--- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java
+++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java
@@ -25,7 +25,6 @@ package org.apache.maven.enforcer.rule.api;
  * minimum.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: EnforcerRuleException.java 805162 2009-08-17 21:48:52Z hboutemy $
  */
 public class EnforcerRuleException
     extends Exception
diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java
index f1fe483..e75c0da 100644
--- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java
+++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java
@@ -22,6 +22,8 @@ package org.apache.maven.enforcer.rule.api;
 import java.util.List;
 import java.util.Map;
 
+import javax.annotation.Nonnull;
+
 import org.apache.maven.plugin.logging.Log;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
@@ -34,7 +36,6 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupExcepti
  * rules.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: EnforcerRuleHelper.java 805162 2009-08-17 21:48:52Z hboutemy $
  */
 public interface EnforcerRuleHelper
     extends ExpressionEvaluator
@@ -45,13 +46,9 @@ public interface EnforcerRuleHelper
      *
      * @return the log
      */
+    @Nonnull
     Log getLog ();
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.shared.enforcer.rule.api.EnforcerRuleHelper#getRuntimeInformation()
-     */
     /**
      * Gets the component.
      *
@@ -61,6 +58,7 @@ public interface EnforcerRuleHelper
      *
      * @throws ComponentLookupException the component lookup exception
      */
+    @Nonnull
     Object getComponent ( Class clazz )
         throws ComponentLookupException;
 
@@ -73,6 +71,7 @@ public interface EnforcerRuleHelper
      *
      * @throws ComponentLookupException the component lookup exception
      */
+    @Nonnull
     Object getComponent ( String componentKey )
         throws ComponentLookupException;
 
diff --git a/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm b/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm
index b168793..feeb30a 100644
--- a/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm
+++ b/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm
@@ -220,7 +220,7 @@ public class MyCustomRule
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
-        <version>1.0-beta-1</version>
+        <version>${project.version}</version>
         <dependencies>
           <dependency>
             <groupId>custom-rule</groupId>
@@ -261,7 +261,7 @@ public class MyCustomRule
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
-        <version>1.0-beta-1</version>
+        <version>${project.version}</version>
         <dependencies>
           <dependency>
             <groupId>custom-rule</groupId>
diff --git a/enforcer-api/src/site/site.xml b/enforcer-api/src/site/site.xml
index 5d51c8a..a32d776 100644
--- a/enforcer-api/src/site/site.xml
+++ b/enforcer-api/src/site/site.xml
@@ -24,7 +24,7 @@ under the License.
       <item name="Writing a custom rule" href="writing-a-custom-rule.html"/>
     </menu>
     <menu name="Rule Execution Engines">
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin"/>
+      <item name="Maven Enforcer Plugin" href="../maven-enforcer-plugin"/>
     </menu>
   </body>
 </project>
\ No newline at end of file
diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml
index 5f3048b..05721e2 100644
--- a/enforcer-rules/pom.xml
+++ b/enforcer-rules/pom.xml
@@ -1,21 +1,21 @@
 <?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
+  * or more contributor license agreements. See the NOTICE file
   * distributed with this work for additional information
-  * regarding copyright ownership.  The ASF licenses this file
+  * 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
+  * 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
+  * KIND, either express or implied. See the License for the
   * specific language governing permissions and limitations
-  * under the License. 
+  * 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">
@@ -24,15 +24,13 @@
   <parent>
     <groupId>org.apache.maven.enforcer</groupId>
     <artifactId>enforcer</artifactId>
-    <version>1.0.1</version>
+    <version>1.4.2</version>
   </parent>
 
   <artifactId>enforcer-rules</artifactId>
-  <version>1.0.1</version>
-  <packaging>jar</packaging>
 
-  <name>Enforcer Rules</name>
-  <description>This component contains the standard Enforcer Rules</description>
+  <name>Apache Maven Enforcer Built-In Rules</name>
+  <description>This component contains the built-in Enforcer Rules</description>
 
   <dependencies>
     <dependency>
@@ -45,10 +43,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
     </dependency>
     <dependency>
@@ -60,13 +54,18 @@
       <artifactId>plexus-utils</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.shared</groupId>
+      <groupId>org.apache.maven.plugin-testing</groupId>
       <artifactId>maven-plugin-testing-harness</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.5</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.enforcer</groupId>
@@ -80,37 +79,37 @@
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
+      <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>easymock</groupId>
-      <artifactId>easymock</artifactId>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-dependency-tree</artifactId>
-      <version>1.2</version>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-i18n</artifactId>
       <version>1.0-beta-6</version>
-    </dependency>    
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-compat</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>
     <plugins>
       <plugin>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>descriptor</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
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 c24a936..960ef40 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
@@ -19,21 +19,24 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import java.util.Iterator;
-import java.util.Set;
-
 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.MavenProject;
+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;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Abstract Rule for banning dependencies.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: AbstractBanDependencies.java 885125 2009-11-28 18:51:23Z brianf $
+ * @version $Id: AbstractBanDependencies.java 1630934 2014-10-10 16:35:26Z khmarbaise $
  */
 public abstract class AbstractBanDependencies
     extends AbstractNonCacheableEnforcerRule
@@ -42,6 +45,8 @@ public abstract class AbstractBanDependencies
     /** Specify if transitive dependencies should be searched (default) or only look at direct dependencies. */
     private boolean searchTransitive = true;
 
+    private transient DependencyGraphBuilder graphBuilder;
+
     /**
      * Execute the rule.
      *
@@ -63,27 +68,46 @@ public abstract class AbstractBanDependencies
             throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", eee );
         }
 
+        try
+        {
+            graphBuilder = (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
+        }
+        catch ( ComponentLookupException e )
+        {
+            // real cause is probably that one of the Maven3 graph builder could not be initiated and fails with a
+            // ClassNotFoundException
+            try
+            {
+                graphBuilder =
+                    (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class.getName(), "maven2" );
+            }
+            catch ( ComponentLookupException e1 )
+            {
+                throw new EnforcerRuleException( "Unable to lookup DependencyGraphBuilder: ", e );
+            }
+        }
+
         // get the correct list of dependencies
-        Set dependencies = getDependenciesToCheck( project );
+        Set<Artifact> dependencies = getDependenciesToCheck( project );
 
         // look for banned dependencies
-        Set foundExcludes = checkDependencies( dependencies, helper.getLog() );
+        Set<Artifact> foundExcludes = checkDependencies( dependencies, helper.getLog() );
 
         // if any are found, fail the check but list all of them
         if ( foundExcludes != null && !foundExcludes.isEmpty() )
         {
-            StringBuffer buf = new StringBuffer();
+            String message = getMessage();
+
+            StringBuilder buf = new StringBuilder();
             if ( message != null )
             {
                 buf.append( message + "\n" );
             }
-            Iterator iter = foundExcludes.iterator();
-            while ( iter.hasNext() )
+            for ( Artifact artifact : foundExcludes )
             {
-                Artifact artifact = (Artifact) iter.next();
                 buf.append( getErrorMessage( artifact ) );
             }
-            message = buf.toString()+ "Use 'mvn dependency:tree' to locate the source of the banned dependencies.";
+            message = buf.toString() + "Use 'mvn dependency:tree' to locate the source of the banned dependencies.";
 
             throw new EnforcerRuleException( message );
         }
@@ -95,20 +119,52 @@ public abstract class AbstractBanDependencies
         return "Found Banned Dependency: " + artifact.getId() + "\n";
     }
 
-    protected Set getDependenciesToCheck( MavenProject project )
+    protected Set<Artifact> getDependenciesToCheck( MavenProject project )
     {
-        Set dependencies = null;
-        if ( searchTransitive )
+        Set<Artifact> dependencies = null;
+        try
         {
-            dependencies = project.getArtifacts();
+            DependencyNode node = graphBuilder.buildDependencyGraph( project, null );
+            if ( searchTransitive )
+            {
+                dependencies = getAllDescendants( node );
+            }
+            else if ( node.getChildren() != null )
+            {
+                dependencies = new HashSet<Artifact>();
+                for ( DependencyNode depNode : node.getChildren() )
+                {
+                    dependencies.add( depNode.getArtifact() );
+                }
+            }
         }
-        else
+        catch ( DependencyGraphBuilderException e )
         {
-            dependencies = project.getDependencyArtifacts();
+            // otherwise we need to change the signature of this protected method
+            throw new RuntimeException( e );
         }
         return dependencies;
     }
 
+    private Set<Artifact> getAllDescendants( DependencyNode node )
+    {
+        Set<Artifact> children = null;
+        if ( node.getChildren() != null )
+        {
+            children = new HashSet<Artifact>();
+            for ( DependencyNode depNode : node.getChildren() )
+            {
+                children.add( depNode.getArtifact() );
+                Set<Artifact> subNodes = getAllDescendants( depNode );
+                if ( subNodes != null )
+                {
+                    children.addAll( subNodes );
+                }
+            }
+        }
+        return children;
+    }
+
     /**
      * Checks the set of dependencies against the list of excludes.
      *
@@ -117,30 +173,10 @@ public abstract class AbstractBanDependencies
      * @return the sets the
      * @throws EnforcerRuleException the enforcer rule exception
      */
-    abstract protected Set checkDependencies( Set dependencies, Log log )
+    protected abstract Set<Artifact> checkDependencies( Set<Artifact> dependencies, Log log )
         throws EnforcerRuleException;
 
     /**
-     * Gets the message.
-     *
-     * @return the message
-     */
-    public String getMessage()
-    {
-        return this.message;
-    }
-
-    /**
-     * Sets the message.
-     *
-     * @param theMessage the message to set
-     */
-    public void setMessage( String theMessage )
-    {
-        this.message = theMessage;
-    }
-
-    /**
      * Checks if is search transitive.
      *
      * @return the searchTransitive
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractPropertyEnforcerRule.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractPropertyEnforcerRule.java
new file mode 100755
index 0000000..bd056ad
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractPropertyEnforcerRule.java
@@ -0,0 +1,150 @@
+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 org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+
+/**
+ * Abstract enforcer rule that give a foundation to validate properties from multiple sources.
+ *
+ * @author Paul Gier
+ * @author <a href='mailto:marvin[at]marvinformatics[dot]com'>Marvin Froeder</a>
+ * @version $Id: AbstractPropertyEnforcerRule.java 1697215 2015-08-23 16:27:17Z khmarbaise $
+ */
+public abstract class AbstractPropertyEnforcerRule
+    extends AbstractNonCacheableEnforcerRule
+{
+
+    /**
+     * Match the property value to a given regular expression. Defaults to <code>null</code> (any value is ok).
+     * 
+     * @see {@link #setRegex(String)}
+     * @see {@link #getRegex()}
+     */
+    private String regex = null;
+
+    /**
+     * Specify a warning message if the regular expression is not matched.
+     * 
+     * @see {@link #setRegexMessage(String)}
+     * @see {@link #getRegexMessage()}
+     */
+    private String regexMessage = null;
+
+    public AbstractPropertyEnforcerRule()
+    {
+        super();
+    }
+    
+    /**
+     * Set the property value to a given regular expression. Defaults to <code>null</code> (any value is ok).
+     * 
+     * @param regex The regular expression
+     */
+    public final void setRegex( String regex )
+    {
+        this.regex = regex;
+    }
+
+    /**
+     * Get the property value to a given regular expression. Defaults to <code>null</code> (any value is ok).
+     * 
+     * @return the regular expression
+     */
+    public final String getRegex()
+    {
+        return regex;
+    }
+    
+    /**
+     * Set a warning message if the regular expression is not matched.
+     * 
+     * @param regexMessage the regex message
+     */
+    public final void setRegexMessage( String regexMessage )
+    {
+        this.regexMessage = regexMessage;
+    }
+    
+    /**
+     * Get a warning message if the regular expression is not matched.
+     * 
+     * @return the regex message
+     */
+    public final String getRegexMessage()
+    {
+        return regexMessage;
+    }
+    
+
+    /**
+     * Execute the rule.
+     *
+     * @param helper the helper
+     * @throws EnforcerRuleException the enforcer rule exception
+     */
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        Object propValue = resolveValue( helper );
+
+        // Check that the property is not null or empty string
+        if ( propValue == null )
+        {
+            String message = getMessage();
+            if ( message == null )
+            {
+                message = getName() + " \"" + getPropertyName() + "\" is required for this build.";
+            }
+            throw new EnforcerRuleException( message );
+        }
+        // If there is a regex, check that the property matches it
+        if ( regex != null && !propValue.toString().matches( regex ) )
+        {
+            if ( regexMessage == null )
+            {
+                regexMessage = getName() + " \"" + getPropertyName() + "\" evaluates to \"" + propValue + "\".  "
+                    + "This does not match the regular expression \"" + regex + "\"";
+            }
+            throw new EnforcerRuleException( regexMessage );
+        }
+    }
+
+    /**
+     * How the property that is being evaluated is called
+     */
+    public abstract String getName();
+
+    /**
+     * The name of the property currently being evaluated, this is used for default message pourpouses only
+     */
+    public abstract String getPropertyName();
+
+    /**
+     * Resolves the property value
+     *
+     * @param helper
+     * @throws EnforcerRuleException
+     */
+    public abstract Object resolveValue( EnforcerRuleHelper helper )
+        throws EnforcerRuleException;
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
index 8ed709b..57d514d 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
@@ -21,7 +21,7 @@ package org.apache.maven.plugins.enforcer;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.Iterator;
+import java.util.List;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRule;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
@@ -37,10 +37,10 @@ public abstract class AbstractRequireFiles
 {
 
     /** Array of files to check. */
-    File[] files;
+    private File[] files;
 
     /** if null file handles should be allowed. If they are allowed, it means treat it as a success. */
-    boolean allowNulls = false;
+    private boolean allowNulls = false;
 
     // check the file for the specific condition
     /**
@@ -69,37 +69,37 @@ public abstract class AbstractRequireFiles
     {
 
         if ( !allowNulls && files.length == 0 )
-    	{
+        {
             throw new EnforcerRuleException( "The file list is empty and Null files are disabled." );
-    	}
+        }
 
-        ArrayList failures = new ArrayList();
-        for ( int i = 0; i < files.length; i++ )
+        List<File> failures = new ArrayList<File>();
+        for ( File file : files )
         {
-            if ( !allowNulls && files[i] == null )
-        	{
-                failures.add( files[i] );
-        	}
-        	else if ( !checkFile( files[i] ) )
+            if ( !allowNulls && file == null )
+            {
+                failures.add( file );
+            }
+            else if ( !checkFile( file ) )
             {
-                failures.add( files[i] );
+                failures.add( file );
             }
         }
 
         // if anything was found, log it with the optional message.
         if ( !failures.isEmpty() )
         {
-            StringBuffer buf = new StringBuffer();
+            String message = getMessage();
+            
+            StringBuilder buf = new StringBuilder();
             if ( message != null )
             {
                 buf.append( message + "\n" );
             }
             buf.append( getErrorMsg() );
 
-            Iterator iter = failures.iterator();
-            while ( iter.hasNext() )
+            for ( File file : failures )
             {
-                File file = (File) iter.next();
                 if ( file != null )
                 {
                     buf.append( file.getAbsolutePath() + "\n" );
@@ -174,4 +174,24 @@ public abstract class AbstractRequireFiles
     {
         return true;
     }
+
+    public File[] getFiles()
+    {
+        return files;
+    }
+
+    public void setFiles( File[] files )
+    {
+        this.files = files;
+    }
+
+    public boolean isAllowNulls()
+    {
+        return allowNulls;
+    }
+
+    public void setAllowNulls( boolean allowNulls )
+    {
+        this.allowNulls = allowNulls;
+    }
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
index 5594174..7f6d3e7 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
@@ -19,16 +19,49 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
+import org.apache.maven.enforcer.rule.api.EnforcerLevel;
+import org.apache.maven.enforcer.rule.api.EnforcerRule2;
 
 /**
  * The Class AbstractStandardEnforcerRule.
  */
 public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
+    implements EnforcerRule2
 {
 
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
+    /**
+     * Specify a friendly message if the rule fails.
+     *
+     * @see {@link #setMessage(String)}
+     * @see {@link #getMessage()}
+     */
+    private String message;
+
+    private EnforcerLevel level = EnforcerLevel.ERROR;
+
+    public final void setMessage( String message )
+    {
+        this.message = message;
+    }
+
+    public final String getMessage()
+    {
+        return message;
+    }
+
+    /**
+     * Returns the level of enforcement.
+     *
+     * @return level
+     */
+    public EnforcerLevel getLevel()
+    {
+        return level;
+    }
+
+    public void setLevel( EnforcerLevel level )
+    {
+        this.level = level;
+    }
 
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java
index 0ce0e49..6e61797 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java
@@ -19,7 +19,7 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import java.util.Iterator;
+import java.util.List;
 
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
@@ -27,7 +27,6 @@ import org.apache.maven.artifact.versioning.Restriction;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.enforcer.rule.api.EnforcerRule;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
-import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -35,7 +34,7 @@ import org.codehaus.plexus.util.StringUtils;
  * Contains the common code to compare a version against a version range.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: AbstractVersionEnforcer.java 805190 2009-08-17 22:30:49Z hboutemy $
+ * @version $Id: AbstractVersionEnforcer.java 1791757 2017-04-18 07:52:22Z khmarbaise $
  */
 public abstract class AbstractVersionEnforcer
     extends AbstractStandardEnforcerRule
@@ -50,8 +49,11 @@ public abstract class AbstractVersionEnforcer
      * <li><code>[2.0.5,)</code> Versions 2.0.5 and higher</li>
      * <li><code>(,2.0.5],[2.1.1,)</code> Versions up to 2.0.5 (included) and 2.1.1 or higher</li>
      * </ul>
+     * 
+     * @see {@link #setVersion(String)}
+     * @see {@link #getVersion()}
      */
-    public String version = null;
+    private String version;
 
     /**
      * Compares the specified version to see if it is allowed by the defined version range.
@@ -60,11 +62,12 @@ public abstract class AbstractVersionEnforcer
      * @param variableName name of variable to use in messages (Example: "Maven" or "Java" etc).
      * @param requiredVersionRange range of allowed versions.
      * @param actualVersion the version to be checked.
-     * @throws MojoExecutionException if the version is not allowed.
      * @throws EnforcerRuleException the enforcer rule exception
      */
+    // CHECKSTYLE_OFF: LineLength
     public void enforceVersion( Log log, String variableName, String requiredVersionRange, ArtifactVersion actualVersion )
         throws EnforcerRuleException
+    // CHECKSTYLE_ON: LineLength
     {
         if ( StringUtils.isEmpty( requiredVersionRange ) )
         {
@@ -93,6 +96,8 @@ public abstract class AbstractVersionEnforcer
                     }
                     else
                     {
+                        String message = getMessage();
+
                         if ( StringUtils.isEmpty( message ) )
                         {
                             message = msg + " is not in the allowed range " + vr + ".";
@@ -103,8 +108,8 @@ public abstract class AbstractVersionEnforcer
                 }
                 catch ( InvalidVersionSpecificationException e )
                 {
-                    throw new EnforcerRuleException( "The requested " + variableName + " version " +
-                        requiredVersionRange + " is invalid.", e );
+                    throw new EnforcerRuleException( "The requested " + variableName + " version "
+                        + requiredVersionRange + " is invalid.", e );
                 }
             }
         }
@@ -125,19 +130,20 @@ public abstract class AbstractVersionEnforcer
         ArtifactVersion recommendedVersion = allowedRange.getRecommendedVersion();
         if ( recommendedVersion == null )
         {
-
-            for ( Iterator i = allowedRange.getRestrictions().iterator(); i.hasNext() && !matched; )
+            List<Restriction> restrictions = allowedRange.getRestrictions();
+            for ( Restriction restriction : restrictions )
             {
-                Restriction restriction = (Restriction) i.next();
                 if ( restriction.containsVersion( theVersion ) )
                 {
                     matched = true;
+                    break;
                 }
             }
         }
         else
         {
             // only singular versions ever have a recommendedVersion
+            @SuppressWarnings( "unchecked" )
             int compareTo = recommendedVersion.compareTo( theVersion );
             matched = ( compareTo <= 0 );
         }
@@ -146,7 +152,6 @@ public abstract class AbstractVersionEnforcer
 
     /*
      * (non-Javadoc)
-     *
      * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
      */
     public String getCacheId()
@@ -165,7 +170,6 @@ public abstract class AbstractVersionEnforcer
 
     /*
      * (non-Javadoc)
-     *
      * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
      */
     public boolean isCacheable()
@@ -176,8 +180,8 @@ public abstract class AbstractVersionEnforcer
 
     /*
      * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     * @see
+     * org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
      */
     public boolean isResultValid( EnforcerRule theCachedRule )
     {
@@ -191,17 +195,24 @@ public abstract class AbstractVersionEnforcer
      *
      * @return the required version
      */
-    public String getVersion()
+    public final String getVersion()
     {
         return this.version;
     }
 
     /**
-     * Sets the required version.
+     * Specify the required version. Some examples are:
+     * <ul>
+     * <li><code>2.0.4</code> Version 2.0.4 and higher (different from Maven meaning)</li>
+     * <li><code>[2.0,2.1)</code> Versions 2.0 (included) to 2.1 (not included)</li>
+     * <li><code>[2.0,2.1]</code> Versions 2.0 to 2.1 (both included)</li>
+     * <li><code>[2.0.5,)</code> Versions 2.0.5 and higher</li>
+     * <li><code>(,2.0.5],[2.1.1,)</code> Versions up to 2.0.5 (included) and 2.1.1 or higher</li>
+     * </ul>
      *
      * @param theVersion the required version to set
      */
-    public void setVersion( String theVersion )
+    public final void setVersion( String theVersion )
     {
         this.version = theVersion;
     }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java
index 271dd0c..303cfa4 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java
@@ -37,10 +37,12 @@ public class AlwaysFail
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
+        String message = getMessage();
+        
         StringBuffer buf = new StringBuffer();
         if ( message != null )
         {
-            buf.append( message + "\n" );
+            buf.append( message ).append( '\n' );
         }
         buf.append( "Always fails!" );
         throw new EnforcerRuleException( buf.toString() );
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysPass.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysPass.java
index 13a374a..2e774da 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysPass.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysPass.java
@@ -38,10 +38,13 @@ public class AlwaysPass
         throws EnforcerRuleException
     {
         final Log log = helper.getLog();
+        
+        String message = getMessage();
+        
         StringBuffer buf = new StringBuffer();
         if ( message != null )
         {
-            buf.append( message + "\n" );
+            buf.append( message ).append( '\n' );
         }
         buf.append( "Always pass!" );
         log.info( buf.toString() );
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java
new file mode 100644
index 0000000..ae7e58f
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java
@@ -0,0 +1,151 @@
+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 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.DistributionManagementCheck;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+
+/**
+ * This rule will check if a pom contains a <code>distributionManagement</code> part. This should be by best practice
+ * only defined once. It could happen that you like to check the parent as well. This can be activated by using the
+ * <code>ignoreParent</code> which is by default turned off (<code>true</code>) which means not to check the parent.
+ * 
+ * @author Karl Heinz Marbaise
+ * @since 1.4
+ */
+public class BanDistributionManagement
+    extends AbstractNonCacheableEnforcerRule
+{
+
+    /**
+     * If we turn on the <code>ignoreParent</code> the parent will be ignored.
+     * @deprecated
+     */
+    private boolean ignoreParent = true;
+
+    /**
+     * Allow using a repository entry in the distributionManagement area.
+     */
+    private boolean allowRepository = false;
+
+    /**
+     * Allow snapshotRepository entry in the distributionManagement area.
+     */
+    private boolean allowSnapshotRepository = false;
+
+    /**
+     * Allow site entry in the distributionManagement area.
+     */
+    private boolean allowSite = false;
+
+    private Log logger;
+
+    /**
+     * {@inheritDoc}
+     */
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        logger = helper.getLog();
+
+        try
+        {
+            MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+
+            if ( project.isExecutionRoot() )
+            {
+                if ( project.getParent() == null )
+                {
+                    // Does it make sense to check something? If yes please make a JIRA ticket for it.
+                    logger.debug( "We have no parent and in the root of a build we don't check anything," );
+                    logger.debug( "because that is the location where we defined maven-enforcer-plugin." );
+                }
+                else
+                {
+                    logger.debug( "We are in the root of the execution and we have a parent." );
+
+                    DistributionManagementCheck check = new DistributionManagementCheck( project );
+                    check.execute( isAllowRepository(), isAllowSnapshotRepository(), isAllowSite() );
+                }
+            }
+            else
+            {
+                logger.debug( "We are in a deeper level." );
+                DistributionManagementCheck check = new DistributionManagementCheck( project );
+                check.execute( isAllowRepository(), isAllowSnapshotRepository(), isAllowSite() );
+
+                if ( !isIgnoreParent() )
+                {
+                    logger.warn( "You have configured not to ignore the parent." );
+                    logger.warn( "This configuration is deprecated and will be ignored." );
+                }
+            }
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            throw new EnforcerRuleException( e.getMessage(), e );
+        }
+    }
+
+    public boolean isIgnoreParent()
+    {
+        return ignoreParent;
+    }
+
+    public void setIgnoreParent( boolean ignoreParent )
+    {
+        this.ignoreParent = ignoreParent;
+    }
+
+    public boolean isAllowRepository()
+    {
+        return allowRepository;
+    }
+
+    public void setAllowRepository( boolean allowRepository )
+    {
+        this.allowRepository = allowRepository;
+    }
+
+    public boolean isAllowSnapshotRepository()
+    {
+        return allowSnapshotRepository;
+    }
+
+    public void setAllowSnapshotRepository( boolean allowSnapshotRepository )
+    {
+        this.allowSnapshotRepository = allowSnapshotRepository;
+    }
+
+    public boolean isAllowSite()
+    {
+        return allowSite;
+    }
+
+    public void setAllowSite( boolean allowSite )
+    {
+        this.allowSite = allowSite;
+    }
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDuplicatePomDependencyVersions.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDuplicatePomDependencyVersions.java
new file mode 100644
index 0000000..3018f64
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDuplicatePomDependencyVersions.java
@@ -0,0 +1,217 @@
+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.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Profile;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+/**
+ * Since Maven 3 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique. Early versions of Maven
+ * 3 already warn, this rule can force to break a build for this reason.
+ * 
+ * @author Robert Scholte
+ * @since 1.3
+ */
+public class BanDuplicatePomDependencyVersions
+    extends AbstractNonCacheableEnforcerRule
+{
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        // get the project
+        MavenProject project;
+        try
+        {
+            project = (MavenProject) helper.evaluate( "${project}" );
+        }
+        catch ( ExpressionEvaluationException eee )
+        {
+            throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", eee );
+        }
+
+        // re-read model, because M3 uses optimized model
+        MavenXpp3Reader modelReader = new MavenXpp3Reader();
+        FileReader pomReader = null;
+        Model model;
+        try
+        {
+            pomReader = new FileReader( project.getFile() );
+
+            model = modelReader.read( pomReader );
+        }
+        catch ( FileNotFoundException e )
+        {
+            throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", e );
+        }
+        catch ( IOException e )
+        {
+            throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", e );
+        }
+        finally
+        {
+            IOUtil.close( pomReader );
+        }
+
+        // @todo reuse ModelValidator when possible
+
+        // Object modelValidator = null;
+        // try
+        // {
+        // modelValidator = helper.getComponent( "org.apache.maven.model.validation.ModelValidator" );
+        // }
+        // catch ( ComponentLookupException e1 )
+        // {
+        // // noop
+        // }
+
+        // if( modelValidator == null )
+        // {
+        maven2Validation( helper, model );
+        // }
+        // else
+        // {
+        // }
+    }
+
+    private void maven2Validation( EnforcerRuleHelper helper, Model model )
+        throws EnforcerRuleException
+    {
+        List<Dependency> dependencies = model.getDependencies();
+        Map<String, Integer> duplicateDependencies = validateDependencies( dependencies );
+
+        int duplicates = duplicateDependencies.size();
+
+        StringBuilder summary = new StringBuilder();
+        messageBuilder( duplicateDependencies, "dependencies.dependency", summary );
+
+        if ( model.getDependencyManagement() != null )
+        {
+            List<Dependency> managementDependencies = model.getDependencies();
+            Map<String, Integer> duplicateManagementDependencies = validateDependencies( managementDependencies );
+            duplicates += duplicateManagementDependencies.size();
+
+            messageBuilder( duplicateManagementDependencies, "dependencyManagement.dependencies.dependency", summary );
+        }
+
+        List<Profile> profiles = model.getProfiles();
+        for ( Profile profile : profiles )
+        {
+            List<Dependency> profileDependencies = profile.getDependencies();
+
+            Map<String, Integer> duplicateProfileDependencies = validateDependencies( profileDependencies );
+
+            duplicates += duplicateProfileDependencies.size();
+
+            messageBuilder( duplicateProfileDependencies, "profiles.profile[" + profile.getId()
+                + "].dependencies.dependency", summary );
+
+            if ( model.getDependencyManagement() != null )
+            {
+                List<Dependency> profileManagementDependencies = profile.getDependencies();
+
+                Map<String, Integer> duplicateProfileManagementDependencies =
+                    validateDependencies( profileManagementDependencies );
+
+                duplicates += duplicateProfileManagementDependencies.size();
+
+                messageBuilder( duplicateProfileManagementDependencies, "profiles.profile[" + profile.getId()
+                    + "].dependencyManagement.dependencies.dependency", summary );
+            }
+        }
+
+        if ( summary.length() > 0 )
+        {
+            StringBuilder message = new StringBuilder();
+            message.append( "Found " )
+                .append( duplicates )
+                .append( " duplicate dependency " );
+            message.append( duplicateDependencies.size() == 1 ? "declaration" : "declarations" )
+                .append( " in this project:\n" );
+            message.append( summary );
+            throw new EnforcerRuleException( message.toString() );
+        }
+    }
+
+    private void messageBuilder( Map<String, Integer> duplicateDependencies, String prefix, StringBuilder message )
+    {
+        if ( !duplicateDependencies.isEmpty() )
+        {
+            for ( Map.Entry<String, Integer> entry : duplicateDependencies.entrySet() )
+            {
+                message.append( " - " )
+                    .append( prefix )
+                    .append( '[' )
+                    .append( entry.getKey() )
+                    .append( "] ( " )
+                    .append( entry.getValue() )
+                    .append( " times )\n" );
+            }
+        }
+    }
+
+    private Map<String, Integer> validateDependencies( List<Dependency> dependencies )
+        throws EnforcerRuleException
+    {
+        Map<String, Integer> duplicateDeps = new HashMap<String, Integer>();
+        Set<String> deps = new HashSet<String>();
+        for ( Dependency dependency : dependencies )
+        {
+            String key = dependency.getManagementKey();
+
+            if ( deps.contains( key ) )
+            {
+                int times = 1;
+                if ( duplicateDeps.containsKey( key ) )
+                {
+                    times = duplicateDeps.get( key );
+                }
+                duplicateDeps.put( key, times + 1 );
+            }
+            else
+            {
+                deps.add( key );
+            }
+        }
+        return duplicateDeps;
+    }
+
+}
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
new file mode 100644
index 0000000..c40e057
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java
@@ -0,0 +1,202 @@
+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.util.Collections;
+import java.util.List;
+
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+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.MavenProject;
+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;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.logging.console.ConsoleLogger;
+
+/**
+ * This rule bans all transitive dependencies. There is a configuration option to exclude certain artifacts from being
+ * checked.
+ * 
+ * @author Jakub Senko
+ */
+public class BanTransitiveDependencies
+    extends AbstractNonCacheableEnforcerRule
+    implements EnforcerRule
+{
+
+    private EnforcerRuleHelper helper;
+
+    /**
+     * Specify the dependencies that will be ignored. This can be a list of artifacts in the format
+     * <code>groupId[:artifactId][:version][:type][:scope]</code>. Wildcard '*' can be used to in place of specific
+     * section (ie group:*:1.0 will match both 'group:artifact:1.0' and 'group:anotherArtifact:1.0') <br>
+     * You can override this patterns by using includes. Version is a string representing standard maven version range.
+     * Empty patterns will be ignored.
+     */
+    private List<String> excludes;
+
+    /**
+     * Specify the dependencies that will be checked. These are exceptions to excludes intended for more convenient and
+     * finer settings. This can be a list of artifacts in the format
+     * <code>groupId[:artifactId][:version][:type][:scope]</code>. Wildcard '*' can be used to in place of specific
+     * section (ie group:*:1.0 will match both 'group:artifact:1.0' and 'group:anotherArtifact:1.0') <br>
+     * Version is a string representing standard maven version range. Empty patterns will be ignored.
+     */
+    private List<String> includes;
+
+    /**
+     * Searches dependency tree recursively for transitive dependencies that are not excluded, while generating nice
+     * info message along the way.
+     * 
+     * @throws InvalidVersionSpecificationException
+     */
+    private static boolean searchTree( DependencyNode node, int level, ArtifactMatcher excludes, StringBuilder message )
+        throws InvalidVersionSpecificationException
+    {
+
+        List<DependencyNode> children = node.getChildren();
+
+        /*
+         * if the node is deeper than direct dependency and is empty, it is transitive.
+         */
+        boolean hasTransitiveDependencies = level > 1;
+
+        boolean excluded = false;
+
+        /*
+         * holds recursive message from children, will be appended to current message if this node has any transitive
+         * descendants if message is null, don't generate recursive message.
+         */
+        StringBuilder messageFromChildren = message == null ? null : new StringBuilder();
+
+        if ( excludes.match( node.getArtifact() ) )
+        {
+            // is excluded, we don't care about descendants
+            excluded = true;
+            hasTransitiveDependencies = false;
+        }
+        else
+        {
+            for ( DependencyNode childNode : children )
+            {
+                /*
+                 * if any of the children has transitive d. so does the parent
+                 */
+                hasTransitiveDependencies =
+                    ( searchTree( childNode, level + 1, excludes, messageFromChildren ) || hasTransitiveDependencies );
+            }
+        }
+
+        if ( ( excluded || hasTransitiveDependencies ) && message != null ) // then generate message
+        {
+            for ( int i = 0; i < level; i++ )
+            {
+                message.append( "   " );
+            }
+
+            message.append( node.getArtifact() );
+
+            if ( excluded )
+            {
+                message.append( " [excluded]\n" );
+            }
+
+            if ( hasTransitiveDependencies )
+            {
+                if ( level == 1 )
+                {
+                    message.append( " has transitive dependencies:" );
+                }
+
+                message.append( "\n" ).append( messageFromChildren );
+            }
+        }
+
+        return hasTransitiveDependencies;
+    }
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        this.helper = helper;
+
+        if ( excludes == null )
+        {
+            excludes = Collections.emptyList();
+        }
+        if ( includes == null )
+        {
+            includes = Collections.emptyList();
+        }
+
+        final ArtifactMatcher exclusions = new ArtifactMatcher( excludes, includes );
+
+        DependencyNode rootNode = null;
+
+        try
+        {
+            MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+            rootNode = createDependencyGraphBuilder().buildDependencyGraph( project, null );
+        }
+        catch ( Exception e )
+        {
+            throw new EnforcerRuleException( "Error: Could not construct dependency tree.", e );
+        }
+
+        String message = getMessage();
+        StringBuilder generatedMessage = null;
+        if ( message == null )
+        {
+            generatedMessage = new StringBuilder();
+        }
+
+        try
+        {
+            if ( searchTree( rootNode, 0, exclusions, generatedMessage ) )
+            {
+                throw new EnforcerRuleException( message == null ? generatedMessage.toString() : message );
+            }
+        }
+        catch ( InvalidVersionSpecificationException e )
+        {
+            throw new EnforcerRuleException( "Error: Invalid version range.", e );
+        }
+
+    }
+
+    private DependencyGraphBuilder createDependencyGraphBuilder()
+        throws ComponentLookupException
+    {
+        // CHECKSTYLE_OFF: LineLength
+        DefaultDependencyGraphBuilder builder =
+            (DefaultDependencyGraphBuilder) helper.getContainer().lookup( DependencyGraphBuilder.class.getCanonicalName(),
+                                                                          "default" );
+        // CHECKSTYLE_ON: LineLength
+
+        builder.enableLogging( new ConsoleLogger( ConsoleLogger.LEVEL_DISABLED, "DefaultDependencyGraphBuilder" ) );
+
+        return builder;
+    }
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java
index 02fc751..ee3870d 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java
@@ -20,59 +20,68 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.plugin.logging.Log;
-import org.codehaus.plexus.util.StringUtils;
+import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher;
+import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher.Pattern;
 
 /**
  * This rule checks that lists of dependencies are not included.
- *
+ * 
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: BannedDependencies.java 1028164 2010-10-28 01:40:06Z brianf $
+ * @version $Id: BannedDependencies.java 1798818 2017-06-15 10:51:25Z stephenc $
  */
 public class BannedDependencies
     extends AbstractBanDependencies
 {
 
     /**
-     * Specify the banned dependencies. This can be a list of artifacts in the format <code>groupId[:artifactId][:version]</code>.
-     * Any of the sections can be a wildcard by using '*' (ie group:*:1.0) <br>
-     * The rule will fail if any dependency matches any exclude, unless it also matches an include rule.
+     * Specify the banned dependencies. This can be a list of artifacts in the format
+     * <code>groupId[:artifactId][:version]</code>. Any of the sections can be a wildcard 
+     * by using '*' (ie group:*:1.0) <br>
+     * The rule will fail if any dependency matches any exclude, unless it also matches 
+     * an include rule.
+     * 
+     * @see {@link #setExcludes(List)}
+     * @see {@link #getExcludes()}
      */
-    public List excludes = null;
+    private List<String> excludes = null;
 
     /**
-     * Specify the allowed dependencies. This can be a list of artifacts in the format <code>groupId[:artifactId][:version]</code>.
-     * Any of the sections can be a wildcard by using '*' (ie group:*:1.0) <br>
-     * Includes override the exclude rules. It is meant to allow wide exclusion rules with wildcards and still allow a
+     * Specify the allowed dependencies. This can be a list of artifacts in the format
+     * <code>groupId[:artifactId][:version]</code>. Any of the sections can be a wildcard 
+     * by using '*' (ie group:*:1.0) <br>
+     * Includes override the exclude rules. It is meant to allow wide exclusion rules 
+     * with wildcards and still allow a
      * smaller set of includes. <br>
      * For example, to ban all xerces except xerces-api -> exclude "xerces", include "xerces:xerces-api"
+     * 
+     * @see {@link #setIncludes(List)}
+     * @see {@link #getIncludes()}
      */
-    public List includes = null;
+    private List<String> includes = null;
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.plugin.enforcer.AbstractBanDependencies#checkDependencies(java.util.Set)
+    /**
+     * {@inheritDoc}
      */
-    protected Set checkDependencies( Set theDependencies, Log log )
+    protected Set<Artifact> checkDependencies( Set<Artifact> theDependencies, Log log )
         throws EnforcerRuleException
     {
-        Set excluded = checkDependencies( theDependencies, excludes );
+
+        Set<Artifact> excluded = checkDependencies( theDependencies, excludes );
 
         // anything specifically included should be removed
         // from the ban list.
         if ( excluded != null )
         {
-            Set included = checkDependencies( theDependencies, includes );
+            Set<Artifact> included = checkDependencies( theDependencies, includes );
+
             if ( included != null )
             {
                 excluded.removeAll( included );
@@ -84,39 +93,34 @@ public class BannedDependencies
 
     /**
      * Checks the set of dependencies against the list of patterns.
-     *
+     * 
      * @param thePatterns the patterns
      * @param dependencies the dependencies
      * @return a set containing artifacts matching one of the patterns or <code>null</code>
      * @throws EnforcerRuleException the enforcer rule exception
      */
-    private Set checkDependencies( Set dependencies, List thePatterns )
+    private Set<Artifact> checkDependencies( Set<Artifact> dependencies, List<String> thePatterns )
         throws EnforcerRuleException
     {
-        Set foundMatches = null;
+        Set<Artifact> foundMatches = null;
 
         if ( thePatterns != null && thePatterns.size() > 0 )
         {
 
-            Iterator iter = thePatterns.iterator();
-            while ( iter.hasNext() )
+            for ( String pattern : thePatterns )
             {
-                String pattern = (String) iter.next();
-
                 String[] subStrings = pattern.split( ":" );
                 subStrings = StringUtils.stripAll( subStrings );
+                String resultPattern = StringUtils.join( subStrings, ":" );
 
-                Iterator dependencyIter = dependencies.iterator();
-                while ( dependencyIter.hasNext() )
+                for ( Artifact artifact : dependencies )
                 {
-                    Artifact artifact = (Artifact) dependencyIter.next();
-
-                    if ( compareDependency( subStrings, artifact ) )
+                    if ( compareDependency( resultPattern, artifact ) )
                     {
                         // only create if needed
                         if ( foundMatches == null )
                         {
-                            foundMatches = new HashSet();
+                            foundMatches = new HashSet<Artifact>();
                         }
                         foundMatches.add( artifact );
                     }
@@ -127,69 +131,27 @@ public class BannedDependencies
     }
 
     /**
-     * Compares the parsed array of substrings against the artifact.
-     * The pattern should follow the format "groupId:artifactId:version:type:scope"
-     *
-     * @param pattern the array of patterns
+     * Compares the given pattern against the given artifact. The pattern should follow the format
+     * <code>groupId:artifactId:version:type:scope:classifier</code>.
+     * 
+     * @param pattern The pattern to compare the artifact with.
      * @param artifact the artifact
      * @return <code>true</code> if the artifact matches one of the patterns
      * @throws EnforcerRuleException the enforcer rule exception
      */
-    protected boolean compareDependency( String[] pattern, Artifact artifact )
+    protected boolean compareDependency( String pattern, Artifact artifact )
         throws EnforcerRuleException
     {
 
-        boolean result = false;
-        if ( pattern.length > 0 )
+        ArtifactMatcher.Pattern am = new Pattern( pattern );
+        boolean result;
+        try
         {
-            result = pattern[0].equals( "*" ) || artifact.getGroupId().equals( pattern[0] );
+            result = am.match( artifact );
         }
-
-        if ( result && pattern.length > 1 )
+        catch ( InvalidVersionSpecificationException e )
         {
-            result = pattern[1].equals( "*" ) || artifact.getArtifactId().equals( pattern[1] );
-        }
-
-        if ( result && pattern.length > 2 )
-        {
-            // short circuit if the versions are exactly the same
-            if ( pattern[2].equals( "*" ) || artifact.getVersion().equals( pattern[2] ) )
-            {
-                result = true;
-            }
-            else
-            {
-                try
-                {
-                    result =
-                        AbstractVersionEnforcer.containsVersion( VersionRange.createFromVersionSpec( pattern[2] ),
-                                                                 new DefaultArtifactVersion( artifact.getBaseVersion() ) );
-                }
-                catch ( InvalidVersionSpecificationException e )
-                {
-                    throw new EnforcerRuleException( "Invalid Version Range: ", e );
-                }
-            }
-        }
-
-        if ( result && pattern.length > 3 )
-        {
-            String type = artifact.getType();
-            if ( type == null || type.equals( "" ) )
-            {
-                type = "jar";
-            }
-            result = pattern[3].equals( "*" ) || type.equals( pattern[3] );
-        }
-
-        if ( result && pattern.length > 4 )
-        {
-            String scope = artifact.getScope();
-            if ( scope == null || scope.equals( "" ) )
-            {
-                scope = "compile";
-            }
-            result = pattern[4].equals( "*" ) || scope.equals( pattern[4] );
+            throw new EnforcerRuleException( "Invalid Version Range: ", e );
         }
 
         return result;
@@ -197,40 +159,53 @@ public class BannedDependencies
 
     /**
      * Gets the excludes.
-     *
+     * 
      * @return the excludes
      */
-    public List getExcludes()
+    public List<String> getExcludes()
     {
         return this.excludes;
     }
 
     /**
-     * Sets the excludes.
-     *
+     * Specify the banned dependencies. This can be a list of artifacts in the format
+     * <code>groupId[:artifactId][:version]</code>. Any of the sections can be a wildcard 
+     * by using '*' (ie group:*:1.0) <br>
+     * The rule will fail if any dependency matches any exclude, unless it also matches an 
+     * include rule.
+     * 
+     * @see #getExcludes()
      * @param theExcludes the excludes to set
      */
-    public void setExcludes( List theExcludes )
+    public void setExcludes( List<String> theExcludes )
     {
         this.excludes = theExcludes;
     }
 
     /**
      * Gets the includes.
-     *
+     * 
      * @return the includes
      */
-    public List getIncludes()
+    public List<String> getIncludes()
     {
         return this.includes;
     }
 
     /**
-     * Sets the includes.
-     *
+     * Specify the allowed dependencies. This can be a list of artifacts in the format
+     * <code>groupId[:artifactId][:version]</code>. Any of the sections can be a wildcard 
+     * by using '*' (ie group:*:1.0) <br>
+     * Includes override the exclude rules. It is meant to allow wide exclusion rules with 
+     * wildcards and still allow a
+     * smaller set of includes. <br>
+     * For example, to ban all xerces except xerces-api → exclude "xerces",
+     * include "xerces:xerces-api"
+     * 
+     * @see #setIncludes(List)
      * @param theIncludes the includes to set
      */
-    public void setIncludes( List theIncludes )
+    public void setIncludes( List<String> theIncludes )
     {
         this.includes = theIncludes;
     }
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 18262b1..a6f4b88 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
@@ -33,7 +33,7 @@ public class BannedPlugins
     extends BannedDependencies
 {
 
-    protected Set getDependenciesToCheck( MavenProject project )
+    protected Set<Artifact> getDependenciesToCheck( MavenProject project )
     {
         return project.getPluginArtifacts();
     }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java
new file mode 100644
index 0000000..40fb0e3
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java
@@ -0,0 +1,220 @@
+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.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * This rule checks that this project's maven session whether have banned repositories.
+ * 
+ * @author <a href="mailto:wangyf2010 at gmail.com">Simon Wang</a>
+ */
+public class BannedRepositories
+    extends AbstractNonCacheableEnforcerRule
+{
+
+    // ----------------------------------------------------------------------
+    // Mojo parameters
+    // ----------------------------------------------------------------------
+
+    /**
+     * Specify explicitly banned non-plugin repositories. This is a list of repository url patterns. Support wildcard
+     * "*".
+     * 
+     * @see {@link #setBannedRepositories(List)}
+     */
+    private List<String> bannedRepositories = Collections.emptyList();
+
+    /**
+     * Specify explicitly banned plugin repositories. This is a list of repository url patterns. Support wildcard "*".
+     * 
+     * @see {@link #setBannedPluginRepositories(List)}
+     */
+    private List<String> bannedPluginRepositories = Collections.emptyList();
+
+    /**
+     * Specify explicitly allowed non-plugin repositories, then all others repositories would be banned. This is a list
+     * of repository url patterns. Support wildcard "*".
+     * 
+     * @see {@link #setAllowedRepositories(List)}
+     */
+    private List<String> allowedRepositories = Collections.emptyList();
+
+    /**
+     * Specify explicitly allowed plugin repositories, then all others repositories would be banned. This is a list of
+     * repository url patterns. Support wildcard "*".
+     * 
+     * @see {@link #setAllowedPluginRepositories(List)}
+     */
+    private List<String> allowedPluginRepositories = Collections.emptyList();
+
+    // ----------------------------------------------------------------------
+    // Public methods
+    // ----------------------------------------------------------------------
+
+    /*
+     * (non-Javadoc)
+     * @see
+     * org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
+     */
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        MavenProject project;
+        try
+        {
+            project = (MavenProject) helper.evaluate( "${project}" );
+
+            List<ArtifactRepository> resultBannedRepos =
+                checkRepositories( project.getRemoteArtifactRepositories(), this.allowedRepositories,
+                                   this.bannedRepositories );
+
+            List<ArtifactRepository> resultBannedPluginRepos =
+                checkRepositories( project.getPluginArtifactRepositories(), this.allowedPluginRepositories,
+                                   this.bannedPluginRepositories );
+
+            String repoErrMsg = populateErrorMessage( resultBannedRepos, " " );
+            String pluginRepoErrMsg = populateErrorMessage( resultBannedPluginRepos, " plugin " );
+
+            String errMsg = repoErrMsg + pluginRepoErrMsg;
+
+            if ( errMsg != null && !StringUtils.isEmpty( errMsg.toString() ) )
+            {
+                throw new EnforcerRuleException( errMsg.toString() );
+            }
+
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            throw new EnforcerRuleException( e.getLocalizedMessage() );
+        }
+    }
+
+    // ----------------------------------------------------------------------
+    // Protected methods
+    // ----------------------------------------------------------------------
+
+    protected void setBannedRepositories( List<String> bannedRepositories )
+    {
+        this.bannedRepositories = bannedRepositories;
+    }
+
+    protected void setBannedPluginRepositories( List<String> bannedPluginRepositories )
+    {
+        this.bannedPluginRepositories = bannedPluginRepositories;
+    }
+
+    protected void setAllowedRepositories( List<String> allowedRepositories )
+    {
+        this.allowedRepositories = allowedRepositories;
+    }
+
+    protected void setAllowedPluginRepositories( List<String> allowedPluginRepositories )
+    {
+        this.allowedPluginRepositories = allowedPluginRepositories;
+    }
+
+    // ----------------------------------------------------------------------
+    // Private methods
+    // ----------------------------------------------------------------------
+
+    /**
+     * Check whether specified repositories have banned repositories.
+     * 
+     * @param repositories: candidate repositories.
+     * @param includes : 'include' patterns.
+     * @param excludes : 'exclude' patterns.
+     * @return Banned repositories.
+     */
+    private List<ArtifactRepository> checkRepositories( List<ArtifactRepository> repositories, List<String> includes,
+                                                        List<String> excludes )
+    {
+        List<ArtifactRepository> bannedRepos = new ArrayList<ArtifactRepository>();
+
+        for ( ArtifactRepository repo : repositories )
+        {
+            String url = repo.getUrl().trim();
+            if ( includes.size() > 0 && !match( url, includes ) )
+            {
+                bannedRepos.add( repo );
+                continue;
+            }
+
+            if ( excludes.size() > 0 && match( url, excludes ) )
+            {
+                bannedRepos.add( repo );
+            }
+
+        }
+
+        return bannedRepos;
+    }
+
+    private boolean match( String url, List<String> patterns )
+    {
+        for ( String pattern : patterns )
+        {
+            if ( this.match( url, pattern ) )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private boolean match( String text, String pattern )
+    {
+        return text.matches( pattern.replace( "?", ".?" ).replace( "*", ".*?" ) );
+    }
+
+    private String populateErrorMessage( List<ArtifactRepository> resultBannedRepos, String errorMessagePrefix )
+    {
+        StringBuffer errMsg = new StringBuffer( "" );
+        if ( !resultBannedRepos.isEmpty() )
+        {
+            errMsg.append( "Current maven session contains banned" + errorMessagePrefix
+                + "repository urls, please double check your pom or settings.xml:\n"
+                + getRepositoryUrlString( resultBannedRepos ) + "\n\n" );
+        }
+
+        return errMsg.toString();
+    }
+
+    private String getRepositoryUrlString( List<ArtifactRepository> resultBannedRepos )
+    {
+        StringBuffer urls = new StringBuffer( "" );
+        for ( ArtifactRepository repo : resultBannedRepos )
+        {
+            urls.append( repo.getId() + " - " + repo.getUrl() + "\n" );
+        }
+        return urls.toString();
+    }
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java
index 07cbdbc..dd873e0 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java
@@ -36,23 +36,23 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupExcepti
  * session and provide useful elements like the log.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: DefaultEnforcementRuleHelper.java 805190 2009-08-17 22:30:49Z hboutemy $
+ * @version $Id: DefaultEnforcementRuleHelper.java 1634140 2014-10-24 21:23:01Z khmarbaise $
  */
 public class DefaultEnforcementRuleHelper
     implements EnforcerRuleHelper
 {
 
     /** The log. */
-    Log log;
+    private Log log;
 
     /** The evaluator. */
-    ExpressionEvaluator evaluator;
+    private ExpressionEvaluator evaluator;
 
     /** The session. */
-    MavenSession session;
+    private MavenSession session;
 
     /** The container. */
-    PlexusContainer container;
+    private PlexusContainer container;
 
     /**
      * Instantiates a new default enforcement rule helper.
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 fdaae0a..7c21bd6 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
@@ -1,4 +1,5 @@
 package org.apache.maven.plugins.enforcer;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,6 +18,7 @@ package org.apache.maven.plugins.enforcer;
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -43,148 +45,190 @@ import org.codehaus.plexus.i18n.I18N;
 /**
  * @author <a href="mailto:rex at e-hoffman.org">Rex Hoffman</a>
  */
-public class DependencyConvergence implements EnforcerRule {
-
-  private static Log log;
-
-  private static I18N i18n;
-  
-  /**
-   * Uses the {@link EnforcerRuleHelper} to populate the values of the {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
-   * factory method. <br/>
-   * 
-   * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
-   * 
-   * @param helper
-   * @return a Dependency Node which is the root of the project's dependency tree
-   * @throws EnforcerRuleException
-   */
-  private DependencyNode getNode(EnforcerRuleHelper helper) throws EnforcerRuleException {
-    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);
-      return node;
-    } catch (ExpressionEvaluationException e) {
-      throw new EnforcerRuleException("Unable to lookup an expression " + e.getLocalizedMessage(), e);
-    } catch (ComponentLookupException e){
-      throw new EnforcerRuleException("Unable to lookup a component " + e.getLocalizedMessage(), e);
-    } catch (DependencyTreeBuilderException e){
-      throw new EnforcerRuleException("Could not build dependency tree " + e.getLocalizedMessage(), e);
+public class DependencyConvergence
+    implements EnforcerRule
+{
+
+    private static Log log;
+
+    private static I18N i18n;
+
+    private boolean uniqueVersions;
+
+    public void setUniqueVersions( boolean uniqueVersions )
+    {
+        this.uniqueVersions = uniqueVersions;
     }
-  }
-  
-  public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
-    if (log == null){
-      log = helper.getLog();
-    } 
-    try {
-      if (i18n == null){
-        i18n = (I18N) helper.getComponent(I18N.class);
-      }
-      DependencyNode node = getNode(helper);
-      MavenProject project = (MavenProject) helper.evaluate("${project}");
-      DependencyVersionMap visitor = new DependencyVersionMap(project.getArtifact().isRelease(), log);
-      node.accept(visitor);
-      List<CharSequence> errorMsgs = new ArrayList<CharSequence>();
-      errorMsgs.addAll(getConvergenceErrorMsgs(visitor.getConflictedVersionNumbers()));
-      for (CharSequence errorMsg : errorMsgs) {
-        log.error(errorMsg);
-      }
-      if (errorMsgs.size() > 0) {
-        throw new EnforcerRuleException("Failed while enforcing releasability the error(s) are " + errorMsgs);
-      }
-    } catch (ExpressionEvaluationException e) {
-      throw new EnforcerRuleException("Unable to lookup an expression " + e.getLocalizedMessage(), e);
-    } catch (ComponentLookupException e){
-      throw new EnforcerRuleException("Unable to lookup a component " + e.getLocalizedMessage(), e);
-    } catch (Exception e){
-      throw new EnforcerRuleException(e.getLocalizedMessage(), e);
+
+    // CHECKSTYLE_OFF: LineLength
+    /**
+     * Uses the {@link EnforcerRuleHelper} to populate the values of the
+     * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
+     * factory method. <br/>
+     * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+     * 
+     * @param helper
+     * @return a Dependency Node which is the root of the project's dependency tree
+     * @throws EnforcerRuleException
+     */
+    // CHECKSTYLE_ON: LineLength
+    private DependencyNode getNode( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        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 );
+            return node;
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            throw new EnforcerRuleException( "Unable to lookup an expression " + e.getLocalizedMessage(), e );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+        }
+        catch ( DependencyTreeBuilderException e )
+        {
+            throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+        }
     }
-  }
-
-  private String getFullArtifactName(Artifact artifact){
-    return artifact.getGroupId() + ":" + artifact.getArtifactId() +":"+ artifact.getVersion();
-  }
-  
-  private StringBuilder buildTreeString(DependencyNode node) {
-    List<String> loc = new ArrayList<String>();
-    DependencyNode currentNode = node;
-    while (currentNode != null) {
-      loc.add(getFullArtifactName(currentNode.getArtifact()));
-      currentNode = currentNode.getParent();
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        if ( log == null )
+        {
+            log = helper.getLog();
+        }
+        try
+        {
+            if ( i18n == null )
+            {
+                i18n = (I18N) helper.getComponent( I18N.class );
+            }
+            DependencyNode node = getNode( helper );
+            DependencyVersionMap visitor = new DependencyVersionMap( log );
+            visitor.setUniqueVersions( uniqueVersions );
+            node.accept( visitor );
+            List<CharSequence> errorMsgs = new ArrayList<CharSequence>();
+            errorMsgs.addAll( getConvergenceErrorMsgs( visitor.getConflictedVersionNumbers() ) );
+            for ( CharSequence errorMsg : errorMsgs )
+            {
+                log.warn( errorMsg );
+            }
+            if ( errorMsgs.size() > 0 )
+            {
+                throw new EnforcerRuleException( "Failed while enforcing releasability. "
+                    + "See above detailed error message." );
+            }
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+        }
+        catch ( Exception e )
+        {
+            throw new EnforcerRuleException( e.getLocalizedMessage(), e );
+        }
     }
-    Collections.reverse(loc);
-    StringBuilder builder = new StringBuilder();
-    for (int i = 0; i < loc.size(); i++) {
-      for (int j = 0; j < i; j++){
-        builder.append("  ");
-      }
-      builder.append("+-"+loc.get(i));
-      builder.append("\n");
+
+    private String getFullArtifactName( Artifact artifact )
+    {
+        return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion();
     }
-    return builder;
-  }
 
-  private List<String> getConvergenceErrorMsgs(List<List<DependencyNode>> errors) {
-    List<String> errorMsgs = new ArrayList<String>();
-    for (List<DependencyNode> nodeList : errors){
-      errorMsgs.add(buildConvergenceErrorMsg(nodeList));
+    private StringBuilder buildTreeString( DependencyNode node )
+    {
+        List<String> loc = new ArrayList<String>();
+        DependencyNode currentNode = node;
+        while ( currentNode != null )
+        {
+            loc.add( getFullArtifactName( currentNode.getArtifact() ) );
+            currentNode = currentNode.getParent();
+        }
+        Collections.reverse( loc );
+        StringBuilder builder = new StringBuilder();
+        for ( int i = 0; i < loc.size(); i++ )
+        {
+            for ( int j = 0; j < i; j++ )
+            {
+                builder.append( "  " );
+            }
+            builder.append( "+-" + loc.get( i ) );
+            builder.append( "\n" );
+        }
+        return builder;
     }
-    return errorMsgs;
-  }
-
-  private String buildConvergenceErrorMsg(List<DependencyNode> nodeList){
-    StringBuilder builder = new StringBuilder();
-    builder.append("\nDependency convergence error for "+getFullArtifactName(nodeList.get(0).getArtifact())+" paths to dependency are:\n");
-    if (nodeList.size() > 0){
-      builder.append(buildTreeString(nodeList.get(0)));
+
+    private List<String> getConvergenceErrorMsgs( List<List<DependencyNode>> errors )
+    {
+        List<String> errorMsgs = new ArrayList<String>();
+        for ( List<DependencyNode> nodeList : errors )
+        {
+            errorMsgs.add( buildConvergenceErrorMsg( nodeList ) );
+        }
+        return errorMsgs;
+    }
+
+    private String buildConvergenceErrorMsg( List<DependencyNode> nodeList )
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.append( "\nDependency convergence error for " + getFullArtifactName( nodeList.get( 0 ).getArtifact() )
+            + " paths to dependency are:\n" );
+        if ( nodeList.size() > 0 )
+        {
+            builder.append( buildTreeString( nodeList.get( 0 ) ) );
+        }
+        for ( DependencyNode node : nodeList.subList( 1, nodeList.size() ) )
+        {
+            builder.append( "and\n" );
+            builder.append( buildTreeString( node ) );
+        }
+        return builder.toString();
+    }
+
+    /**
+     * If your rule is cacheable, you must return a unique id when parameters or conditions change that would cause the
+     * result to be different. Multiple cached results are stored based on their id. The easiest way to do this is to
+     * return a hash computed from the values of your parameters. If your rule is not cacheable, then the result here is
+     * not important, you may return anything.
+     */
+    public String getCacheId()
+    {
+        return "";
+    }
+
+    /**
+     * This tells the system if the results are cacheable at all. Keep in mind that during forked builds and other
+     * things, a given rule may be executed more than once for the same project. This means that even things that change
+     * from project to project may still be cacheable in certain instances.
+     */
+    public boolean isCacheable()
+    {
+        return false;
     }
-    for (DependencyNode node: nodeList.subList(1,nodeList.size())){
-      builder.append("and\n");
-      builder.append(buildTreeString(node));
+
+    /**
+     * If the rule is cacheable and the same id is found in the cache, the stored results are passed to this method to
+     * allow double checking of the results. Most of the time this can be done by generating unique ids, but sometimes
+     * the results of objects returned by the helper need to be queried. You may for example, store certain objects in
+     * your rule and then query them later.
+     * 
+     * @param rule
+     */
+    public boolean isResultValid( EnforcerRule rule )
+    {
+        return false;
     }
-    return builder.toString();
-  }
-  
-  /**
-   * If your rule is cacheable, you must return a unique id when parameters or
-   * conditions change that would cause the result to be different. Multiple
-   * cached results are stored based on their id.
-   * 
-   * The easiest way to do this is to return a hash computed from the values of
-   * your parameters.
-   * 
-   * If your rule is not cacheable, then the result here is not important, you
-   * may return anything.
-   */
-  public String getCacheId() {
-    return "";
-  }
-
-  /**
-   * This tells the system if the results are cacheable at all. Keep in mind
-   * that during forked builds and other things, a given rule may be executed
-   * more than once for the same project. This means that even things that
-   * change from project to project may still be cacheable in certain instances.
-   */
-  public boolean isCacheable() {
-    return false;
-  }
-
-  /**
-   * If the rule is cacheable and the same id is found in the cache, the stored
-   * results are passed to this method to allow double checking of the results.
-   * Most of the time this can be done by generating unique ids, but sometimes
-   * the results of objects returned by the helper need to be queried. You may
-   * for example, store certain objects in your rule and then query them later.
-   */
-  public boolean isResultValid(EnforcerRule arg0) {
-    return false;
-  }
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerExpressionEvaluator.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerExpressionEvaluator.java
index 1565a7c..0d13874 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerExpressionEvaluator.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerExpressionEvaluator.java
@@ -27,8 +27,8 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.path.PathTranslator;
 
 /**
- * The Class EnforcerExpressionEvaluator. This class wraps the PluginParameterExpressionEvaluator
- * because it can't be accessed directly in 2.0.x so we must create a new one.
+ * The Class EnforcerExpressionEvaluator. This class wraps the PluginParameterExpressionEvaluator because it can't be
+ * accessed directly in 2.0.x so we must create a new one.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
  */
@@ -39,9 +39,25 @@ public class EnforcerExpressionEvaluator
     /**
      * The Constructor.
      *
-     * @param theContext the the context
-     * @param thePathTranslator the the path translator
-     * @param theProject the the project
+     * @param theContext {@link MavenSession}
+     * @param thePathTranslator {@link PathTranslator}
+     * @param theProject {@link MavenProject}
+     * @param theExecution {@link MojoExecution}
+     */
+    public EnforcerExpressionEvaluator( MavenSession theContext, PathTranslator thePathTranslator,
+                                        MavenProject theProject, MojoExecution theExecution )
+    {
+        super( theContext, theExecution, thePathTranslator, null, theProject, theContext.getExecutionProperties() );
+    }
+
+    /**
+     * This constructor is kept for backward compatibility.
+     * 
+     * @param theContext {@link MavenSession}
+     * @param thePathTranslator {@link PathTranslator}
+     * @param theProject {@link MavenProject}
+     * 
+     * @deprecated Will be removed with 2.0
      */
     public EnforcerExpressionEvaluator( MavenSession theContext, PathTranslator thePathTranslator,
                                         MavenProject theProject )
@@ -49,5 +65,4 @@ public class EnforcerExpressionEvaluator
         super( theContext, new MojoExecution( new MojoDescriptor() ), thePathTranslator, null, theProject,
                theContext.getExecutionProperties() );
     }
-
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java
index 412afde..484861f 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java
@@ -38,10 +38,24 @@ public class EvaluateBeanshell
 {
 
     /** Beanshell interpreter. */
-    private static final Interpreter bsh = new Interpreter();
+    private static final Interpreter BSH = new Interpreter();
 
-    /** The condition to be evaluated. */
-    public String condition;
+    /** The condition to be evaluated.
+     *  
+     * @see {@link #setCondition(String)}
+     * @see {@link #getCondition()}
+     * */
+    private String condition;
+
+    public final void setCondition( String condition )
+    {
+        this.condition = condition;
+    }
+    
+    public final String getCondition()
+    {
+        return condition;
+    }
 
     /*
      * (non-Javadoc)
@@ -61,11 +75,12 @@ public class EvaluateBeanshell
             log.debug( "Echo script : " + script );
             if ( !evaluateCondition( script, log ) )
             {
+                String message = getMessage();
                 if ( StringUtils.isEmpty( message ) )
                 {
                     message = "The expression \"" + condition + "\" is not true.";
                 }
-                throw new EnforcerRuleException( this.message );
+                throw new EnforcerRuleException( message );
             }
         }
         catch ( ExpressionEvaluationException e )
@@ -88,7 +103,7 @@ public class EvaluateBeanshell
         Boolean evaluation = Boolean.FALSE;
         try
         {
-            evaluation = (Boolean) bsh.eval( script );
+            evaluation = (Boolean) BSH.eval( script );
             log.debug( "Echo evaluating : " + evaluation );
         }
         catch ( EvalError ex )
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/NoSnapshots.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/NoSnapshots.java
index bafe13d..8136c3b 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/NoSnapshots.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/NoSnapshots.java
@@ -21,6 +21,7 @@ package org.apache.maven.plugins.enforcer;
 
 import java.util.Set;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.plugin.logging.Log;
 
@@ -28,7 +29,7 @@ import org.apache.maven.plugin.logging.Log;
  * This rule is deprecated. Use requireReleaseVersions.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: NoSnapshots.java 987781 2010-08-21 16:23:40Z dennisl $
+ * @version $Id: NoSnapshots.java 1345332 2012-06-01 20:14:13Z rfscholte $
  * @deprecated replaced by {@link RequireReleaseDeps}
  */
 public class NoSnapshots
@@ -36,14 +37,9 @@ public class NoSnapshots
 {
 
     /**
-     * Checks the set of dependencies to see if any snapshots are included.
-     *
-     * @param dependencies the dependencies
-     * @param log the log
-     * @return the sets the
-     * @throws EnforcerRuleException the enforcer rule exception
+     * {@inheritDoc}
      */
-    protected Set checkDependencies( Set dependencies, Log log )
+    protected Set<Artifact> checkDependencies( Set<Artifact> dependencies, Log log )
         throws EnforcerRuleException
     {
         log.warn( "The \"NoSnapshots\" rule is deprecated. Use \"requireReleaseDeps\" instead" );
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/ReactorModuleConvergence.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/ReactorModuleConvergence.java
new file mode 100644
index 0000000..afc3717
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/ReactorModuleConvergence.java
@@ -0,0 +1,478 @@
+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.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * This rule will check if a multi module build will follow the best practices.
+ * 
+ * @author Karl-Heinz Marbaise
+ * @since 1.4
+ */
+public class ReactorModuleConvergence
+    extends AbstractNonCacheableEnforcerRule
+{
+    private boolean ignoreModuleDependencies = false;
+
+    private Log logger;
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        logger = helper.getLog();
+
+        MavenSession session;
+        try
+        {
+            session = (MavenSession) helper.evaluate( "${session}" );
+        }
+        catch ( ExpressionEvaluationException eee )
+        {
+            throw new EnforcerRuleException( "Unable to retrieve the MavenSession: ", eee );
+        }
+
+        List<MavenProject> sortedProjects = session.getSortedProjects();
+        if ( sortedProjects != null && !sortedProjects.isEmpty() )
+        {
+            checkReactor( sortedProjects );
+            checkParentsInReactor( sortedProjects );
+            checkMissingParentsInReactor( sortedProjects );
+            checkParentsPartOfTheReactor( sortedProjects );
+            if ( !isIgnoreModuleDependencies() )
+            {
+                checkDependenciesWithinReactor( sortedProjects );
+            }
+        }
+
+    }
+
+    private void checkParentsPartOfTheReactor( List<MavenProject> sortedProjects )
+        throws EnforcerRuleException
+    {
+        List<MavenProject> parentsWhichAreNotPartOfTheReactor =
+            existParentsWhichAreNotPartOfTheReactor( sortedProjects );
+        if ( !parentsWhichAreNotPartOfTheReactor.isEmpty() )
+        {
+            StringBuilder sb = new StringBuilder().append( SystemUtils.LINE_SEPARATOR );
+            addMessageIfExist( sb );
+            for ( MavenProject mavenProject : parentsWhichAreNotPartOfTheReactor )
+            {
+                sb.append( " module: " );
+                sb.append( mavenProject.getId() );
+                sb.append( SystemUtils.LINE_SEPARATOR );
+            }
+            throw new EnforcerRuleException( "Module parents have been found which could not be found in the reactor."
+                + sb.toString() );
+        }
+    }
+
+    /**
+     * Convenience method to create a user readable message.
+     * 
+     * @param sortedProjects The list of reactor projects.
+     * @throws EnforcerRuleException In case of a violation.
+     */
+    private void checkMissingParentsInReactor( List<MavenProject> sortedProjects )
+        throws EnforcerRuleException
+    {
+        List<MavenProject> modulesWithoutParentsInReactor = existModulesWithoutParentsInReactor( sortedProjects );
+        if ( !modulesWithoutParentsInReactor.isEmpty() )
+        {
+            StringBuilder sb = new StringBuilder().append( SystemUtils.LINE_SEPARATOR );
+            addMessageIfExist( sb );
+            for ( MavenProject mavenProject : modulesWithoutParentsInReactor )
+            {
+                sb.append( " module: " );
+                sb.append( mavenProject.getId() );
+                sb.append( SystemUtils.LINE_SEPARATOR );
+            }
+            throw new EnforcerRuleException( "Reactor contains modules without parents." + sb.toString() );
+        }
+    }
+
+    private void checkDependenciesWithinReactor( List<MavenProject> sortedProjects )
+        throws EnforcerRuleException
+    {
+        // After we are sure having consistent version we can simply use the first one?
+        String reactorVersion = sortedProjects.get( 0 ).getVersion();
+
+        Map<MavenProject, List<Dependency>> areThereDependenciesWhichAreNotPartOfTheReactor =
+            areThereDependenciesWhichAreNotPartOfTheReactor( reactorVersion, sortedProjects );
+        if ( !areThereDependenciesWhichAreNotPartOfTheReactor.isEmpty() )
+        {
+            StringBuilder sb = new StringBuilder().append( SystemUtils.LINE_SEPARATOR );
+            addMessageIfExist( sb );
+            // CHECKSTYLE_OFF: LineLength
+            for ( Entry<MavenProject, List<Dependency>> item : areThereDependenciesWhichAreNotPartOfTheReactor.entrySet() )
+            {
+                sb.append( " module: " );
+                sb.append( item.getKey().getId() );
+                sb.append( SystemUtils.LINE_SEPARATOR );
+                for ( Dependency dependency : item.getValue() )
+                {
+                    String id =
+                        dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion();
+                    sb.append( "    dependency: " );
+                    sb.append( id );
+                    sb.append( SystemUtils.LINE_SEPARATOR );
+                }
+            }
+            throw new EnforcerRuleException(
+                                             "Reactor modules contains dependencies which do not reference the reactor."
+                                                 + sb.toString() );
+            // CHECKSTYLE_ON: LineLength
+        }
+    }
+
+    /**
+     * Convenience method to create a user readable message.
+     * 
+     * @param sortedProjects The list of reactor projects.
+     * @throws EnforcerRuleException In case of a violation.
+     */
+    private void checkParentsInReactor( List<MavenProject> sortedProjects )
+        throws EnforcerRuleException
+    {
+        // After we are sure having consistent version we can simply use the first one?
+        String reactorVersion = sortedProjects.get( 0 ).getVersion();
+
+        List<MavenProject> areParentsFromTheReactor = areParentsFromTheReactor( reactorVersion, sortedProjects );
+        if ( !areParentsFromTheReactor.isEmpty() )
+        {
+            StringBuilder sb = new StringBuilder().append( SystemUtils.LINE_SEPARATOR );
+            addMessageIfExist( sb );
+            for ( MavenProject mavenProject : areParentsFromTheReactor )
+            {
+                sb.append( " --> " );
+                sb.append( mavenProject.getId() );
+                sb.append( " parent:" );
+                sb.append( mavenProject.getParent().getId() );
+                sb.append( SystemUtils.LINE_SEPARATOR );
+            }
+            throw new EnforcerRuleException( "Reactor modules have parents which contain a wrong version."
+                + sb.toString() );
+        }
+    }
+
+    /**
+     * Convenience method to create user readable message.
+     * 
+     * @param sortedProjects The list of reactor projects.
+     * @throws EnforcerRuleException In case of a violation.
+     */
+    private void checkReactor( List<MavenProject> sortedProjects )
+        throws EnforcerRuleException
+    {
+        List<MavenProject> consistenceCheckResult = isReactorVersionConsistent( sortedProjects );
+        if ( !consistenceCheckResult.isEmpty() )
+        {
+            StringBuilder sb = new StringBuilder().append( SystemUtils.LINE_SEPARATOR );
+            addMessageIfExist( sb );
+            for ( MavenProject mavenProject : consistenceCheckResult )
+            {
+                sb.append( " --> " );
+                sb.append( mavenProject.getId() );
+                sb.append( SystemUtils.LINE_SEPARATOR );
+            }
+            throw new EnforcerRuleException( "The reactor contains different versions." + sb.toString() );
+        }
+    }
+
+    private List<MavenProject> areParentsFromTheReactor( String reactorVersion, List<MavenProject> sortedProjects )
+    {
+        List<MavenProject> result = new ArrayList<MavenProject>();
+
+        for ( MavenProject mavenProject : sortedProjects )
+        {
+            logger.debug( "Project: " + mavenProject.getId() );
+            if ( hasParent( mavenProject ) )
+            {
+                if ( !mavenProject.isExecutionRoot() )
+                {
+                    MavenProject parent = mavenProject.getParent();
+                    if ( !reactorVersion.equals( parent.getVersion() ) )
+                    {
+                        logger.debug( "The project: " + mavenProject.getId()
+                            + " has a parent which version does not match the other elements in reactor" );
+                        result.add( mavenProject );
+                    }
+                }
+            }
+            else
+            {
+                // This situation is currently ignored, cause it's handled by existModulesWithoutParentsInReactor()
+            }
+        }
+
+        return result;
+    }
+
+    private List<MavenProject> existParentsWhichAreNotPartOfTheReactor( List<MavenProject> sortedProjects )
+    {
+        List<MavenProject> result = new ArrayList<MavenProject>();
+
+        for ( MavenProject mavenProject : sortedProjects )
+        {
+            logger.debug( "Project: " + mavenProject.getId() );
+            if ( hasParent( mavenProject ) )
+            {
+                if ( !mavenProject.isExecutionRoot() )
+                {
+                    MavenProject parent = mavenProject.getParent();
+                    if ( !isProjectPartOfTheReactor( parent, sortedProjects ) )
+                    {
+                        result.add( mavenProject );
+                    }
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * This will check of the groupId/artifactId can be found in any reactor project. The version will be ignored cause
+     * versions are checked before.
+     * 
+     * @param project The project which should be checked if it is contained in the sortedProjects.
+     * @param sortedProjects The list of existing projects.
+     * @return true if the project has been found within the list false otherwise.
+     */
+    private boolean isProjectPartOfTheReactor( MavenProject project, List<MavenProject> sortedProjects )
+    {
+        return isGAPartOfTheReactor( project.getGroupId(), project.getArtifactId(), sortedProjects );
+    }
+
+    private boolean isDependencyPartOfTheReactor( Dependency dependency, List<MavenProject> sortedProjects )
+    {
+        return isGAPartOfTheReactor( dependency.getGroupId(), dependency.getArtifactId(), sortedProjects );
+    }
+
+    /**
+     * This will check if the given <code>groupId/artifactId</code> is part of the current reactor.
+     * 
+     * @param groupId The groupId
+     * @param artifactId The artifactId
+     * @param sortedProjects The list of projects within the reactor.
+     * @return true if the groupId/artifactId is part of the reactor false otherwise.
+     */
+    private boolean isGAPartOfTheReactor( String groupId, String artifactId, List<MavenProject> sortedProjects )
+    {
+        boolean result = false;
+        for ( MavenProject mavenProject : sortedProjects )
+        {
+            String parentId = groupId + ":" + artifactId;
+            String projectId = mavenProject.getGroupId() + ":" + mavenProject.getArtifactId();
+            if ( parentId.equals( projectId ) )
+            {
+                result = true;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Assume we have a module which is a child of a multi module build but this child does not have a parent. This
+     * method will exactly search for such cases.
+     * 
+     * @param sortedProjects The sorted list of the reactor modules.
+     * @return The resulting list will contain the modules in the reactor which do not have a parent. The list will
+     *         never null. If the list is empty no violation have happened.
+     */
+    private List<MavenProject> existModulesWithoutParentsInReactor( List<MavenProject> sortedProjects )
+    {
+        List<MavenProject> result = new ArrayList<MavenProject>();
+
+        for ( MavenProject mavenProject : sortedProjects )
+        {
+            logger.debug( "Project: " + mavenProject.getId() );
+            if ( !hasParent( mavenProject ) )
+            {
+                // TODO: Should add an option to force having a parent?
+                if ( mavenProject.isExecutionRoot() )
+                {
+                    logger.debug( "The root does not need having a parent." );
+                }
+                else
+                {
+                    logger.debug( "The module: " + mavenProject.getId() + " has no parent." );
+                    result.add( mavenProject );
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Convenience method to handle adding a dependency to the Map of List.
+     * 
+     * @param result The result List which should be handled.
+     * @param project The MavenProject which will be added.
+     * @param dependency The dependency which will be added.
+     */
+    private void addDep( Map<MavenProject, List<Dependency>> result, MavenProject project, Dependency dependency )
+    {
+        if ( result.containsKey( project ) )
+        {
+            List<Dependency> list = result.get( project );
+            if ( list == null )
+            {
+                list = new ArrayList<Dependency>();
+            }
+            list.add( dependency );
+            result.put( project, list );
+        }
+        else
+        {
+            List<Dependency> list = new ArrayList<Dependency>();
+            list.add( dependency );
+            result.put( project, list );
+        }
+    }
+
+    /**
+     * Go through the list of modules in the builds and check if we have dependencies. If yes we will check every
+     * dependency based on groupId/artifactId if it belongs to the multi module build. In such a case it will be checked
+     * if the version does fit the version in the rest of build.
+     * 
+     * @param reactorVersion The version of the reactor.
+     * @param sortedProjects The list of existing projects within this build.
+     * @return List of violations. Never null. If the list is empty than no violation has happened.
+     */
+    // CHECKSTYLE_OFF: LineLength
+    private Map<MavenProject, List<Dependency>> areThereDependenciesWhichAreNotPartOfTheReactor( String reactorVersion,
+                                                                                                 List<MavenProject> sortedProjects )
+    // CHECKSTYLE_ON: LineLength
+    {
+        Map<MavenProject, List<Dependency>> result = new HashMap<MavenProject, List<Dependency>>();
+        for ( MavenProject mavenProject : sortedProjects )
+        {
+            logger.debug( "Project: " + mavenProject.getId() );
+
+            @SuppressWarnings( "unchecked" )
+            List<Dependency> dependencies = mavenProject.getDependencies();
+            if ( hasDependencies( dependencies ) )
+            {
+                for ( Dependency dependency : dependencies )
+                {
+                    logger.debug( " -> Dep:" + dependency.getGroupId() + ":" + dependency.getArtifactId() + ":"
+                        + dependency.getVersion() );
+                    if ( isDependencyPartOfTheReactor( dependency, sortedProjects ) )
+                    {
+                        if ( !dependency.getVersion().equals( reactorVersion ) )
+                        {
+                            addDep( result, mavenProject, dependency );
+                        }
+                    }
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * This method will check the following situation within a multi-module build.
+     * 
+     * <pre>
+     *  <parent>
+     *    <groupId>...</groupId>
+     *    <artifactId>...</artifactId>
+     *    <version>1.0-SNAPSHOT</version>
+     *  </parent>
+     *  
+     *  <version>1.1-SNAPSHOT</version>
+     * </pre>
+     * 
+     * @param projectList The sorted list of the reactor modules.
+     * @return The resulting list will contain the modules in the reactor which do the thing in the example above. The
+     *         list will never null. If the list is empty no violation have happened.
+     */
+    private List<MavenProject> isReactorVersionConsistent( List<MavenProject> projectList )
+    {
+        List<MavenProject> result = new ArrayList<MavenProject>();
+
+        if ( projectList != null && !projectList.isEmpty() )
+        {
+            String version = projectList.get( 0 ).getVersion();
+            logger.debug( "First version:" + version );
+            for ( MavenProject mavenProject : projectList )
+            {
+                logger.debug( " -> checking " + mavenProject.getId() );
+                if ( !version.equals( mavenProject.getVersion() ) )
+                {
+                    result.add( mavenProject );
+                }
+            }
+        }
+        return result;
+    }
+
+    private boolean hasDependencies( List<Dependency> dependencies )
+    {
+        return dependencies != null && !dependencies.isEmpty();
+    }
+
+    private boolean hasParent( MavenProject mavenProject )
+    {
+        return mavenProject.getParent() != null;
+    }
+
+    public boolean isIgnoreModuleDependencies()
+    {
+        return ignoreModuleDependencies;
+    }
+
+    public void setIgnoreModuleDependencies( boolean ignoreModuleDependencies )
+    {
+        this.ignoreModuleDependencies = ignoreModuleDependencies;
+    }
+
+    /**
+     * This will add the given user message to the output.
+     * 
+     * @param sb The already initialized exception message part.
+     */
+    private void addMessageIfExist( StringBuilder sb )
+    {
+        if ( !StringUtils.isEmpty( getMessage() ) )
+        {
+            sb.append( getMessage() );
+            sb.append( SystemUtils.LINE_SEPARATOR );
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireActiveProfile.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireActiveProfile.java
index 70614f3..337ce87 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireActiveProfile.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireActiveProfile.java
@@ -20,7 +20,6 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
@@ -39,11 +38,39 @@ public class RequireActiveProfile
     extends AbstractNonCacheableEnforcerRule
 {
 
-    /** Comma separated list of profiles to check. */
-    public String profiles = null;
+    /** Comma separated list of profiles to check.
+     *  
+     * @see {@link #setProfiles(String)}
+     * @see {@link #getProfiles()}
+     */
+    private String profiles = null;
 
-    /** If all profiles must be active. If false, only one must be active */
-    public boolean all = true;
+    /** If all profiles must be active. If false, only one must be active
+     *
+     * @see {@link #setAll(boolean)}
+     * @see {@link #isAll()}
+     */
+    private boolean all = true;
+    
+    public final String getProfiles()
+    {
+        return profiles;
+    }
+    
+    public final void setProfiles( String profiles )
+    {
+        this.profiles = profiles;
+    }
+    
+    public final boolean isAll()
+    {
+        return all;
+    }
+    
+    public final void setAll( boolean all )
+    {
+        this.all = all;
+    }
 
     /*
      * (non-Javadoc)
@@ -53,50 +80,42 @@ public class RequireActiveProfile
     public void execute( EnforcerRuleHelper theHelper )
         throws EnforcerRuleException
     {
-        List missingProfiles = new ArrayList();
+        List<String> missingProfiles = new ArrayList<String>();
         try
         {
             MavenProject project = (MavenProject) theHelper.evaluate( "${project}" );
             if ( StringUtils.isNotEmpty( profiles ) )
             {
                 String[] profs = profiles.split( "," );
-                for ( int i = 0; i < profs.length; i++ )
+                for ( String profile : profs )
                 {
-                    if ( !isProfileActive( project, profs[i] ) )
+                    if ( !isProfileActive( project, profile ) )
                     {
-                        missingProfiles.add( profs[i] );
+                        missingProfiles.add( profile );
                     }
                 }
 
                 boolean fail = false;
                 if ( !missingProfiles.isEmpty() )
                 {
-                    fail = true;
-                    // if (all && missingProfiles.size() != profs.length)
-                    // {
-                    // fail = true;
-                    // }
-                    // else
-                    // {
-                    // if (!all && missingProfiles.size() >= (profs.length -1))
-                    // {
-                    // fail = true;
-                    // }
-                    // }
+                    if ( all || missingProfiles.size() == profs.length )
+                    {
+                      fail = true;
+                    }
                 }
 
                 if ( fail )
                 {
-                    StringBuffer buf = new StringBuffer();
+                    String message = getMessage();
+                    StringBuilder buf = new StringBuilder();
                     if ( message != null )
                     {
                         buf.append( message + "\n" );
                     }
 
-                    Iterator iter = missingProfiles.iterator();
-                    while ( iter.hasNext() )
+                    for ( String profile : missingProfiles )
                     {
-                        buf.append( "Profile \"" + iter.next().toString() + "\" is not activated.\n" );
+                        buf.append( "Profile \"" + profile + "\" is not activated.\n" );
                     }
 
                     throw new EnforcerRuleException( buf.toString() );
@@ -117,16 +136,16 @@ public class RequireActiveProfile
      *
      * @param project the project
      * @param profileName the profile name
-     * @return <code>true</code> if profile is active
+     * @return <code>true</code> if profile is active, otherwise <code>false</code>
      */
     protected boolean isProfileActive( MavenProject project, String profileName )
     {
-        List activeProfiles = project.getActiveProfiles();
+        @SuppressWarnings( "unchecked" )
+        List<Profile> activeProfiles = project.getActiveProfiles();
         if ( activeProfiles != null && !activeProfiles.isEmpty() )
         {
-            for ( Iterator it = activeProfiles.iterator(); it.hasNext(); )
+            for ( Profile profile : activeProfiles )
             {
-                Profile profile = (Profile) it.next();
                 if ( profile.getId().equals( profileName ) )
                 {
                     return true;
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireEnvironmentVariable.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireEnvironmentVariable.java
new file mode 100755
index 0000000..32845de
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireEnvironmentVariable.java
@@ -0,0 +1,91 @@
+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 org.apache.maven.enforcer.rule.api.EnforcerRule;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+
+/**
+ * This rule checks that certain environment variable is set.
+ *
+ * @author <a href='mailto:marvin[at]marvinformatics[dot]com'>Marvin Froeder</a>
+ */
+public class RequireEnvironmentVariable
+    extends AbstractPropertyEnforcerRule
+{
+
+    /**
+     * Specify the required variable.
+     */
+    private String variableName = null;
+
+    /**
+     * @param variableName the variable name
+     * 
+     * @see #setVariableName(String)
+     * @see #getVariableName()
+     */
+    public final void setVariableName( String variableName )
+    {
+        this.variableName = variableName;
+    }
+    
+    public final String getVariableName()
+    {
+        return variableName;
+    }
+
+    @Override
+    public String resolveValue( EnforcerRuleHelper helper )
+    {
+        String envValue = System.getenv( variableName );
+        return envValue;
+    }
+
+    public boolean isCacheable()
+    {
+        // environment variables won't change while maven is on the run
+        return true;
+    }
+
+    public boolean isResultValid( EnforcerRule cachedRule )
+    {
+        // this rule shall always have the same result, since environment
+        // variables are set before maven is launched
+        return true;
+    }
+
+    public String getCacheId()
+    {
+        return variableName;
+    }
+
+    @Override
+    public String getPropertyName()
+    {
+        return variableName;
+    }
+
+    @Override
+    public String getName()
+    {
+        return "Environment variable";
+    }
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFileChecksum.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFileChecksum.java
new file mode 100644
index 0000000..83f67cb
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFileChecksum.java
@@ -0,0 +1,146 @@
+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.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.codehaus.plexus.util.IOUtil;
+
+/**
+ * Rule to validate a file to match the specified checksum.
+ *
+ * @author Edward Samson
+ * @author Lyubomyr Shaydariv
+ */
+public class RequireFileChecksum
+    extends AbstractNonCacheableEnforcerRule
+{
+
+    private File file;
+
+    private String checksum;
+
+    private String type;
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        if ( this.file == null )
+        {
+            throw new EnforcerRuleException( "Input file unspecified" );
+        }
+
+        if ( this.type == null )
+        {
+            throw new EnforcerRuleException( "Hash type unspecified" );
+        }
+
+        if ( this.checksum == null )
+        {
+            throw new EnforcerRuleException( "Checksum unspecified" );
+        }
+
+        InputStream inputStream = null;
+        try
+        {
+            if ( this.file.isDirectory() || !this.file.canRead() )
+            {
+                throw new EnforcerRuleException( "Cannot read file: " + this.file.getAbsolutePath() );
+            }
+
+            inputStream = new FileInputStream( this.file );
+            String checksum;
+            if ( "md5".equals( this.type ) )
+            {
+                checksum = DigestUtils.md5Hex( inputStream );
+            }
+            else if ( "sha1".equals( this.type ) )
+            {
+                checksum = DigestUtils.shaHex( inputStream );
+            }
+            else if ( "sha256".equals( this.type ) )
+            {
+                checksum = DigestUtils.sha256Hex( inputStream );
+            }
+            else if ( "sha384".equals( this.type ) )
+            {
+                checksum = DigestUtils.sha384Hex( inputStream );
+            }
+            else if ( "sha512".equals( this.type ) )
+            {
+                checksum = DigestUtils.sha512Hex( inputStream );
+            }
+            else
+            {
+                throw new EnforcerRuleException( "Unsupported hash type: " + this.type );
+            }
+            if ( !checksum.equalsIgnoreCase( this.checksum ) )
+            {
+                throw new EnforcerRuleException( this.type + " hash of " + this.file + " was " + checksum
+                    + " but expected " + this.checksum );
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new EnforcerRuleException( "Unable to calculate checksum", e );
+        }
+        finally
+        {
+            IOUtil.close( inputStream );
+        }
+    }
+
+    /**
+     * The file to check.
+     *
+     * @param file file
+     */
+    public void setFile( File file )
+    {
+        this.file = file;
+    }
+
+    /**
+     * The expected checksum value.
+     *
+     * @param checksum checksum
+     */
+    public void setChecksum( String checksum )
+    {
+        this.checksum = checksum;
+    }
+
+    /**
+     * The checksum algorithm to use. Possible values: "md5", "sha1", "sha256", "sha384", "sha512".
+     *
+     * @param type algorithm
+     */
+    public void setType( String type )
+    {
+        this.type = type;
+    }
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesDontExist.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesDontExist.java
index 1dcb584..0608e6b 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesDontExist.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesDontExist.java
@@ -35,7 +35,7 @@ public class RequireFilesDontExist
      */
     boolean checkFile( File file )
     {
-    	//if we get here and the handle is null, treat it as a success
+        // if we get here and the handle is null, treat it as a success
         return file == null ? true : !file.exists();
     }
 
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesExist.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesExist.java
index 2a7d235..6ea8067 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesExist.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesExist.java
@@ -35,7 +35,7 @@ public class RequireFilesExist
      */
     boolean checkFile( File file )
     {
-    	//if we get here and the handle is null, treat it as a success
+        // if we get here and the handle is null, treat it as a success
         return file == null ? true : file.exists();
     }
 
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesSize.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesSize.java
index 996a425..41bf5cf 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesSize.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireFilesSize.java
@@ -38,11 +38,13 @@ public class RequireFilesSize
     extends AbstractRequireFiles
 {
 
+    private static final long MAXSIZE = 10000;
+
     /** the max size allowed. */
-    long maxsize = 10000;
+    private long maxsize = MAXSIZE;
 
     /** the min size allowed. */
-    long minsize = 0;
+    private long minsize = 0;
 
     /** The error msg. */
     private String errorMsg;
@@ -50,10 +52,8 @@ public class RequireFilesSize
     /** The log. */
     private Log log;
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
+    /**
+     * {@inheritDoc}
      */
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
@@ -61,13 +61,13 @@ public class RequireFilesSize
         this.log = helper.getLog();
 
         // if the file is already defined, use that. Otherwise get the main artifact.
-        if ( files.length == 0 )
+        if ( getFiles().length == 0 )
         {
             try
             {
                 MavenProject project = (MavenProject) helper.evaluate( "${project}" );
-                files = new File[1];
-                files[0] = project.getArtifact().getFile();
+                setFiles( new File[1] );
+                getFiles()[0] = project.getArtifact().getFile();
 
                 super.execute( helper );
             }
@@ -83,34 +83,30 @@ public class RequireFilesSize
 
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+    /**
+     * {@inheritDoc}
      */
     public boolean isCacheable()
     {
         return false;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+    /**
+     * {@inheritDoc}
      */
     public boolean isResultValid( EnforcerRule cachedRule )
     {
         return false;
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.maven.plugins.enforcer.AbstractRequireFiles#checkFile(java.io.File)
+    /**
+     * {@inheritDoc}
      */
     boolean checkFile( File file )
     {
-        if (file == null)
+        if ( file == null )
         {
-            //if we get here and it's null, treat it as a success.
+            // if we get here and it's null, treat it as a success.
             return true;
         }
 
@@ -131,11 +127,11 @@ public class RequireFilesSize
             else
             {
 
-                this.log.debug( file +
-                    " size (" +
-                    length +
-                    ") is OK (" +
-                    ( minsize == maxsize || minsize == 0 ? ( "max. " + maxsize )
+                this.log.debug( file
+                    + " size ("
+                    + length
+                    + ") is OK ("
+                    + ( minsize == maxsize || minsize == 0 ? ( "max. " + maxsize )
                                     : ( "between " + minsize + " and " + maxsize ) ) + " byte)." );
 
                 return true;
@@ -148,11 +144,31 @@ public class RequireFilesSize
         }
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.maven.plugins.enforcer.AbstractRequireFiles#getErrorMsg()
+    /**
+     * {@inheritDoc}
      */
     String getErrorMsg()
     {
         return this.errorMsg;
     }
+
+    public long getMaxsize()
+    {
+        return maxsize;
+    }
+
+    public void setMaxsize( long maxsize )
+    {
+        this.maxsize = maxsize;
+    }
+
+    public long getMinsize()
+    {
+        return minsize;
+    }
+
+    public void setMinsize( long minsize )
+    {
+        this.minsize = minsize;
+    }
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java
index 1e1065b..61e8ea2 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java
@@ -23,7 +23,7 @@ import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang3.SystemUtils;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
@@ -35,7 +35,7 @@ import org.codehaus.plexus.util.StringUtils;
  * This rule checks that the Java version is allowed.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: RequireJavaVersion.java 805190 2009-08-17 22:30:49Z hboutemy $
+ * @version $Id: RequireJavaVersion.java 1792138 2017-04-20 19:45:13Z khmarbaise $
  */
 public class RequireJavaVersion
     extends AbstractVersionEnforcer
@@ -49,20 +49,20 @@ public class RequireJavaVersion
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
-        String java_version = SystemUtils.JAVA_VERSION_TRIMMED;
+        String javaVersion = SystemUtils.JAVA_VERSION;
         Log log = helper.getLog();
 
-        log.debug( "Detected Java String: " + java_version );
-        java_version = normalizeJDKVersion( java_version );
-        log.debug( "Normalized Java String: " + java_version );
+        log.debug( "Detected Java String: '" + javaVersion + "'" );
+        javaVersion = normalizeJDKVersion( javaVersion );
+        log.debug( "Normalized Java String: '" + javaVersion + "'" );
 
-        ArtifactVersion detectedJdkVersion = new DefaultArtifactVersion( java_version );
+        ArtifactVersion detectedJdkVersion = new DefaultArtifactVersion( javaVersion );
 
-        log.debug( "Parsed Version: Major: " + detectedJdkVersion.getMajorVersion() + " Minor: " +
-            detectedJdkVersion.getMinorVersion() + " Incremental: " + detectedJdkVersion.getIncrementalVersion() +
-            " Build: " + detectedJdkVersion.getBuildNumber() + " Qualifier: " + detectedJdkVersion.getQualifier() );
+        log.debug( "Parsed Version: Major: " + detectedJdkVersion.getMajorVersion() + " Minor: "
+            + detectedJdkVersion.getMinorVersion() + " Incremental: " + detectedJdkVersion.getIncrementalVersion()
+            + " Build: " + detectedJdkVersion.getBuildNumber() + " Qualifier: " + detectedJdkVersion.getQualifier() );
 
-        enforceVersion( helper.getLog(), "JDK", version, detectedJdkVersion );
+        enforceVersion( helper.getLog(), "JDK", getVersion(), detectedJdkVersion );
     }
 
     /**
@@ -76,10 +76,10 @@ public class RequireJavaVersion
 
         theJdkVersion = theJdkVersion.replaceAll( "_|-", "." );
         String tokenArray[] = StringUtils.split( theJdkVersion, "." );
-        List tokens = Arrays.asList( tokenArray );
+        List<String> tokens = Arrays.asList( tokenArray );
         StringBuffer buffer = new StringBuffer( theJdkVersion.length() );
 
-        Iterator iter = tokens.iterator();
+        Iterator<String> iter = tokens.iterator();
         for ( int i = 0; i < tokens.size() && i < 4; i++ )
         {
             String section = (String) iter.next();
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 dea06bf..bf95947 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
@@ -19,17 +19,17 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
-import org.apache.maven.execution.RuntimeInformation;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.apache.maven.execution.MavenSession;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
 
 /**
  * This rule checks that the Maven version is allowed.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: RequireMavenVersion.java 805190 2009-08-17 22:30:49Z hboutemy $
+ * @version $Id: RequireMavenVersion.java 1791757 2017-04-18 07:52:22Z khmarbaise $
  */
 public class RequireMavenVersion
     extends AbstractVersionEnforcer
@@ -45,14 +45,14 @@ public class RequireMavenVersion
     {
         try
         {
-            RuntimeInformation rti = (RuntimeInformation) helper.getComponent( RuntimeInformation.class );
-            ArtifactVersion detectedMavenVersion = rti.getApplicationVersion();
-            helper.getLog().debug( "Detected Maven Version: " + detectedMavenVersion );
-            enforceVersion( helper.getLog(), "Maven", this.version, detectedMavenVersion );
+            MavenSession mavenSession = (MavenSession) helper.evaluate( "${session}" );
+            String mavenVersion = mavenSession.getSystemProperties().getProperty( "maven.version" );
+            helper.getLog().debug( "Detected Maven Version: " + mavenVersion );
+            DefaultArtifactVersion detectedVersion = new DefaultArtifactVersion( mavenVersion );
+            enforceVersion( helper.getLog(), "Maven", getVersion(), detectedVersion );
         }
-        catch ( ComponentLookupException e )
+        catch ( ExpressionEvaluationException e )
         {
-            // TODO Auto-generated catch block
             e.printStackTrace();
         }
 
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java
index 34eb064..bc225b7 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java
@@ -19,6 +19,12 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
@@ -31,13 +37,6 @@ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluatio
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * This rule checks that this pom or its parents don't define a repository.
  *
@@ -48,38 +47,78 @@ public class RequireNoRepositories
 {
     /**
      * Whether to ban non-plugin repositories. By default they are banned.
+     * 
+     * @see #setBanRepositories(boolean)
      */
-    public boolean banRepositories = true;
+    private boolean banRepositories = true;
 
     /**
      * Whether to ban plugin repositories. By default they are banned.
+     * 
+     * @see #setBanPluginRepositories(boolean)
      */
-    public boolean banPluginRepositories = true;
+    private boolean banPluginRepositories = true;
 
     /**
      * Specify explicitly allowed non-plugin repositories. This is a list of ids.
+     * 
+     * @see #setAllowedRepositories(List)
      */
-    public List allowedRepositories = Collections.EMPTY_LIST;
+    private List<String> allowedRepositories = Collections.emptyList();
 
     /**
      * Specify explicitly allowed plugin repositories. This is a list of ids.
+     * 
+     * @see #setAllowedPluginRepositories(List)
      */
-    public List allowedPluginRepositories = Collections.EMPTY_LIST;
+    private List<String> allowedPluginRepositories = Collections.emptyList();
 
     /**
      * Whether to allow repositories which only resolve snapshots. By default they are banned.
+     * 
+     * @see #setAllowSnapshotRepositories(boolean)
      */
-    public boolean allowSnapshotRepositories = false;
+    private boolean allowSnapshotRepositories = false;
 
     /**
      * Whether to allow plugin repositories which only resolve snapshots. By default they are banned.
+     * 
+     * @see {@link #setAllowSnapshotPluginRepositories(boolean)}
      */
-    public boolean allowSnapshotPluginRepositories = false;
+    private boolean allowSnapshotPluginRepositories = false;
 
-    /*
-     * (non-Javadoc)
-     * @see
-     * org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
+    public final void setBanRepositories( boolean banRepositories )
+    {
+        this.banRepositories = banRepositories;
+    }
+    
+    public final void setBanPluginRepositories( boolean banPluginRepositories )
+    {
+        this.banPluginRepositories = banPluginRepositories;
+    }
+    
+    public final void setAllowedRepositories( List<String> allowedRepositories )
+    {
+        this.allowedRepositories = allowedRepositories;
+    }
+    
+    public final void setAllowedPluginRepositories( List<String> allowedPluginRepositories )
+    {
+        this.allowedPluginRepositories = allowedPluginRepositories;
+    }
+    
+    public final void setAllowSnapshotRepositories( boolean allowSnapshotRepositories )
+    {
+        this.allowSnapshotRepositories = allowSnapshotRepositories;
+    }
+    
+    public final void setAllowSnapshotPluginRepositories( boolean allowSnapshotPluginRepositories )
+    {
+        this.allowSnapshotPluginRepositories = allowSnapshotPluginRepositories;
+    }
+    
+    /**
+     * {@inheritDoc}
      */
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
@@ -91,23 +130,22 @@ public class RequireNoRepositories
         {
             project = (MavenProject) helper.evaluate( "${project}" );
 
-            List models =
+            List<Model> models =
                 utils.getModelsRecursively( project.getGroupId(), project.getArtifactId(), project.getVersion(),
                                             new File( project.getBasedir(), "pom.xml" ) );
-            List badModels = new ArrayList();
+            List<Model> badModels = new ArrayList<Model>();
 
             StringBuffer newMsg = new StringBuffer();
             newMsg.append( "Some poms have repositories defined:\n" );
 
-            for ( Iterator i = models.iterator(); i.hasNext(); )
+            for ( Model model : models )
             {
-                Model model = (Model) i.next();
                 if ( banRepositories )
                 {
-                    List repos = model.getRepositories();
+                    List<Repository> repos = model.getRepositories();
                     if ( repos != null && !repos.isEmpty() )
                     {
-                        List bannedRepos =
+                        List<String> bannedRepos =
                             findBannedRepositories( repos, allowedRepositories, allowSnapshotRepositories );
                         if ( !bannedRepos.isEmpty() )
                         {
@@ -120,10 +158,10 @@ public class RequireNoRepositories
                 }
                 if ( banPluginRepositories )
                 {
-                    List repos = model.getPluginRepositories();
+                    List<Repository> repos = model.getPluginRepositories();
                     if ( repos != null && !repos.isEmpty() )
                     {
-                        List bannedRepos =
+                        List<String> bannedRepos =
                             findBannedRepositories( repos, allowedPluginRepositories, allowSnapshotPluginRepositories );
                         if ( !bannedRepos.isEmpty() )
                         {
@@ -140,6 +178,7 @@ public class RequireNoRepositories
             // optional message.
             if ( !badModels.isEmpty() )
             {
+                String message = getMessage();
                 if ( StringUtils.isNotEmpty( message ) )
                 {
                     newMsg.append( message );
@@ -171,15 +210,22 @@ public class RequireNoRepositories
         }
     }
 
-    private static List findBannedRepositories( List repos, List allowedRepos, boolean allowSnapshots )
+    /**
+     * 
+     * @param repos all repositories, never {@code null}
+     * @param allowedRepos allowed repositories, never {@code null}
+     * @param allowSnapshots 
+     * @return List of banned repositoreis.
+     */
+    private static List<String> findBannedRepositories( List<Repository> repos, List<String> allowedRepos,
+                                                        boolean allowSnapshots )
     {
-        List bannedRepos = new ArrayList( allowedRepos.size() );
-        for ( Iterator i = repos.iterator(); i.hasNext(); )
+        List<String> bannedRepos = new ArrayList<String>( allowedRepos.size() );
+        for ( Repository r : repos )
         {
-            Repository r = (Repository) i.next();
             if ( !allowedRepos.contains( r.getId() ) )
             {
-                if ( !allowSnapshots || r.getReleases().isEnabled() )
+                if ( !allowSnapshots || r.getReleases() == null || r.getReleases().isEnabled() )
                 {
                     // if we are not allowing snapshots and this repo is enabled for releases
                     // it is banned.  We don't care whether it is enabled for snapshots
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java
index df1ed8b..5b0cb00 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java
@@ -37,7 +37,7 @@ import org.codehaus.plexus.util.StringUtils;
  * is exactly the same as the Maven Os profile activation so the same values are allowed here.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: RequireOS.java 805190 2009-08-17 22:30:49Z hboutemy $
+ * @version $Id: RequireOS.java 1634140 2014-10-24 21:23:01Z khmarbaise $
  */
 public class RequireOS
     extends AbstractStandardEnforcerRule
@@ -58,23 +58,43 @@ public class RequireOS
      * <li>z/os</li>
      * <li>os/400</li>
      * </ul>
+     * 
+     * @see {@link #setFamily(String)}
+     * @see {@link #getFamily()}
      */
-    public String family = null;
+    private String family = null;
 
-    /** The OS name desired. */
-    public String name = null;
-
-    /** The OS version desired. */
-    public String version = null;
+    /**
+     * The OS name desired.
+     *
+     * @see {@link #setName(String)}
+     * @see {@link #getName()}
+     */
+    private String name = null;
 
-    /** The OS architecture desired. */
-    public String arch = null;
+    /**
+     * The OS version desired.
+     * 
+     * @see {@link #setVersion(String)}
+     * @see {@link #getVersion()}
+     */
+    private String version = null;
 
-    /** Specify an optional message to the user if the rule fails. */
-    public String message = "";
+    /**
+     * The OS architecture desired.
+     * 
+     * @see {@link #setArch(String)}
+     * @see {@link #getArch()}
+     */
+    private String arch = null;
 
-    /** Display detected OS information. */
-    public boolean display = false;
+    /**
+     * Display detected OS information.
+     * 
+     * @see {@link #setDisplay(boolean)}
+     * @see {@link #isDisplay()}
+     */
+    private boolean display = false;
 
     /**
      * Instantiates a new RequireOS.
@@ -84,10 +104,8 @@ public class RequireOS
 
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
+    /**
+     * {@inheritDoc}
      */
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
@@ -97,28 +115,38 @@ public class RequireOS
 
         if ( allParamsEmpty() )
         {
-            throw new EnforcerRuleException( "All parameters can not be empty. You must pick at least one of (family, name, version, arch) or use -Denforcer.os.display=true to see the current OS information." );
+            throw new EnforcerRuleException( "All parameters can not be empty. "
+                + "You must pick at least one of (family, name, version, arch) "
+                + "or use -Denforcer.os.display=true to see the current OS information." );
         }
 
         if ( isValidFamily( this.family ) )
         {
             if ( !isAllowed() )
             {
+                String message = getMessage();
                 if ( StringUtils.isEmpty( message ) )
                 {
+                    //@formatter:off
                     message =
-                        ( "OS Arch: " + Os.OS_ARCH + " Family: " + Os.OS_FAMILY + " Name: " + Os.OS_NAME +
-                            " Version: " + Os.OS_VERSION + " is not allowed by" +
-                            ( arch != null ? " Arch=" + arch : "" ) + ( family != null ? " Family=" + family : "" ) +
-                            ( name != null ? " Name=" + name : "" ) + ( version != null ? " Version=" + version : "" ) );
+                        ( "OS Arch: " 
+                            + Os.OS_ARCH + " Family: " 
+                            + Os.OS_FAMILY + " Name: " 
+                            + Os.OS_NAME + " Version: "
+                            + Os.OS_VERSION + " is not allowed by" + ( arch != null ? " Arch=" + arch : "" )
+                            + ( family != null ? " Family=" + family : "" ) 
+                            + ( name != null ? " Name=" + name : "" ) 
+                            + ( version != null ? " Version=" + version : "" ) );
+                    //@formatter:on
                 }
                 throw new EnforcerRuleException( message );
             }
         }
         else
         {
-            StringBuffer buffer = new StringBuffer( 50 );
-            Iterator iter = Os.getValidFamilies().iterator();
+            final int minimumBufferSize = 50;
+            StringBuilder buffer = new StringBuilder( minimumBufferSize );
+            Iterator<?> iter = Os.getValidFamilies().iterator();
             while ( iter.hasNext() )
             {
                 buffer.append( iter.next() );
@@ -138,8 +166,8 @@ public class RequireOS
     public void displayOSInfo( Log log, boolean info )
     {
         String string =
-            "OS Info: Arch: " + Os.OS_ARCH + " Family: " + Os.OS_FAMILY + " Name: " + Os.OS_NAME + " Version: " +
-                Os.OS_VERSION;
+            "OS Info: Arch: " + Os.OS_ARCH + " Family: " + Os.OS_FAMILY + " Name: " + Os.OS_NAME + " Version: "
+                + Os.OS_VERSION;
 
         if ( !info )
         {
@@ -171,8 +199,9 @@ public class RequireOS
      */
     public boolean allParamsEmpty()
     {
+        // CHECKSTYLE_OFF: LineLength
         return ( StringUtils.isEmpty( family ) && StringUtils.isEmpty( arch ) && StringUtils.isEmpty( name ) && StringUtils.isEmpty( version ) );
-
+        // CHECKSTYLE_ON: LineLength
     }
 
     /**
@@ -325,10 +354,21 @@ public class RequireOS
         this.version = theVersion;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+    /**
+     * @param display The value for the display.
+     */
+    public final void setDisplay( boolean display )
+    {
+        this.display = display;
+    }
+
+    public final boolean isDisplay()
+    {
+        return display;
+    }
+
+    /**
+     * {@inheritDoc}
      */
     public String getCacheId()
     {
@@ -353,10 +393,8 @@ public class RequireOS
         return b.toString();
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+    /**
+     * {@inheritDoc}
      */
     public boolean isCacheable()
     {
@@ -364,10 +402,8 @@ public class RequireOS
         return true;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+    /**
+     * {@inheritDoc}
      */
     public boolean isResultValid( EnforcerRule theCachedRule )
     {
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 590e8a1..4b1a8b4 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
@@ -21,6 +21,7 @@ package org.apache.maven.plugins.enforcer;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -53,6 +54,7 @@ import org.apache.maven.model.BuildBase;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Profile;
+import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.plugin.InvalidPluginException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.PluginManager;
@@ -76,59 +78,90 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
  * This rule will enforce that all plugins specified in the poms have a version declared.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: RequirePluginVersions.java 1028144 2010-10-28 00:10:58Z brianf $
+ * @version $Id: RequirePluginVersions.java 1697215 2015-08-23 16:27:17Z khmarbaise $
  */
 public class RequirePluginVersions
     extends AbstractNonCacheableEnforcerRule
 {
 
-    /** Don't allow the LATEST identifier. */
-    public boolean banLatest = true;
+    /**
+     * Don't allow the LATEST identifier.
+     * 
+     * @see {@link #setBanLatest(boolean)}
+     * @see {@link #isBanLatest()}
+     */
+    private boolean banLatest = true;
 
-    /** Don't allow the RELEASE identifier. */
-    public boolean banRelease = true;
+    /**
+     * Don't allow the RELEASE identifier.
+     * 
+     * @see {@link #setBanRelease(boolean)}
+     * @see {@link #isBanRelease()}
+     */
+    private boolean banRelease = true;
 
-    /** Don't allow snapshot plugins. */
-    public boolean banSnapshots = true;
+    /**
+     * Don't allow snapshot plugins.
+     * 
+     * @see {@link #setBanSnapshots(boolean)}
+     * @see {@link #isBanSnapshots()}
+     */
+    private boolean banSnapshots = true;
 
-    /** Don't allow timestamp snapshot plugins. */
-    public boolean banTimestamps = true;
+    /**
+     * Don't allow timestamp snapshot plugins.
+     * 
+     * @see {@link #setBanTimestamps(boolean)}
+     * @see {@link #isBanTimestamps()}
+     */
+    private boolean banTimestamps = true;
 
     /**
      * The comma separated list of phases that should be used to find lifecycle plugin bindings. The default value is
      * "clean,deploy,site".
+     * 
+     * @see {@link #setPhases(String)}
+     * @see {@link #getPhases()}
      */
-    public String phases = "clean,deploy,site";
+    private String phases = "clean,deploy,site";
 
     /**
      * Additional plugins to enforce have versions. These are plugins that may not be in the poms but are used anyway,
      * like help, eclipse etc. <br>
      * The plugins should be specified in the form: <code>group:artifactId</code>.
+     * 
+     * @see {@link #setAdditionalPlugins(List)}
+     * @see {@link #getAdditionalPlugins()}
      */
-    public List additionalPlugins;
+    private List<String> additionalPlugins;
 
     /**
      * Plugins to skip for version enforcement. The plugins should be specified in the form:
      * <code>group:artifactId</code>. NOTE: This is deprecated, use unCheckedPluginList instead.
-     * @deprecated
+     * 
+     * @see {@link #setUnCheckedPlugins(List)}
+     * @see {@link #getUnCheckedPlugins()}
      */
-    public List unCheckedPlugins;
+    private List unCheckedPlugins;
 
     /**
      * Same as unCheckedPlugins but as a comma list to better support properties. Sample form:
      * <code>group:artifactId,group2:artifactId2</code>
+     * 
      * @since 1.0-beta-1
+     * @see {@link #setUnCheckedPlugins(List)}
+     * @see {@link #getUnCheckedPlugins()}
      */
-    public String unCheckedPluginList;
+    private String unCheckedPluginList;
 
     /** The plugin manager. */
     private PluginManager pluginManager;
 
     /** The phase to lifecycle map. */
-    private Map phaseToLifecycleMap;
+    private Map<String, Lifecycle> phaseToLifecycleMap;
 
     /** The lifecycles. */
-    private List lifecycles;
+    private Collection<Lifecycle> lifecycles;
 
     /** The factory. */
     ArtifactFactory factory;
@@ -140,7 +173,7 @@ public class RequirePluginVersions
     ArtifactRepository local;
 
     /** The remote repositories. */
-    List remoteRepositories;
+    List<ArtifactRepository> remoteRepositories;
 
     /** The log. */
     Log log;
@@ -153,8 +186,8 @@ public class RequirePluginVersions
 
     /*
      * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
+     * @see
+     * org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
      */
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
@@ -169,21 +202,23 @@ public class RequirePluginVersions
             project = (MavenProject) helper.evaluate( "${project}" );
             LifecycleExecutor life;
             life = (LifecycleExecutor) helper.getComponent( LifecycleExecutor.class );
-            try
+
+            // The lifecycle API changed from Maven 2 to 3 so we have to do a hack to figure
+            // out which one we're using.
+            Field field = ReflectionUtils.getFieldByNameIncludingSuperclasses( "defaultLifeCycles", life.getClass() );
+            if ( field != null ) // Using Maven 3
             {
-              lifecycles = (List) ReflectionUtils.getValueIncludingSuperclasses( "lifecycles", life );
+                Object defaultLifeCycles = ReflectionUtils.getValueIncludingSuperclasses( "defaultLifeCycles", life );
+                Map lifecyclesMap =
+                    (Map) ReflectionUtils.getValueIncludingSuperclasses( "lifecycles", defaultLifeCycles );
+                lifecycles = lifecyclesMap.values();
             }
-            catch (Exception e)
+            else
+            // Using Maven 2
             {
-                log.info( "The requirePluginVersions rule is currently not compatible with Maven3.");
-                /*
-                 *
-                 * NOTE: If this happens, we're bailing out right away.
-                 *
-                 *
-                 */
-                return;
+                lifecycles = (Collection) ReflectionUtils.getValueIncludingSuperclasses( "lifecycles", life );
             }
+
             session = (MavenSession) helper.evaluate( "${session}" );
             pluginManager = (PluginManager) helper.getComponent( PluginManager.class );
             factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
@@ -194,15 +229,16 @@ public class RequirePluginVersions
             utils = new EnforcerRuleUtils( helper );
 
             // get all the plugins that are bound to the specified lifecycles
-            Set allPlugins = getBoundPlugins( life, project, phases );
+            Set<Plugin> allPlugins = getBoundPlugins( life, project, phases );
 
             // insert any additional plugins specified by the user.
             allPlugins = addAdditionalPlugins( allPlugins, additionalPlugins );
             allPlugins.addAll( getProfilePlugins( project ) );
 
-
             // pull out any we should skip
-            allPlugins = (Set) removeUncheckedPlugins( combineUncheckedPlugins( unCheckedPlugins, unCheckedPluginList ), allPlugins );
+            allPlugins =
+                (Set) removeUncheckedPlugins( combineUncheckedPlugins( unCheckedPlugins, unCheckedPluginList ),
+                                              allPlugins );
 
             // there's nothing to do here
             if ( allPlugins.isEmpty() )
@@ -216,15 +252,12 @@ public class RequirePluginVersions
             }
 
             // get all the plugins that are mentioned in the pom (and parents)
-            List pluginWrappers = getAllPluginEntries( project );
+            List<PluginWrapper> pluginWrappers = getAllPluginEntries( project );
 
             // now look for the versions that aren't valid and add to a list.
-            ArrayList failures = new ArrayList();
-            Iterator iter = allPlugins.iterator();
-            while ( iter.hasNext() )
+            List<Plugin> failures = new ArrayList<Plugin>();
+            for ( Plugin plugin : allPlugins )
             {
-                Plugin plugin = (Plugin) iter.next();
-
                 if ( !hasValidVersionSpecified( helper, plugin, pluginWrappers ) )
                 {
                     failures.add( plugin );
@@ -234,7 +267,7 @@ public class RequirePluginVersions
             // if anything was found, log it then append the optional message.
             if ( !failures.isEmpty() )
             {
-                StringBuffer newMsg = new StringBuffer();
+                StringBuilder newMsg = new StringBuilder();
                 newMsg.append( "Some plugins are missing valid versions:" );
                 if ( banLatest || banRelease || banSnapshots || banTimestamps )
                 {
@@ -253,11 +286,8 @@ public class RequirePluginVersions
                     }
                     newMsg.append( "are not allowed )\n" );
                 }
-                iter = failures.iterator();
-                while ( iter.hasNext() )
+                for ( Plugin plugin : failures )
                 {
-                    Plugin plugin = (Plugin) iter.next();
-
                     newMsg.append( plugin.getGroupId() );
                     newMsg.append( ":" );
                     newMsg.append( plugin.getArtifactId() );
@@ -286,6 +316,7 @@ public class RequirePluginVersions
                     }
                     newMsg.append( "\n" );
                 }
+                String message = getMessage();
                 if ( StringUtils.isNotEmpty( message ) )
                 {
                     newMsg.append( message );
@@ -341,18 +372,17 @@ public class RequirePluginVersions
      *
      * @param uncheckedPlugins
      * @param plugins
-     * @return
      * @throws MojoExecutionException
+     * @return The plugins which have been removed.
      */
-    public Collection removeUncheckedPlugins( Collection uncheckedPlugins, Collection plugins )
+    public Collection<Plugin> removeUncheckedPlugins( Collection<String> uncheckedPlugins, Collection<Plugin> plugins )
         throws MojoExecutionException
     {
         if ( uncheckedPlugins != null && !uncheckedPlugins.isEmpty() )
         {
-            Iterator iter = uncheckedPlugins.iterator();
-            while ( iter.hasNext() )
+            for ( String pluginKey : uncheckedPlugins )
             {
-                Plugin plugin = parsePluginString( (String) iter.next(), "UncheckedPlugins" );
+                Plugin plugin = parsePluginString( pluginKey, "UncheckedPlugins" );
                 plugins.remove( plugin );
             }
         }
@@ -361,21 +391,24 @@ public class RequirePluginVersions
 
     /**
      * Combines the old Collection with the new comma separated list.
+     * 
      * @param uncheckedPlugins
      * @param uncheckedPluginsList
-     * @return
+     * @return List of unchecked plugins.
      */
-    public Collection combineUncheckedPlugins( Collection uncheckedPlugins, String uncheckedPluginsList )
+    // CHECKSTYLE_OFF: LineLength
+    public Collection<String> combineUncheckedPlugins( Collection<String> uncheckedPlugins, String uncheckedPluginsList )
+    // CHECKSTYLE_ON: LineLength
     {
-        //if the comma list is empty, then there's nothing to do here.
+        // if the comma list is empty, then there's nothing to do here.
         if ( StringUtils.isNotEmpty( uncheckedPluginsList ) )
         {
-            //make sure there is a collection to add to.
+            // make sure there is a collection to add to.
             if ( uncheckedPlugins == null )
             {
-                uncheckedPlugins = new HashSet();
+                uncheckedPlugins = new HashSet<String>();
             }
-            else if (!uncheckedPlugins.isEmpty() && log != null)
+            else if ( !uncheckedPlugins.isEmpty() && log != null )
             {
                 log.warn( "The parameter 'unCheckedPlugins' is deprecated. Use 'unCheckedPluginList' instead" );
             }
@@ -393,20 +426,18 @@ public class RequirePluginVersions
      * @return the sets the
      * @throws MojoExecutionException the mojo execution exception
      */
-    public Set addAdditionalPlugins( Set existing, List additional )
+    public Set<Plugin> addAdditionalPlugins( Set<Plugin> existing, List<String> additional )
         throws MojoExecutionException
     {
         if ( additional != null )
         {
-            Iterator iter = additional.iterator();
-            while ( iter.hasNext() )
+            for ( String pluginString : additional )
             {
-                String pluginString = (String) iter.next();
                 Plugin plugin = parsePluginString( pluginString, "AdditionalPlugins" );
 
                 if ( existing == null )
                 {
-                    existing = new HashSet();
+                    existing = new HashSet<Plugin>();
                     existing.add( plugin );
                 }
                 else if ( !existing.contains( plugin ) )
@@ -422,8 +453,9 @@ public class RequirePluginVersions
      * Helper method to parse and inject a Plugin.
      *
      * @param pluginString
-     * @return
+     * @param field
      * @throws MojoExecutionException
+     * @return the plugin
      */
     protected Plugin parsePluginString( String pluginString, String field )
         throws MojoExecutionException
@@ -457,20 +489,19 @@ public class RequirePluginVersions
      * @param project the project
      * @return the profile plugins
      */
-    public Set getProfilePlugins( MavenProject project )
+    public Set<Plugin> getProfilePlugins( MavenProject project )
     {
-        Set result = new HashSet();
-        List profiles = project.getActiveProfiles();
+        Set<Plugin> result = new HashSet<Plugin>();
+        @SuppressWarnings( "unchecked" )
+        List<Profile> profiles = project.getActiveProfiles();
         if ( profiles != null && !profiles.isEmpty() )
         {
-            Iterator iter = profiles.iterator();
-            while ( iter.hasNext() )
+            for ( Profile p : profiles )
             {
-                Profile p = (Profile) iter.next();
                 BuildBase b = p.getBuild();
                 if ( b != null )
                 {
-                    List plugins = b.getPlugins();
+                    List<Plugin> plugins = b.getPlugins();
                     if ( plugins != null )
                     {
                         result.addAll( plugins );
@@ -494,8 +525,9 @@ public class RequirePluginVersions
         try
         {
             Model model = project.getModel();
-            Map plugins = model.getBuild().getPluginsAsMap();
-            found = (Plugin) plugins.get( plugin.getKey() );
+            @SuppressWarnings( "unchecked" )
+            Map<String, Plugin> plugins = model.getBuild().getPluginsAsMap();
+            found = plugins.get( plugin.getKey() );
         }
         catch ( NullPointerException e )
         {
@@ -520,7 +552,8 @@ public class RequirePluginVersions
     protected Plugin resolvePlugin( Plugin plugin, MavenProject project )
     {
 
-        List pluginRepositories = project.getPluginArtifactRepositories();
+        @SuppressWarnings( "unchecked" )
+        List<ArtifactRepository> pluginRepositories = project.getPluginArtifactRepositories();
         Artifact artifact =
             factory.createPluginArtifact( plugin.getGroupId(), plugin.getArtifactId(),
                                           VersionRange.createFromVersion( "LATEST" ) );
@@ -532,9 +565,11 @@ public class RequirePluginVersions
         }
         catch ( ArtifactResolutionException e )
         {
+            //What does this mean?
         }
         catch ( ArtifactNotFoundException e )
         {
+            //What does this mean?
         }
 
         return plugin;
@@ -552,11 +587,11 @@ public class RequirePluginVersions
      * @throws LifecycleExecutionException the lifecycle execution exception
      * @throws IllegalAccessException the illegal access exception
      */
-    protected Set getBoundPlugins( LifecycleExecutor life, MavenProject project, String thePhases )
+    protected Set<Plugin> getBoundPlugins( LifecycleExecutor life, MavenProject project, String thePhases )
         throws PluginNotFoundException, LifecycleExecutionException, IllegalAccessException
     {
 
-        Set allPlugins = new HashSet();
+        Set<Plugin> allPlugins = new HashSet<Plugin>();
 
         // lookup the bindings for all the passed in phases
         String[] lifecyclePhases = thePhases.split( "," );
@@ -593,15 +628,14 @@ public class RequirePluginVersions
      * @param pluginWrappers the plugins
      * @return true, if successful
      */
-    protected boolean hasValidVersionSpecified( EnforcerRuleHelper helper, Plugin source, List pluginWrappers )
+    protected boolean hasValidVersionSpecified( EnforcerRuleHelper helper, Plugin source,
+                                                List<PluginWrapper> pluginWrappers )
     {
         boolean found = false;
         boolean status = false;
-        Iterator iter = pluginWrappers.iterator();
-        while ( iter.hasNext() )
+        for ( PluginWrapper plugin : pluginWrappers )
         {
             // find the matching plugin entry
-            PluginWrapper plugin = (PluginWrapper) iter.next();
             if ( source.getArtifactId().equals( plugin.getArtifactId() )
                 && source.getGroupId().equals( plugin.getGroupId() ) )
             {
@@ -686,11 +720,14 @@ public class RequirePluginVersions
      * @throws PluginNotFoundException the plugin not found exception
      * @throws LifecycleExecutionException the lifecycle execution exception
      */
-    private Set getAllPlugins( MavenProject project, Lifecycle lifecycle )
+    @SuppressWarnings( "unchecked" )
+    private Set<Plugin> getAllPlugins( MavenProject project, Lifecycle lifecycle )
         throws PluginNotFoundException, LifecycleExecutionException
 
     {
-        HashSet plugins = new HashSet();
+        log.debug( "RequirePluginVersions.getAllPlugins:" );
+
+        Set<Plugin> plugins = new HashSet<Plugin>();
         // first, bind those associated with the packaging
         Map mappings = findMappingsForLifecycle( project, lifecycle );
 
@@ -698,20 +735,30 @@ public class RequirePluginVersions
         while ( iter.hasNext() )
         {
             Entry entry = (Entry) iter.next();
-            String value = (String) entry.getValue();
-            String tokens[] = value.split( ":" );
-
-            Plugin plugin = new Plugin();
-            plugin.setGroupId( tokens[0] );
-            plugin.setArtifactId( tokens[1] );
-            plugins.add( plugin );
+            log.debug( "  lifecycleMapping = " + entry.getKey() );
+            String pluginsForLifecycle = (String) entry.getValue();
+            log.debug( "  plugins = " + pluginsForLifecycle );
+            if ( StringUtils.isNotEmpty( pluginsForLifecycle ) )
+            {
+                String pluginList[] = pluginsForLifecycle.split( "," );
+                for ( String plugin : pluginList )
+                {
+                    plugin = StringUtils.strip( plugin );
+                    log.debug( "    plugin = " + plugin );
+                    String tokens[] = plugin.split( ":" );
+                    log.debug( "    GAV = " + Arrays.asList( tokens ) );
+
+                    Plugin p = new Plugin();
+                    p.setGroupId( tokens[0] );
+                    p.setArtifactId( tokens[1] );
+                    plugins.add( p );
+                }
+            }
         }
 
-        List mojos = findOptionalMojosForLifecycle( project, lifecycle );
-        iter = mojos.iterator();
-        while ( iter.hasNext() )
+        List<String> mojos = findOptionalMojosForLifecycle( project, lifecycle );
+        for ( String value : mojos )
         {
-            String value = (String) iter.next();
             String tokens[] = value.split( ":" );
 
             Plugin plugin = new Plugin();
@@ -720,10 +767,7 @@ public class RequirePluginVersions
             plugins.add( plugin );
         }
 
-        for ( Iterator i = project.getBuildPlugins().iterator(); i.hasNext(); )
-        {
-            plugins.add( i.next() );
-        }
+        plugins.addAll( project.getBuildPlugins() );
 
         return plugins;
     }
@@ -738,21 +782,19 @@ public class RequirePluginVersions
      * @return the phase to lifecycle map
      * @throws LifecycleExecutionException the lifecycle execution exception
      */
-    public Map getPhaseToLifecycleMap()
+    public Map<String, Lifecycle> getPhaseToLifecycleMap()
         throws LifecycleExecutionException
     {
         if ( phaseToLifecycleMap == null )
         {
-            phaseToLifecycleMap = new HashMap();
+            phaseToLifecycleMap = new HashMap<String, Lifecycle>();
 
-            for ( Iterator i = lifecycles.iterator(); i.hasNext(); )
+            for ( Lifecycle lifecycle : lifecycles )
             {
-                Lifecycle lifecycle = (Lifecycle) i.next();
-
-                for ( Iterator p = lifecycle.getPhases().iterator(); p.hasNext(); )
+                @SuppressWarnings( "unchecked" )
+                List<String> phases = lifecycle.getPhases();
+                for ( String phase : phases )
                 {
-                    String phase = (String) p.next();
-
                     if ( phaseToLifecycleMap.containsKey( phase ) )
                     {
                         Lifecycle prevLifecycle = (Lifecycle) phaseToLifecycleMap.get( phase );
@@ -857,11 +899,12 @@ public class RequirePluginVersions
      * @throws LifecycleExecutionException the lifecycle execution exception
      * @throws PluginNotFoundException the plugin not found exception
      */
-    private List findOptionalMojosForLifecycle( MavenProject project, Lifecycle lifecycle )
+    @SuppressWarnings( "unchecked" )
+    private List<String> findOptionalMojosForLifecycle( MavenProject project, Lifecycle lifecycle )
         throws LifecycleExecutionException, PluginNotFoundException
     {
         String packaging = project.getPackaging();
-        List optionalMojos = null;
+        List<String> optionalMojos = null;
 
         LifecycleMapping m =
             (LifecycleMapping) findExtension( project, LifecycleMapping.ROLE, packaging, session.getSettings(),
@@ -882,13 +925,13 @@ public class RequirePluginVersions
             catch ( ComponentLookupException e )
             {
                 log.debug( "Error looking up lifecycle mapping to retrieve optional mojos. Lifecycle ID: "
-                    + lifecycle.getId() + ". Error: " + e.getMessage(), e );
+                               + lifecycle.getId() + ". Error: " + e.getMessage(), e );
             }
         }
 
         if ( optionalMojos == null )
         {
-            optionalMojos = Collections.EMPTY_LIST;
+            optionalMojos = Collections.emptyList();
         }
 
         return optionalMojos;
@@ -912,10 +955,10 @@ public class RequirePluginVersions
     {
         Object pluginComponent = null;
 
-        for ( Iterator i = project.getBuildPlugins().iterator(); i.hasNext() && pluginComponent == null; )
+        @SuppressWarnings( "unchecked" )
+        List<Plugin> buildPlugins = project.getBuildPlugins();
+        for ( Plugin plugin : buildPlugins )
         {
-            Plugin plugin = (Plugin) i.next();
-
             if ( plugin.isExtensions() )
             {
                 verifyPlugin( plugin, project, settings, localRepository );
@@ -927,6 +970,11 @@ public class RequirePluginVersions
                 try
                 {
                     pluginComponent = pluginManager.getPluginComponent( plugin, role, roleHint );
+
+                    if ( pluginComponent != null )
+                    {
+                        break;
+                    }
                 }
                 catch ( ComponentLookupException e )
                 {
@@ -1005,34 +1053,34 @@ public class RequirePluginVersions
      * @throws IOException Signals that an I/O exception has occurred.
      * @throws XmlPullParserException the xml pull parser exception
      */
-    protected List getAllPluginEntries( MavenProject project )
+    protected List<PluginWrapper> getAllPluginEntries( MavenProject project )
         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, XmlPullParserException
     {
-        List plugins = new ArrayList();
+        List<PluginWrapper> plugins = new ArrayList<PluginWrapper>();
         // get all the pom models
-        
+
         String pomName = null;
         try
         {
             pomName = project.getFile().getName();
         }
-        catch (Exception e)
+        catch ( Exception e )
         {
             pomName = "pom.xml";
         }
-        List models =
+        List<Model> models =
             utils.getModelsRecursively( project.getGroupId(), project.getArtifactId(), project.getVersion(),
                                         new File( project.getBasedir(), pomName ) );
 
         // now find all the plugin entries, either in
         // build.plugins or build.pluginManagement.plugins, profiles.plugins and reporting
-        Iterator iter = models.iterator();
-        while ( iter.hasNext() )
+        for ( Model model : models )
         {
-            Model model = (Model) iter.next();
             try
             {
-                plugins.addAll( PluginWrapper.addAll( model.getBuild().getPlugins(), model.getId() + ".build.plugins" ) );
+                List<Plugin> modelPlugins = model.getBuild().getPlugins();
+                plugins.addAll( PluginWrapper.addAll( utils.resolvePlugins( modelPlugins ), model.getId()
+                    + ".build.plugins" ) );
             }
             catch ( NullPointerException e )
             {
@@ -1041,8 +1089,10 @@ public class RequirePluginVersions
 
             try
             {
+                List<ReportPlugin> modelReportPlugins = model.getReporting().getPlugins();
                 // add the reporting plugins
-                plugins.addAll( PluginWrapper.addAll( model.getReporting().getPlugins(), model.getId() + ".reporting" ) );
+                plugins.addAll( PluginWrapper.addAll( utils.resolveReportPlugins( modelReportPlugins ), model.getId()
+                    + ".reporting" ) );
             }
             catch ( NullPointerException e )
             {
@@ -1051,8 +1101,9 @@ public class RequirePluginVersions
 
             try
             {
-                plugins.addAll( PluginWrapper.addAll( model.getBuild().getPluginManagement().getPlugins(),
-                                                      model.getId() + ".build.pluginManagement.plugins" ) );
+                List<Plugin> modelPlugins = model.getBuild().getPluginManagement().getPlugins();
+                plugins.addAll( PluginWrapper.addAll( utils.resolvePlugins( modelPlugins ), model.getId()
+                    + ".build.pluginManagement.plugins" ) );
             }
             catch ( NullPointerException e )
             {
@@ -1060,13 +1111,13 @@ public class RequirePluginVersions
             }
 
             // Add plugins in profiles
-            Iterator it = model.getProfiles().iterator();
-            while ( it.hasNext() )
+            List<Profile> profiles = model.getProfiles();
+            for ( Profile profile : profiles )
             {
-                Profile profile = (Profile) it.next();
                 try
                 {
-                    plugins.addAll( PluginWrapper.addAll( profile.getBuild().getPlugins(), model.getId()
+                    List<Plugin> modelPlugins = profile.getBuild().getPlugins();
+                    plugins.addAll( PluginWrapper.addAll( utils.resolvePlugins( modelPlugins ), model.getId()
                         + ".profiles.profile[" + profile.getId() + "].build.plugins" ) );
                 }
                 catch ( NullPointerException e )
@@ -1076,9 +1127,11 @@ public class RequirePluginVersions
 
                 try
                 {
+                    List<ReportPlugin> modelReportPlugins = profile.getReporting().getPlugins();
                     // add the reporting plugins
-                    plugins.addAll( PluginWrapper.addAll( profile.getReporting().getPlugins(), model.getId()
-                        + "profile[" + profile.getId() + "].reporting.plugins" ) );
+                    plugins.addAll( PluginWrapper.addAll( utils.resolveReportPlugins( modelReportPlugins ),
+                                                          model.getId() + "profile[" + profile.getId()
+                                                              + "].reporting.plugins" ) );
                 }
                 catch ( NullPointerException e )
                 {
@@ -1086,10 +1139,9 @@ public class RequirePluginVersions
                 }
                 try
                 {
-                    // add the reporting plugins
-                    plugins.addAll( PluginWrapper.addAll( profile.getBuild().getPluginManagement().getPlugins(),
-                                                          model.getId() + "profile[" + profile.getId()
-                                                              + "].build.pluginManagement.plugins" ) );
+                    List<Plugin> modelPlugins = profile.getBuild().getPluginManagement().getPlugins();
+                    plugins.addAll( PluginWrapper.addAll( utils.resolvePlugins( modelPlugins ), model.getId()
+                        + "profile[" + profile.getId() + "].build.pluginManagement.plugins" ) );
                 }
                 catch ( NullPointerException e )
                 {
@@ -1142,26 +1194,6 @@ public class RequirePluginVersions
     }
 
     /**
-     * Gets the message.
-     *
-     * @return the message
-     */
-    protected String getMessage()
-    {
-        return this.message;
-    }
-
-    /**
-     * Sets the message.
-     *
-     * @param theMessage the message to set
-     */
-    protected void setMessage( String theMessage )
-    {
-        this.message = theMessage;
-    }
-
-    /**
      * Gets the utils.
      *
      * @return the utils
@@ -1230,4 +1262,24 @@ public class RequirePluginVersions
     {
         this.unCheckedPlugins = unCheckedPlugins;
     }
+
+    public final void setPhases( String phases )
+    {
+        this.phases = phases;
+    }
+
+    public final String getPhases()
+    {
+        return phases;
+    }
+
+    public final void setAdditionalPlugins( List<String> additionalPlugins )
+    {
+        this.additionalPlugins = additionalPlugins;
+    }
+
+    public final List<String> getAdditionalPlugins()
+    {
+        return additionalPlugins;
+    }
 }
\ No newline at end of file
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePrerequisite.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePrerequisite.java
new file mode 100644
index 0000000..4e51b94
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePrerequisite.java
@@ -0,0 +1,134 @@
+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.util.List;
+
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.model.Prerequisites;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+
+/**
+ * @author Robert Scholte
+ * @since 1.3
+ */
+public class RequirePrerequisite
+    extends AbstractNonCacheableEnforcerRule
+{
+    /**
+     * Only the projects with one of these packagings will be enforced to have the correct prerequisite.
+     * 
+     * @since 1.4
+     */
+    private List<String> packagings;
+
+    /**
+     * Can either be version or a range, e.g. {@code 2.2.1} or {@code [2.2.1,)}
+     */
+    private String mavenVersion;
+
+    /**
+     * Set the mavenVersion Can either be version or a range, e.g. {@code 2.2.1} or {@code [2.2.1,)}
+     * 
+     * @param mavenVersion the version or {@code null}
+     */
+    public void setMavenVersion( String mavenVersion )
+    {
+        this.mavenVersion = mavenVersion;
+    }
+
+    /**
+     * Only the projects with one of these packagings will be enforced to have the correct prerequisite.
+     * 
+     * @since 1.4
+     * @param packagings the list of packagings
+     */
+    public void setPackagings( List<String> packagings )
+    {
+        this.packagings = packagings;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        try
+        {
+            MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+
+            if ( "pom".equals( project.getPackaging() ) )
+            {
+                helper.getLog().debug( "Packaging is pom, skipping requirePrerequisite rule" );
+                return;
+            }
+
+            if ( packagings != null && !packagings.contains( project.getPackaging() ) )
+            {
+                // CHECKSTYLE_OFF: LineLength
+                helper.getLog().debug( "Packaging is " + project.getPackaging() + ", skipping requirePrerequisite rule" );
+                return;
+                // CHECKSTYLE_ON: LineLength
+            }
+
+            Prerequisites prerequisites = project.getPrerequisites();
+
+            if ( prerequisites == null )
+            {
+                throw new EnforcerRuleException( "Requires prerequisite not set" );
+            }
+
+            if ( mavenVersion != null )
+            {
+
+                VersionRange requiredVersionRange = VersionRange.createFromVersionSpec( mavenVersion );
+
+                if ( !requiredVersionRange.hasRestrictions() )
+                {
+                    requiredVersionRange = VersionRange.createFromVersionSpec( "[" + mavenVersion + ",)" );
+                }
+
+                VersionRange specifiedVersion = VersionRange.createFromVersionSpec( prerequisites.getMaven() );
+
+                VersionRange restrictedVersionRange = requiredVersionRange.restrict( specifiedVersion );
+
+                if ( restrictedVersionRange.getRecommendedVersion() == null )
+                {
+                    throw new EnforcerRuleException( "The specified Maven prerequisite( " + specifiedVersion
+                        + " ) doesn't match the required version: " + mavenVersion );
+                }
+            }
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            throw new EnforcerRuleException( e.getMessage(), e );
+        }
+        catch ( InvalidVersionSpecificationException e )
+        {
+            throw new EnforcerRuleException( e.getMessage(), e );
+        }
+    }
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java
index fec2a23..b915475 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java
@@ -25,29 +25,28 @@ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluatio
 
 /**
  * This rule checks that certain properties are set.
- *
+ * 
  * @author Paul Gier
  */
 public class RequireProperty
-    extends AbstractNonCacheableEnforcerRule
+    extends AbstractPropertyEnforcerRule
 {
 
-    /** Specify the required property. */
-    public String property = null;
-
-    /** Match the property value to a given regular expression. Defaults to <code>null</code> (any value is ok). */
-    public String regex = null;
-
-    /** Specify a warning message if the regular expression is not matched. */
-    public String regexMessage = null;
-
     /**
-     * Execute the rule.
-     *
-     * @param helper the helper
-     * @throws EnforcerRuleException the enforcer rule exception
+     * Specify the required property.
+     * 
+     * @see {@link #setProperty(String)}
+     * @see {@link #getPropertyName()}
      */
-    public void execute( EnforcerRuleHelper helper )
+    private String property = null;
+
+    public final void setProperty( String property )
+    {
+        this.property = property;
+    }
+
+    @Override
+    public Object resolveValue( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
         Object propValue = null;
@@ -59,26 +58,23 @@ public class RequireProperty
         {
             throw new EnforcerRuleException( "Unable to evaluate property: " + property, eee );
         }
+        return propValue;
+    }
 
-        // Check that the property is not null or empty string
-        if ( propValue == null )
-        {
-            if ( message == null )
-            {
-                message = "Property \"" + property + "\" is required for this build.";
-            }
-            throw new EnforcerRuleException( message );
-        }
-        // If there is a regex, check that the property matches it
-        if ( regex != null && !propValue.toString().matches( regex ) )
-        {
-            if ( regexMessage == null )
-            {
-                regexMessage =
-                    "Property \"" + property + "\" evaluates to \"" + propValue + "\".  " +
-                        "This does not match the regular expression \"" + regex + "\"";
-            }
-            throw new EnforcerRuleException( regexMessage );
-        }
+    protected String resolveValue()
+    {
+        return null;
+    }
+
+    @Override
+    public String getPropertyName()
+    {
+        return property;
+    }
+
+    @Override
+    public String getName()
+    {
+        return "Property";
     }
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java
index c0287ab..1156d6e 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java
@@ -20,7 +20,6 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
@@ -38,7 +37,7 @@ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluatio
  * This rule checks that no snapshots are included.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: RequireReleaseDeps.java 989820 2010-08-26 16:52:46Z pgier $
+ * @version $Id: RequireReleaseDeps.java 1697215 2015-08-23 16:27:17Z khmarbaise $
  */
 public class RequireReleaseDeps
     extends AbstractBanDependencies
@@ -48,30 +47,46 @@ public class RequireReleaseDeps
      * Allows this rule to execute only when this project is a release.
      *
      * @parameter
+     * 
+     * @see {@link #setOnlyWhenRelease(boolean)}
+     * @see {@link #isOnlyWhenRelease()}
+
      */
-    public boolean onlyWhenRelease = false;
+    private boolean onlyWhenRelease = false;
 
     /**
      * Allows this rule to fail when the parent is defined as a snapshot.
      *
      * @parameter
+     * 
+     * @see {@link #setFailWhenParentIsSnapshot(boolean)}
+     * @see {@link #isFailWhenParentIsSnapshot()}
      */
-    public boolean failWhenParentIsSnapshot = true;
+    private boolean failWhenParentIsSnapshot = true;
 
     /**
      * Dependencies to ignore when checking for release versions.  For example, inter-module dependencies 
      * can be excluded from the check and therefore allowed to contain snapshot versions.
+     * 
+     * @see {@link #setExcludes(List)}
+     * @see {@link #getExcludes()}
      */
-    public List excludes = null;
+    private List<String> excludes = null;
 
     /**
      * Dependencies to include when checking for release versions.  If any of the included dependencies
      * have snapshot versions, the rule will fail.
+     * 
+     * @see {@link #setIncludes(List)}
+     * @see {@link #getIncludes()}
      */
-    public List includes = null;
+    private List<String> includes = null;
 
     /**
      * Override parent to allow optional ignore of this rule.
+     * 
+     * @param helper the enforcerRuleHelper
+     * @throws EnforcerRuleException when an exception occurs
      */
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
@@ -110,7 +125,7 @@ public class RequireReleaseDeps
 
     /**
      * @param helper
-     * @return
+     * @return The evaluated {@link MavenProject}.
      * @throws EnforcerRuleException
      */
     private MavenProject getProject( EnforcerRuleHelper helper )
@@ -126,26 +141,19 @@ public class RequireReleaseDeps
         }
     }
 
+
     /**
-     * Checks the set of dependencies to see if any snapshots are included
-     *
-     * @param dependencies the dependencies
-     * @param log the log
-     * @return the sets the
-     * @throws EnforcerRuleException the enforcer rule exception
+     * {@inheritDoc}
      */
-    protected Set checkDependencies( Set dependencies, Log log )
+    protected Set<Artifact> checkDependencies( Set<Artifact> dependencies, Log log )
         throws EnforcerRuleException
     {
-        Set foundSnapshots = new HashSet();
+        Set<Artifact> foundSnapshots = new HashSet<Artifact>();
 
-        Set filteredDependencies = this.filterArtifacts( dependencies );
+        Set<Artifact> filteredDependencies = filterArtifacts( dependencies );
         
-        Iterator DependencyIter = filteredDependencies.iterator();
-        while ( DependencyIter.hasNext() )
+        for ( Artifact artifact : filteredDependencies )
         {
-            Artifact artifact = (Artifact) DependencyIter.next();
-
             if ( artifact.isSnapshot() )
             {
                 foundSnapshots.add( artifact );
@@ -162,7 +170,7 @@ public class RequireReleaseDeps
      * @param dependencies the list of dependencies to filter
      * @return the resulting set of dependencies
      */
-    public Set filterArtifacts( Set dependencies )
+    public Set<Artifact> filterArtifacts( Set<Artifact> dependencies )
     {
         if ( includes == null && excludes == null )
         {
@@ -179,11 +187,9 @@ public class RequireReleaseDeps
             filter.add( new StrictPatternExcludesArtifactFilter( excludes ) );
         }
         
-        Set result = new HashSet();
-        Iterator iter = dependencies.iterator();
-        while ( iter.hasNext() )
+        Set<Artifact> result = new HashSet<Artifact>();
+        for ( Artifact artifact : dependencies )
         {
-            Artifact artifact = (Artifact) iter.next();
             if ( filter.include( artifact ) )
             {
                 result.add( artifact );
@@ -192,23 +198,43 @@ public class RequireReleaseDeps
         return result;
     }
 
-    public boolean isOnlyWhenRelease()
+    public final boolean isOnlyWhenRelease()
     {
         return onlyWhenRelease;
     }
 
-    public void setOnlyWhenRelease( boolean onlyWhenRelease )
+    public final void setOnlyWhenRelease( boolean onlyWhenRelease )
     {
         this.onlyWhenRelease = onlyWhenRelease;
     }
 
-    public boolean isFailWhenParentIsSnapshot()
+    public final boolean isFailWhenParentIsSnapshot()
     {
         return failWhenParentIsSnapshot;
     }
 
-    public void setFailWhenParentIsSnapshot( boolean failWhenParentIsSnapshot )
+    public final void setFailWhenParentIsSnapshot( boolean failWhenParentIsSnapshot )
     {
         this.failWhenParentIsSnapshot = failWhenParentIsSnapshot;
     }
+    
+    public final void setExcludes( List<String> excludes )
+    {
+        this.excludes = excludes;
+    }
+    
+    public final List<String> getExcludes()
+    {
+        return excludes;
+    }
+    
+    public void setIncludes( List<String> includes )
+    {
+        this.includes = includes;
+    }
+    
+    public List<String> getIncludes()
+    {
+        return includes;
+    }
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java
index 8856f51..d800ff4 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java
@@ -38,8 +38,11 @@ public class RequireReleaseVersion
      * Allows this rule to fail when the parent is defined as a snapshot.
      *
      * @parameter
+     * 
+     * @see {@link #setFailWhenParentIsSnapshot(boolean)}
+     * @see {@link #isFailWhenParentIsSnapshot()}
      */
-    public boolean failWhenParentIsSnapshot = true;
+    private boolean failWhenParentIsSnapshot = true;
 
     /*
      * (non-Javadoc)
@@ -54,12 +57,13 @@ public class RequireReleaseVersion
 
         if ( project.getArtifact().isSnapshot() )
         {
+            String message = getMessage();
             StringBuffer buf = new StringBuffer();
             if ( message != null )
             {
-                buf.append( message + "\n" );
+                buf.append( message ).append( '\n' );
             }
-            buf.append( "This project cannot be a snapshot:" + project.getArtifact().getId() );
+            buf.append( "This project cannot be a snapshot:" ).append( project.getArtifact().getId() );
             throw new EnforcerRuleException( buf.toString() );
         }
         if ( failWhenParentIsSnapshot )
@@ -75,7 +79,7 @@ public class RequireReleaseVersion
 
     /**
      * @param helper
-     * @return
+     * @return The evaluated {@link MavenProject}.
      * @throws EnforcerRuleException
      */
     private MavenProject getProject( EnforcerRuleHelper helper )
@@ -91,12 +95,12 @@ public class RequireReleaseVersion
         }
     }
 
-    public boolean isFailWhenParentIsSnapshot()
+    public final boolean isFailWhenParentIsSnapshot()
     {
         return failWhenParentIsSnapshot;
     }
 
-    public void setFailWhenParentIsSnapshot( boolean failWhenParentIsSnapshot )
+    public final void setFailWhenParentIsSnapshot( boolean failWhenParentIsSnapshot )
     {
         this.failWhenParentIsSnapshot = failWhenParentIsSnapshot;
     }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireSameVersions.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireSameVersions.java
new file mode 100644
index 0000000..0a4f693
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireSameVersions.java
@@ -0,0 +1,129 @@
+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.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+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.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+
+/**
+ * @author Robert Scholte
+ * @since 1.3
+ */
+public class RequireSameVersions
+    extends AbstractNonCacheableEnforcerRule
+{
+    private boolean uniqueVersions;
+
+    private Set<String> dependencies = new HashSet<String>();
+
+    private Set<String> plugins = new HashSet<String>();
+
+    private Set<String> buildPlugins = new HashSet<String>();
+
+    private Set<String> reportPlugins = new HashSet<String>();
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        // get the project
+        MavenProject project = null;
+        try
+        {
+            project = (MavenProject) helper.evaluate( "${project}" );
+        }
+        catch ( ExpressionEvaluationException eee )
+        {
+            throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", eee );
+        }
+
+        // consider including profile based artifacts
+        Map<String, List<String>> versionMembers = new LinkedHashMap<String, List<String>>();
+
+        Set<String> buildPluginSet = new HashSet<String>( buildPlugins );
+        buildPluginSet.addAll( plugins );
+        Set<String> reportPluginSet = new HashSet<String>( reportPlugins );
+        reportPluginSet.addAll( plugins );
+
+        // CHECKSTYLE_OFF: LineLength
+        versionMembers.putAll( collectVersionMembers( project.getArtifacts(), dependencies, " (dependency)" ) );
+        versionMembers.putAll( collectVersionMembers( project.getPluginArtifacts(), buildPlugins, " (buildPlugin)" ) );
+        versionMembers.putAll( collectVersionMembers( project.getReportArtifacts(), reportPlugins, " (reportPlugin)" ) );
+        // CHECKSTYLE_ON: LineLength
+
+        if ( versionMembers.size() > 1 )
+        {
+            StringBuilder builder = new StringBuilder( "Found entries with different versions\n" );
+            for ( Map.Entry<String, List<String>> entry : versionMembers.entrySet() )
+            {
+                builder.append( "Entries with version " ).append( entry.getKey() ).append( '\n' );
+                for ( String conflictId : entry.getValue() )
+                {
+                    builder.append( "- " ).append( conflictId ).append( '\n' );
+                }
+            }
+            throw new EnforcerRuleException( builder.toString() );
+        }
+    }
+
+    private Map<String, List<String>> collectVersionMembers( Set<Artifact> artifacts, Collection<String> patterns,
+                                                             String source )
+    {
+        Map<String, List<String>> versionMembers = new LinkedHashMap<String, List<String>>();
+
+        List<Pattern> regExs = new ArrayList<Pattern>();
+        for ( String pattern : patterns )
+        {
+            String regex = pattern.replace( ".", "\\." ).replace( "*", ".*" ).replace( ":", "\\:" ).replace( '?', '.' );
+
+            // pattern is groupId[:artifactId[:type[:classifier]]]
+            regExs.add( Pattern.compile( regex + "(\\:.+)?" ) );
+        }
+
+        for ( Artifact artifact : artifacts )
+        {
+            for ( Pattern regEx : regExs )
+            {
+                if ( regEx.matcher( artifact.getDependencyConflictId() ).matches() )
+                {
+                    String version = uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
+                    if ( !versionMembers.containsKey( version ) )
+                    {
+                        versionMembers.put( version, new ArrayList<String>() );
+                    }
+                    versionMembers.get( version ).add( artifact.getDependencyConflictId() + source );
+                }
+            }
+        }
+        return versionMembers;
+    }
+
+}
\ No newline at end of file
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireSnapshotVersion.java
similarity index 58%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java
copy to enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireSnapshotVersion.java
index 8856f51..808e383 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseVersion.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireSnapshotVersion.java
@@ -26,58 +26,46 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
 
 /**
- * This rule checks that the current project is not a snapshot.
- *
- * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
+ * This rule checks that the current project is not a release.
  */
-public class RequireReleaseVersion
+public class RequireSnapshotVersion
     extends AbstractNonCacheableEnforcerRule
 {
 
     /**
-     * Allows this rule to fail when the parent is defined as a snapshot.
-     *
-     * @parameter
+     * Allows this rule to fail when the parent is defined as a release.
      */
-    public boolean failWhenParentIsSnapshot = true;
+    private boolean failWhenParentIsRelease = true;
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
-     */
-    public void execute( EnforcerRuleHelper theHelper )
+    public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
 
-        MavenProject project = getProject( theHelper );
+        MavenProject project = getProject( helper );
+        Artifact artifact = project.getArtifact();
 
-        if ( project.getArtifact().isSnapshot() )
+        if ( !artifact.isSnapshot() )
         {
-            StringBuffer buf = new StringBuffer();
+            String message = getMessage();
+            StringBuilder sb = new StringBuilder();
             if ( message != null )
             {
-                buf.append( message + "\n" );
+                sb.append( message ).append( '\n' );
             }
-            buf.append( "This project cannot be a snapshot:" + project.getArtifact().getId() );
-            throw new EnforcerRuleException( buf.toString() );
+            sb.append( "This project cannot be a release:" ).append( artifact.getId() );
+            throw new EnforcerRuleException( sb.toString() );
         }
-        if ( failWhenParentIsSnapshot )
+        if ( failWhenParentIsRelease )
         {
             Artifact parentArtifact = project.getParentArtifact();
-            if ( parentArtifact != null && parentArtifact.isSnapshot() )
+            if ( parentArtifact != null && !parentArtifact.isSnapshot() )
             {
-                throw new EnforcerRuleException( "Parent Cannot be a snapshot: " + parentArtifact.getId() );
+                throw new EnforcerRuleException( "Parent cannot be a release: " + parentArtifact.getId() );
             }
         }
 
     }
 
-    /**
-     * @param helper
-     * @return
-     * @throws EnforcerRuleException
-     */
     private MavenProject getProject( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
@@ -91,13 +79,14 @@ public class RequireReleaseVersion
         }
     }
 
-    public boolean isFailWhenParentIsSnapshot()
+    public boolean isFailWhenParentIsRelease()
     {
-        return failWhenParentIsSnapshot;
+        return failWhenParentIsRelease;
     }
 
-    public void setFailWhenParentIsSnapshot( boolean failWhenParentIsSnapshot )
+    public void setFailWhenParentIsRelease( boolean failWhenParentIsRelease )
     {
-        this.failWhenParentIsSnapshot = failWhenParentIsSnapshot;
+        this.failWhenParentIsRelease = failWhenParentIsRelease;
     }
+
 }
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
new file mode 100644
index 0000000..2b4d857
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
@@ -0,0 +1,403 @@
+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.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+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;
+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.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.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.i18n.I18N;
+
+/**
+ * Rule to enforce that the resolved dependency is also the most recent one of all transitive dependencies.
+ * 
+ * @author Geoffrey De Smet
+ * @since 1.1
+ */
+public class RequireUpperBoundDeps
+    extends AbstractNonCacheableEnforcerRule
+{
+    private static Log log;
+
+    private static I18N i18n;
+
+    /**
+     * @since 1.3
+     */
+    private boolean uniqueVersions;
+
+    /**
+     * Dependencies to ignore.
+     *
+     * @since TBD
+     */
+    private List<String> excludes = null;
+
+    /**
+     * Set to {@code true} if timestamped snapshots should be used.
+     * 
+     * @param uniqueVersions 
+     * @since 1.3
+     */
+    public void setUniqueVersions( boolean uniqueVersions )
+    {
+        this.uniqueVersions = uniqueVersions;
+    }
+
+    /**
+     * Sets dependencies to exclude.
+     * @param excludes a list of {@code groupId:artifactId} names
+     */
+    public void setExcludes( List<String> excludes )
+    {
+        this.excludes = excludes;
+    }
+
+    // CHECKSTYLE_OFF: LineLength
+    /**
+     * Uses the {@link EnforcerRuleHelper} to populate the values of the
+     * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
+     * factory method. <br/>
+     * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+     * 
+     * @param helper
+     * @return a Dependency Node which is the root of the project's dependency tree
+     * @throws EnforcerRuleException when the build should fail
+     */
+    // CHECKSTYLE_ON: LineLength
+    private DependencyNode getNode( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        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 );
+            return node;
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            throw new EnforcerRuleException( "Unable to lookup an expression " + e.getLocalizedMessage(), e );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+        }
+        catch ( DependencyTreeBuilderException e )
+        {
+            throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+        }
+    }
+
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        if ( log == null )
+        {
+            log = helper.getLog();
+        }
+        try
+        {
+            if ( i18n == null )
+            {
+                i18n = (I18N) helper.getComponent( I18N.class );
+            }
+            DependencyNode node = getNode( helper );
+            RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor();
+            visitor.setUniqueVersions( uniqueVersions );
+            node.accept( visitor );
+            List<String> errorMessages = buildErrorMessages( visitor.getConflicts() );
+            if ( errorMessages.size() > 0 )
+            {
+                throw new EnforcerRuleException( "Failed while enforcing RequireUpperBoundDeps. The error(s) are "
+                    + errorMessages );
+            }
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+        }
+        catch ( Exception e )
+        {
+            throw new EnforcerRuleException( e.getLocalizedMessage(), e );
+        }
+    }
+
+    private List<String> buildErrorMessages( List<List<DependencyNode>> conflicts )
+    {
+        List<String> errorMessages = new ArrayList<String>( conflicts.size() );
+        for ( List<DependencyNode> conflict : conflicts )
+        {
+            Artifact artifact = conflict.get( 0 ).getArtifact();
+            String groupArt = artifact.getGroupId() + ":" + artifact.getArtifactId();
+            if ( excludes != null && excludes.contains( groupArt ) )
+            {
+                log.info( "Ignoring requireUpperBoundDeps in " + groupArt );
+            }
+            else
+            {
+                errorMessages.add( buildErrorMessage( conflict ) );
+            }
+        }
+        return errorMessages;
+    }
+
+    private String buildErrorMessage( List<DependencyNode> conflict )
+    {
+        StringBuilder errorMessage = new StringBuilder();
+        errorMessage.append( "\nRequire upper bound dependencies error for "
+            + getFullArtifactName( conflict.get( 0 ), false ) + " paths to dependency are:\n" );
+        if ( conflict.size() > 0 )
+        {
+            errorMessage.append( buildTreeString( conflict.get( 0 ) ) );
+        }
+        for ( DependencyNode node : conflict.subList( 1, conflict.size() ) )
+        {
+            errorMessage.append( "and\n" );
+            errorMessage.append( buildTreeString( node ) );
+        }
+        return errorMessage.toString();
+    }
+
+    private StringBuilder buildTreeString( DependencyNode node )
+    {
+        List<String> loc = new ArrayList<String>();
+        DependencyNode currentNode = node;
+        while ( currentNode != null )
+        {
+            StringBuilder line = new StringBuilder( getFullArtifactName( currentNode, false ) );
+            
+            if ( currentNode.getPremanagedVersion() != null )
+            {
+                line.append( " (managed) <-- " );
+                line.append( getFullArtifactName( currentNode, true ) );
+            }
+            
+            loc.add( line.toString() );
+            currentNode = currentNode.getParent();
+        }
+        Collections.reverse( loc );
+        StringBuilder builder = new StringBuilder();
+        for ( int i = 0; i < loc.size(); i++ )
+        {
+            for ( int j = 0; j < i; j++ )
+            {
+                builder.append( "  " );
+            }
+            builder.append( "+-" ).append( loc.get( i ) );
+            builder.append( "\n" );
+        }
+        return builder;
+    }
+
+    private String getFullArtifactName( DependencyNode node, boolean usePremanaged )
+    {
+        Artifact artifact = node.getArtifact();
+
+        String version = node.getPremanagedVersion();
+        if ( !usePremanaged || version == null )
+        {
+            version = uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
+        }
+        return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version;
+    }
+
+    private static class RequireUpperBoundDepsVisitor
+        implements DependencyNodeVisitor
+    {
+
+        private boolean uniqueVersions;
+
+        public void setUniqueVersions( boolean uniqueVersions )
+        {
+            this.uniqueVersions = uniqueVersions;
+        }
+
+        private Map<String, List<DependencyNodeHopCountPair>> keyToPairsMap =
+            new LinkedHashMap<String, List<DependencyNodeHopCountPair>>();
+
+        public boolean visit( DependencyNode node )
+        {
+            DependencyNodeHopCountPair pair = new DependencyNodeHopCountPair( node );
+            String key = pair.constructKey();
+            List<DependencyNodeHopCountPair> pairs = keyToPairsMap.get( key );
+            if ( pairs == null )
+            {
+                pairs = new ArrayList<DependencyNodeHopCountPair>();
+                keyToPairsMap.put( key, pairs );
+            }
+            pairs.add( pair );
+            Collections.sort( pairs );
+            return true;
+        }
+
+        public boolean endVisit( DependencyNode node )
+        {
+            return true;
+        }
+
+        public List<List<DependencyNode>> getConflicts()
+        {
+            List<List<DependencyNode>> output = new ArrayList<List<DependencyNode>>();
+            for ( List<DependencyNodeHopCountPair> pairs : keyToPairsMap.values() )
+            {
+                if ( containsConflicts( pairs ) )
+                {
+                    List<DependencyNode> outputSubList = new ArrayList<DependencyNode>( pairs.size() );
+                    for ( DependencyNodeHopCountPair pair : pairs )
+                    {
+                        outputSubList.add( pair.getNode() );
+                    }
+                    output.add( outputSubList );
+                }
+            }
+            return output;
+        }
+
+        @SuppressWarnings( "unchecked" )
+        private boolean containsConflicts( List<DependencyNodeHopCountPair> pairs )
+        {
+            DependencyNodeHopCountPair resolvedPair = pairs.get( 0 );
+
+            // search for artifact with lowest hopCount
+            for ( DependencyNodeHopCountPair hopPair : pairs.subList( 1, pairs.size() ) )
+            {
+                if ( hopPair.getHopCount() < resolvedPair.getHopCount() )
+                {
+                    resolvedPair = hopPair;
+                }
+            }
+
+            ArtifactVersion resolvedVersion = resolvedPair.extractArtifactVersion( uniqueVersions, false );
+
+            for ( DependencyNodeHopCountPair pair : pairs )
+            {
+                ArtifactVersion version = pair.extractArtifactVersion( uniqueVersions, true );
+                if ( resolvedVersion.compareTo( version ) < 0 )
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+    }
+
+    private static class DependencyNodeHopCountPair
+        implements Comparable<DependencyNodeHopCountPair>
+    {
+
+        private DependencyNode node;
+
+        private int hopCount;
+
+        private DependencyNodeHopCountPair( DependencyNode node )
+        {
+            this.node = node;
+            countHops();
+        }
+
+        private void countHops()
+        {
+            hopCount = 0;
+            DependencyNode parent = node.getParent();
+            while ( parent != null )
+            {
+                hopCount++;
+                parent = parent.getParent();
+            }
+        }
+
+        private String constructKey()
+        {
+            Artifact artifact = node.getArtifact();
+            return artifact.getGroupId() + ":" + artifact.getArtifactId();
+        }
+
+        public DependencyNode getNode()
+        {
+            return node;
+        }
+
+        private ArtifactVersion extractArtifactVersion( boolean uniqueVersions, boolean usePremanagedVersion )
+        {
+            if ( usePremanagedVersion && node.getPremanagedVersion() != null )
+            {
+                return new DefaultArtifactVersion( node.getPremanagedVersion() );
+            }
+
+            Artifact artifact = node.getArtifact();
+            String version = uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
+            if ( version != null )
+            {
+                return new DefaultArtifactVersion( version );
+            }
+            try
+            {
+                return artifact.getSelectedVersion();
+            }
+            catch ( OverConstrainedVersionException e )
+            {
+                throw new RuntimeException( "Version ranges problem with " + node.getArtifact(), e );
+            }
+        }
+
+        public int getHopCount()
+        {
+            return hopCount;
+        }
+
+        public int compareTo( DependencyNodeHopCountPair other )
+        {
+            return Integer.valueOf( hopCount ).compareTo( Integer.valueOf( other.getHopCount() ) );
+        }
+    }
+
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java
new file mode 100644
index 0000000..10be58e
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java
@@ -0,0 +1,219 @@
+package org.apache.maven.plugins.enforcer.utils;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.plugins.enforcer.AbstractVersionEnforcer;
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * This class is used for matching Artifacts against a list of patterns.
+ * 
+ * @author Jakub Senko
+ * @see org.apache.maven.plugins.enforcer.BanTransitiveDependencies
+ */
+public final class ArtifactMatcher
+{
+
+    /**
+     * @author I don't know
+     */
+    public static class Pattern
+    {
+        private String pattern;
+
+        private String[] parts;
+
+        public Pattern( String pattern )
+        {
+            if ( pattern == null )
+            {
+                throw new NullPointerException( "pattern" );
+            }
+
+            this.pattern = pattern;
+
+            parts = pattern.split( ":", 7 );
+
+            if ( parts.length == 7 )
+            {
+                throw new IllegalArgumentException( "Pattern contains too many delimiters." );
+            }
+
+            for ( String part : parts )
+            {
+                if ( "".equals( part ) )
+                {
+                    throw new IllegalArgumentException( "Pattern or its part is empty." );
+                }
+            }
+        }
+
+        public boolean match( Artifact artifact )
+            throws InvalidVersionSpecificationException
+        {
+            if ( artifact == null )
+            {
+                throw new NullPointerException( "artifact" );
+            }
+
+            switch ( parts.length )
+            {
+                case 6:
+                    String classifier = artifact.getClassifier();
+                    if ( !matches( parts[5], classifier ) )
+                    {
+                        return false;
+                    }
+                case 5:
+                    String scope = artifact.getScope();
+                    if ( scope == null || scope.equals( "" ) )
+                    {
+                        scope = Artifact.SCOPE_COMPILE;
+                    }
+
+                    if ( !matches( parts[4], scope ) )
+                    {
+                        return false;
+                    }
+                case 4:
+                    String type = artifact.getType();
+                    if ( type == null || type.equals( "" ) )
+                    {
+                        type = "jar";
+                    }
+
+                    if ( !matches( parts[3], type ) )
+                    {
+                        return false;
+                    }
+
+                case 3:
+                    if ( !matches( parts[2], artifact.getVersion() ) )
+                    {
+                        // CHECKSTYLE_OFF: LineLength
+                        if ( !AbstractVersionEnforcer.containsVersion( VersionRange.createFromVersionSpec( parts[2] ),
+                                                                       new DefaultArtifactVersion(
+                                                                                                   artifact.getVersion() ) ) )
+                        // CHECKSTYLE_ON: LineLength
+                        {
+                            return false;
+                        }
+                    }
+
+                case 2:
+                    if ( !matches( parts[1], artifact.getArtifactId() ) )
+                    {
+                        return false;
+                    }
+                case 1:
+                    return matches( parts[0], artifact.getGroupId() );
+                default:
+                    throw new AssertionError();
+            }
+        }
+
+        private boolean matches( String expression, String input )
+        {
+            String regex =
+                    expression.replace( ".", "\\." ).replace( "*", ".*" ).replace( ":", "\\:" ).replace( '?', '.' )
+                            .replace( "[", "\\[" ).replace( "]", "\\]" ).replace( "(", "\\(" ).replace( ")", "\\)" );
+
+            // TODO: Check if this can be done better or prevented earlier.
+            if ( input == null )
+            {
+                input = "";
+            }
+
+            return java.util.regex.Pattern.matches( regex, input );
+        }
+
+        @Override
+        public String toString()
+        {
+            return pattern;
+        }
+    }
+
+    private Collection<Pattern> patterns = new LinkedList<Pattern>();
+
+    private Collection<Pattern> ignorePatterns = new LinkedList<Pattern>();
+
+    /**
+     * Construct class by providing patterns as strings. Empty strings are ignored.
+     * 
+     * @throws NullPointerException if any of the arguments is null
+     */
+    public ArtifactMatcher( final Collection<String> patterns, final Collection<String> ignorePatterns )
+    {
+        if ( patterns == null )
+        {
+            throw new NullPointerException( "patterns" );
+        }
+        if ( ignorePatterns == null )
+        {
+            throw new NullPointerException( "ignorePatterns" );
+        }
+        for ( String pattern : patterns )
+        {
+            if ( pattern != null && !"".equals( pattern ) )
+            {
+                this.patterns.add( new Pattern( pattern ) );
+            }
+        }
+
+        for ( String ignorePattern : ignorePatterns )
+        {
+            if ( ignorePattern != null && !"".equals( ignorePattern ) )
+            {
+                this.ignorePatterns.add( new Pattern( ignorePattern ) );
+            }
+        }
+    }
+
+    /**
+     * Check if artifact matches patterns.
+     * 
+     * @throws InvalidVersionSpecificationException
+     */
+    public boolean match( Artifact artifact )
+        throws InvalidVersionSpecificationException
+    {
+        for ( Pattern pattern : patterns )
+        {
+            if ( pattern.match( artifact ) )
+            {
+                for ( Pattern ignorePattern : ignorePatterns )
+                {
+                    if ( ignorePattern.match( artifact ) )
+                    {
+                        return false;
+                    }
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+}
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 d74ee7f..2ec4ac2 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
@@ -1,4 +1,5 @@
 package org.apache.maven.plugins.enforcer.utils;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,6 +18,7 @@ package org.apache.maven.plugins.enforcer.utils;
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -27,96 +29,108 @@ import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.shared.dependency.tree.DependencyNode;
 import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
 
-public class DependencyVersionMap implements DependencyNodeVisitor {
-  
-  private boolean demandReleasedVersions = false;
-  
-  private Map<String, List<DependencyNode>> idsToNode;
-  
-  private List<DependencyNode> snapshots;
-  
-  public DependencyVersionMap(Log log){
-    idsToNode = new HashMap<String, List<DependencyNode>>();
-    snapshots = new ArrayList<DependencyNode>();
-  }
+/**
+ * @author Brian Fox
+ *
+ */
+public class DependencyVersionMap
+    implements DependencyNodeVisitor
+{
+    private Log log;
+    
+    private boolean uniqueVersions;
+
+    private Map<String, List<DependencyNode>> idsToNode;
 
-  public DependencyVersionMap(boolean demandReleasedVersions, Log log){
-    this(log);
-    this.demandReleasedVersions = demandReleasedVersions;
-  }
-  
-  public boolean visit(DependencyNode node) {
-    addDependency(node);
-    if (containsConflicts(node)){
-      return false;
+    public DependencyVersionMap( Log log )
+    {
+        this.log = log;
+        idsToNode = new HashMap<String, List<DependencyNode>>();
     }
-    if (demandReleasedVersions){
-      if (node.getArtifact().isSnapshot()){
-        snapshots.add(node);
-        return false;
-      }
+    
+    public void setUniqueVersions( boolean uniqueVersions )
+    {
+        this.uniqueVersions = uniqueVersions;
+    }
+
+    public boolean visit( DependencyNode node )
+    {
+        addDependency( node );
+        return !containsConflicts( node );
+    }
+
+    public boolean endVisit( DependencyNode node )
+    {
+        return true;
     }
-    return true;
-  }
 
-  public boolean endVisit(DependencyNode node) {
-    return true;
-  } 
-  
-  private String constructKey(DependencyNode node){
-    return constructKey(node.getArtifact());
-  }
-  
-  private String constructKey(Artifact artifact){
-    return artifact.getGroupId()+":"+artifact.getArtifactId();
-  }
+    private String constructKey( DependencyNode node )
+    {
+        return constructKey( node.getArtifact() );
+    }
+
+    private String constructKey( Artifact artifact )
+    {
+        return artifact.getGroupId() + ":" + artifact.getArtifactId();
+    }
 
-  public void addDependency(DependencyNode node) {
-    String key = constructKey(node);
-    if (node.getArtifact().isSnapshot()){
-      snapshots.add(node);
+    public void addDependency( DependencyNode node )
+    {
+        String key = constructKey( node );
+        List<DependencyNode> nodes = idsToNode.get( key );
+        if ( nodes == null )
+        {
+            nodes = new ArrayList<DependencyNode>();
+            idsToNode.put( key, nodes );
+        }
+        nodes.add( node );
+    }
+    
+    private String getVersion( Artifact artifact )
+    {
+        return uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
     }
-    List<DependencyNode> nodes = idsToNode.get(key);
-    if (nodes == null){
-      nodes = new ArrayList<DependencyNode>();
-      idsToNode.put(key,nodes);
+
+    private boolean containsConflicts( DependencyNode node )
+    {
+        return containsConflicts( node.getArtifact() );
     }
-    nodes.add(node);
-  }  
-  
-  public List<DependencyNode> getSnapshots(){
-    return snapshots;
-  }
-  
-  private boolean containsConflicts(DependencyNode node){
-    return containsConflicts(node.getArtifact());
-  }
 
-  private boolean containsConflicts(Artifact artifact){
-    return containsConflicts(idsToNode.get(constructKey(artifact)));
-  }
+    private boolean containsConflicts( Artifact artifact )
+    {
+        return containsConflicts( idsToNode.get( constructKey( artifact ) ) );
+    }
 
-  private boolean containsConflicts(List<DependencyNode> nodes){
-    String version = null;
-    for (DependencyNode node : nodes){
-      if (version == null){
-        version = node.getArtifact().getVersion();
-      } else {
-        if (version.compareTo(node.getArtifact().getVersion()) != 0){
-          return true;
+    private boolean containsConflicts( List<DependencyNode> nodes )
+    {
+        String version = null;
+        for ( DependencyNode node : nodes )
+        {
+            if ( version == null )
+            {
+                version = getVersion( node.getArtifact() );
+            }
+            else
+            {
+                if ( version.compareTo( getVersion( node.getArtifact() ) ) != 0 )
+                {
+                    return true;
+                }
+            }
         }
-      }      
+        return false;
     }
-    return false;
-  }
-  
-  public List<List<DependencyNode>> getConflictedVersionNumbers(){
-    List<List<DependencyNode>> output = new ArrayList<List<DependencyNode>>();
-    for (List<DependencyNode> nodes : idsToNode.values()) {
-      if(containsConflicts(nodes)){
-        output.add(nodes);
-      }
+
+    public List<List<DependencyNode>> getConflictedVersionNumbers()
+    {
+        List<List<DependencyNode>> output = new ArrayList<List<DependencyNode>>();
+        for ( List<DependencyNode> nodes : idsToNode.values() )
+        {
+            if ( containsConflicts( nodes ) )
+            {
+                output.add( nodes );
+            }
+        }
+        return output;
     }
-    return output;
-  }
-}
+}
\ No newline at end of file
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DistributionManagementCheck.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DistributionManagementCheck.java
new file mode 100644
index 0000000..e961222
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DistributionManagementCheck.java
@@ -0,0 +1,87 @@
+package org.apache.maven.plugins.enforcer.utils;
+
+/*
+ * 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.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * @author Karl Heinz Marbaise <a href="mailto:khmarbaise at apache.org">khmarbaise at apache.org</a>
+ */
+public class DistributionManagementCheck
+{
+    private DistributionManagement distributionManagement;
+
+    public DistributionManagementCheck( MavenProject project )
+    {
+        this.distributionManagement = project.getOriginalModel().getDistributionManagement();
+    }
+
+    public void execute( boolean isAllowRepository, boolean isAllowSnapshotRepository, boolean isAllowSite )
+        throws EnforcerRuleException
+    {
+        if ( hasDistributionManagement() )
+        {
+            if ( !isAllowRepository && hasRepository() )
+            {
+                throw new EnforcerRuleException( "You have defined a repository in distributionManagement." );
+            }
+            else if ( !isAllowSnapshotRepository && hasSnapshotRepository() )
+            {
+                throw new EnforcerRuleException( "You have defined a snapshotRepository in distributionManagement." );
+            }
+            else if ( !isAllowSite && hasSite() )
+            {
+                throw new EnforcerRuleException( "You have defined a site in distributionManagement." );
+            }
+        }
+    }
+
+    private boolean hasRepository()
+    {
+        return getDistributionManagement().getRepository() != null;
+    }
+
+    public DistributionManagement getDistributionManagement()
+    {
+        return distributionManagement;
+    }
+
+    public void setDistributionManagement( DistributionManagement distributionManagement )
+    {
+        this.distributionManagement = distributionManagement;
+    }
+
+    private boolean hasSnapshotRepository()
+    {
+        return getDistributionManagement().getSnapshotRepository() != null;
+    }
+
+    private boolean hasSite()
+    {
+        return getDistributionManagement().getSite() != null;
+    }
+
+    private boolean hasDistributionManagement()
+    {
+        return getDistributionManagement() != null;
+    }
+}
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 f211843..386b629 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
@@ -34,6 +34,8 @@ import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.project.MavenProject;
@@ -62,7 +64,7 @@ public class EnforcerRuleUtils
     ArtifactRepository local;
 
     /** The remote repositories. */
-    List remoteRepositories;
+    List<ArtifactRepository> remoteRepositories;
 
     /** The log. */
     Log log;
@@ -83,7 +85,7 @@ public class EnforcerRuleUtils
      * @param theLog the the log
      */
     public EnforcerRuleUtils( ArtifactFactory theFactory, ArtifactResolver theResolver, ArtifactRepository theLocal,
-                              List theRemoteRepositories, MavenProject project, Log theLog )
+                              List<ArtifactRepository> theRemoteRepositories, MavenProject project, Log theLog )
     {
         super();
         this.factory = theFactory;
@@ -99,13 +101,14 @@ public class EnforcerRuleUtils
      *
      * @param helper the helper
      */
+    @SuppressWarnings( "unchecked" )
     public EnforcerRuleUtils( EnforcerRuleHelper helper )
     {
 
-    	this.helper = helper;
-    	// get the various expressions out of the
+        this.helper = helper;
+        // get the various expressions out of the
         // helper.
-    	try
+        try
         {
             factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
             resolver = (ArtifactResolver) helper.getComponent( ArtifactResolver.class );
@@ -129,13 +132,11 @@ public class EnforcerRuleUtils
      * Gets the pom model for this file.
      *
      * @param pom the pom
-     *
      * @return the model
-     *
      * @throws IOException Signals that an I/O exception has occurred.
      * @throws XmlPullParserException the xml pull parser exception
      */
-    private Model readModel ( File pom )
+    private Model readModel( File pom )
         throws IOException, XmlPullParserException
     {
         Reader reader = ReaderFactory.newXmlReader( pom );
@@ -154,23 +155,20 @@ public class EnforcerRuleUtils
     }
 
     /**
-     * This method gets the model for the defined artifact.
-     * Looks first in the filesystem, then tries to get it
-     * from the repo.
+     * This method gets the model for the defined artifact. Looks first in the filesystem, then tries to get it from the
+     * repo.
      *
      * @param groupId the group id
      * @param artifactId the artifact id
      * @param version the version
      * @param pom the pom
-     *
      * @return the pom model
-     *
      * @throws ArtifactResolutionException the artifact resolution exception
      * @throws ArtifactNotFoundException the artifact not found exception
      * @throws XmlPullParserException the xml pull parser exception
      * @throws IOException Signals that an I/O exception has occurred.
      */
-    private Model getPomModel ( String groupId, String artifactId, String version, File pom )
+    private Model getPomModel( String groupId, String artifactId, String version, File pom )
         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, XmlPullParserException
     {
         Model model = null;
@@ -216,25 +214,22 @@ public class EnforcerRuleUtils
     }
 
     /**
-     * This method loops through all the parents, getting
-     * each pom model and then its parent.
+     * This method loops through all the parents, getting each pom model and then its parent.
      *
      * @param groupId the group id
      * @param artifactId the artifact id
      * @param version the version
      * @param pom the pom
-     *
      * @return the models recursively
-     *
      * @throws ArtifactResolutionException the artifact resolution exception
      * @throws ArtifactNotFoundException the artifact not found exception
      * @throws IOException Signals that an I/O exception has occurred.
      * @throws XmlPullParserException the xml pull parser exception
      */
-    public List getModelsRecursively ( String groupId, String artifactId, String version, File pom )
+    public List<Model> getModelsRecursively( String groupId, String artifactId, String version, File pom )
         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, XmlPullParserException
     {
-        List models = null;
+        List<Model> models = null;
         Model model = getPomModel( groupId, artifactId, version, pom );
 
         Parent parent = model.getParent();
@@ -257,12 +252,15 @@ public class EnforcerRuleUtils
                 parentPom = new File( parentPom, "pom.xml" );
             }
 
-            models = getModelsRecursively( parent.getGroupId(), parent.getArtifactId(), parent.getVersion(), parentPom );
+            //@formatter:off
+            models = getModelsRecursively( parent.getGroupId(), parent.getArtifactId(), 
+                                           parent.getVersion(), parentPom );
+            //@formatter:on
         }
         else
         {
             // only create it here since I'm not at the top
-            models = new ArrayList();
+            models = new ArrayList<Model>();
         }
         models.add( model );
 
@@ -276,13 +274,13 @@ public class EnforcerRuleUtils
      * @param artifactId the artifact id
      * @param version the version
      * @param model Model being checked.
-     *
      * @return true, if check if model matches
      */
-    protected boolean checkIfModelMatches ( String groupId, String artifactId, String version, Model model )
+    protected boolean checkIfModelMatches( String groupId, String artifactId, String version, Model model )
     {
         // try these first.
         String modelGroup = model.getGroupId();
+        String modelArtifactId = model.getArtifactId();
         String modelVersion = model.getVersion();
 
         try
@@ -293,7 +291,7 @@ public class EnforcerRuleUtils
             }
             else
             {
-            	//MENFORCER-30, handle cases where the value is a property like ${project.parent.groupId}
+                // MENFORCER-30, handle cases where the value is a property like ${project.parent.groupId}
                 modelGroup = (String) helper.evaluate( modelGroup );
             }
 
@@ -303,9 +301,12 @@ public class EnforcerRuleUtils
             }
             else
             {
-            	//MENFORCER-30, handle cases where the value is a property like ${project.parent.version}
+                // MENFORCER-30, handle cases where the value is a property like ${project.parent.version}
                 modelVersion = (String) helper.evaluate( modelVersion );
             }
+
+            // Is this only required for Maven2?
+            modelArtifactId = (String) helper.evaluate( modelArtifactId );
         }
         catch ( NullPointerException e )
         {
@@ -319,7 +320,56 @@ public class EnforcerRuleUtils
         {
             // as above
         }
-        return ( StringUtils.equals( groupId, modelGroup ) && StringUtils.equals( version, modelVersion ) && StringUtils
-            .equals( artifactId, model.getArtifactId() ) );
+        // CHECKSTYLE_OFF: LineLength
+        return ( StringUtils.equals( groupId, modelGroup ) && StringUtils.equals( version, modelVersion ) && StringUtils.equals( artifactId,
+                                                                                                                                 modelArtifactId ) );
+        // CHECKSTYLE_ON: LineLength
+    }
+
+    private void resolve( Plugin plugin )
+    {
+        try
+        {
+            plugin.setGroupId( (String) helper.evaluate( plugin.getGroupId() ) );
+            plugin.setArtifactId( (String) helper.evaluate( plugin.getArtifactId() ) );
+            plugin.setVersion( (String) helper.evaluate( plugin.getVersion() ) );
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            // this should have gone already before
+        }
+    }
+
+    private void resolve( ReportPlugin plugin )
+    {
+        try
+        {
+            plugin.setGroupId( (String) helper.evaluate( plugin.getGroupId() ) );
+            plugin.setArtifactId( (String) helper.evaluate( plugin.getArtifactId() ) );
+            plugin.setVersion( (String) helper.evaluate( plugin.getVersion() ) );
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            // this should have gone already before
+        }
     }
+
+    public List<Plugin> resolvePlugins( List<Plugin> plugins )
+    {
+        for ( Plugin plugin : plugins )
+        {
+            resolve( plugin );
+        }
+        return plugins;
+    }
+
+    public List<ReportPlugin> resolveReportPlugins( List<ReportPlugin> reportPlugins )
+    {
+        for ( ReportPlugin plugin : reportPlugins )
+        {
+            resolve( plugin );
+        }
+        return reportPlugins;
+    }
+
 }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java
index 4209d0f..4d36639 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java
@@ -20,12 +20,15 @@ package org.apache.maven.plugins.enforcer.utils;
  */
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.ReportPlugin;
 
+/**
+ * @author Brian Fox
+ *
+ */
 public class PluginWrapper
 {
     private String groupId;
@@ -36,17 +39,15 @@ public class PluginWrapper
 
     private String source;
 
-    public static List addAll( List plugins, String source )
+    public static List<PluginWrapper> addAll( List<?> plugins, String source )
     {
-        List results = null;
+        List<PluginWrapper> results = null;
 
         if ( !plugins.isEmpty() )
         {
-            results = new ArrayList( plugins.size() );
-            Iterator iter = plugins.iterator();
-            while ( iter.hasNext() )
+            results = new ArrayList<PluginWrapper>( plugins.size() );
+            for ( Object o : plugins )
             {
-                Object o = iter.next();
                 if ( o instanceof Plugin )
                 {
                     results.add( new PluginWrapper( (Plugin) o, source ) );
@@ -119,7 +120,4 @@ public class PluginWrapper
     {
         this.source = source;
     }
-
-
-
 }
diff --git a/enforcer-rules/src/site/apt/Images.odp b/enforcer-rules/src/site/apt/Images.odp
new file mode 100644
index 0000000..02653cd
Binary files /dev/null and b/enforcer-rules/src/site/apt/Images.odp differ
diff --git a/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm b/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm
new file mode 100644
index 0000000..6012d78
--- /dev/null
+++ b/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm
@@ -0,0 +1,174 @@
+~~ 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.    
+ 
+  ------
+  Ban DistributionManagement
+  ------
+  Karl-Heinz Marbaise
+  ------
+  June 2014
+  ------
+
+Ban Distribution Management
+
+  This rule can be used to force the absence of distributionManagement
+  in your pom files.
+
+  The following parameters are supported by this rule:
+  
+  * message - an optional message to the user if the rule fails.
+   
+  * allowRepository - You can allow repository entry (default: false).
+
+  * allowSnapshotRepository - you can allow snapshotRepository entry (default: false).
+
+  * allowSite - You can allow site entry (default: false).
+  
+  * ignoreParent - You can control if the parent will be checked or not (default: true) (deprecated don't use it anymore).
+   
+  []
+
+   
+  Sample Plugin Configuration:
+  
++------+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>no-distribution-management-at-all</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <banDistributionManagement/>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++-------+
+
+* Best Practice
+
+ Usually you should define the <<distributionManagement>> only in a limited number of cases.
+ If you are in a corporate environment it makes usually only sense to define the <<distributionManagement>>
+ in the corporate pom and forbid the usage in any other pom's. Sometimes it makes sense to
+ allow for example the site repository definition in your other pom's which can be defined by using the
+ <<banDistributionManagement>> rule. For this use case the following has to be defined in your 
+ corporate pom file:
+ 
+ 
++------+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>no-distribution-management-at-all</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <banDistributionManagement>
+                  <allowSite>true</allowSite>
+                </banDistributionManagement>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++------+
+ 
+
+* The Project Types
+
+ If we take a closer look to the possible project structures you will find the following cases where
+ the green arrow will show our current position.
+
+ * The Project without Parent.
+
+  We have no parent and no modules at all. This could be the situation where we are creating
+  a corporate pom file or another simple Maven project. So the definition of maven-enforcer-plugin
+  is within this pom file.
+  
+[images/root.png] Root Project.
+
+  In consequence it does not really make sense to check if the pom contains distributionManagement
+  entries or not.
+
+ * Project with Parent.
+
+ We have a project with a parent. The parent is likely a kind of a corporate pom file which
+ contains the definition of maven-enforcer-plugin. So in this case it makes sense to check
+ if distributionManagement entries are made or not. 
+ 
+ <<Note>>: At the moment it is not possible to 
+ check if the parent does not contain the definition of maven-enforcer-plugin which would change
+ the situation.
+
+[images/root-with-parent.png] Root project.
+
+
+ * Project with Parent and Modules.
+ 
+  This situation is more or less the same as the one before. So banDistributionManagement rule will check
+  the distributionManagement entries.
+  
+[images/root-with-parent-and-modules.png] Root project with parent and modules.
+
+
+ * Root Project With Modules.
+
+  If we don't have a parent this means the definition of maven-enforcer-plugin
+  is likely done in the current pom file which means it does not make really sense
+  to check the distributionManagement.
+  
+[images/root-with-modules.png] Root with Modules.
+
+
+ * Module of a Multi Module Build
+
+  In this case we have the scenario that the module m1 has a parent <<p1>> which could contain
+  the definition of the maven-enforcer-plugin or the <<parent>> of which in consequence means to check the
+  distributionManagement entries.
+
+[images/module.png] Root with Modules.
+
+
+ []
diff --git a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm b/enforcer-rules/src/site/apt/banDuplicatePomDependencyVersions.apt.vm
similarity index 65%
copy from enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
copy to enforcer-rules/src/site/apt/banDuplicatePomDependencyVersions.apt.vm
index 810b7e8..0ae6ba1 100644
--- a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
+++ b/enforcer-rules/src/site/apt/banDuplicatePomDependencyVersions.apt.vm
@@ -16,28 +16,28 @@
 ~~ under the License.    
  
   ------
-  Require Maven Version
+  Ban Duplicate Pom Dependency Versions
   ------
-  Brian Fox
+  Guillaume Boue
   ------
-  June 2007
+  November 2016
   ------
 
-Require Maven Version
+Ban Duplicate Pom Dependency Versions
 
-   This rule enforces certain Maven versions. The rule uses the {{{./versionRanges.html}Enforcer version range syntax}} to define allowed versions.
+  This rule checks that there are no duplicate dependencies declared in the POM of the project.
+  Duplicate dependencies are dependencies which have the same group id, artifact id, type and classifier.
 
-   The following parameters are supported by this rule:
-   
-   * message - an optional message to the user if the rule fails.
-   
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed Maven versions.
+  The following parameters are supported by this rule:
    
+  * message - an optional supplemental message to the user if the rule fails.
+
    []
 
-   Sample Plugin Configuration:
    
-+---+
+  Sample Plugin Configuration:
+  
++------+
 <project>
   [...]
   <build>
@@ -48,16 +48,14 @@ Require Maven Version
         <version>${project.version}</version>
         <executions>
           <execution>
-            <id>enforce-maven</id>
+            <id>no-duplicate-declared-dependencies</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
-                <requireMavenVersion>
-                  <version>2.0.6</version>
-                </requireMavenVersion>
-              </rules>    
+                <banDuplicatePomDependencyVersions/>
+              </rules>
             </configuration>
           </execution>
         </executions>
@@ -66,4 +64,4 @@ Require Maven Version
   </build>
   [...]
 </project>
-+---+  
\ No newline at end of file
++-------+
diff --git a/enforcer-rules/src/site/apt/bannedDependencies.apt.vm b/enforcer-rules/src/site/apt/banTransitiveDependencies.apt.vm
similarity index 52%
copy from enforcer-rules/src/site/apt/bannedDependencies.apt.vm
copy to enforcer-rules/src/site/apt/banTransitiveDependencies.apt.vm
index 8afcac3..95265ca 100644
--- a/enforcer-rules/src/site/apt/bannedDependencies.apt.vm
+++ b/enforcer-rules/src/site/apt/banTransitiveDependencies.apt.vm
@@ -16,42 +16,30 @@
 ~~ under the License.    
  
   ------
-  Banned Dependencies
+  Ban Transitive Dependencies
   ------
-  Brian Fox
   ------
-  November 2007
+  August 2012
   ------
 
-Banned Dependencies
+Ban Transitive Dependencies
 
-  This rule checks the dependencies and fails if any of the matching excludes are found.
+  This rule bans all transitive dependencies.
 
 
    The following parameters are supported by this rule:
    
-   * searchTransitive - if transitive dependencies should be checked.
-   
-   * excludes - a list of artifacts to ban. The format is groupId[:artifactId][:version][:type][:scope] where artifactId, version, type, and scope are optional. Wildcards may be used to replace an entire section.
-      Examples:
-       
-        * org.apache.maven
-        
-        * org.apache.maven:badArtifact
-        
-        * org.apache.maven:artifact:badVersion
-        
-        * org.apache.maven:*:1.2
-        
-        * org.apache.maven:*:*:jar:test
-        
-        []
+   * excludes - specify the dependencies that will be ignored.\
+      This can be a list of artifacts in the format
+      groupId[:artifactId[:version[:type[:scope[:classifier]]]]] .
+      Wildcard '*' can be used to in place of specific section (e.g. group:*:1.0 will match both 'group:artifact:1.0' and 'group:anotherArtifact:1.0')
+      Version is a string representing standard maven version range. Empty patterns will be ignored. 
 
-   * includes - a list of artifacts to include. These are exceptions to the excludes. It is meant to allow wide exclusion rules with wildcards and fine tune using includes. If nothing has been excluded, then the includes have no effect. In otherwords, includes only subtract from artifacts that matched an exclude rule.
-   
-   For example, to ban all xerces except xerces-api you would exclude "xerces" (groupId) and include "xerces:xerces-api"   
-   
-   * message - an optional message to the user if the rule fails.
+   * includes - specify the dependencies that will be checked.\
+     These are exceptions to excludes intended for more convenient configuration. This can be a list of artifacts in the format
+     groupId[:artifactId[:version[:type[:scope[:classifier]]]]] as above.
+ 
+   * message - an optional message to the user if the rule fails. Will replace generated report message.
    
    []
 
@@ -75,19 +63,21 @@ Banned Dependencies
             </goals>
             <configuration>
               <rules>
-                <bannedDependencies>
+                <banTransitiveDependencies>
                   <excludes>
-                    <exclude>org.apache.maven</exclude>
-                    <exclude>org.apache.maven:badArtifact</exclude>
-                    <exclude>*:badArtifact</exclude>
+                    <!-- the rule will not fail even if it detects ignoredArtifact
+                         of group org.apache.maven, because it is excluded -->
+                    <exclude>org.apache.maven:ignoredArtifact</exclude>
+                    <exclude>*:anotherIgnoredArtifact</exclude>
                   </excludes>
                   <includes>
-                    <!--only 1.0 of badArtifact is allowed-->
-                    <include>org.apache.maven:badArtifact:1.0</include>
+                    <!-- override "org.apache.maven:ignoredArtifact" to fail
+                         if exactly 1.0 version of ignoreArtifact is detected
+                         to be transitive dependency of the project -->
+                    <include>org.apache.maven:ignoredArtifact:[1.0]</include>
                   </includes>
-                </bannedDependencies>
+                </banTransitiveDependencies>
               </rules>
-              <fail>true</fail>
             </configuration>
           </execution>
         </executions>
diff --git a/enforcer-rules/src/site/apt/bannedDependencies.apt.vm b/enforcer-rules/src/site/apt/bannedDependencies.apt.vm
index 8afcac3..c732569 100644
--- a/enforcer-rules/src/site/apt/bannedDependencies.apt.vm
+++ b/enforcer-rules/src/site/apt/bannedDependencies.apt.vm
@@ -30,9 +30,9 @@ Banned Dependencies
 
    The following parameters are supported by this rule:
    
-   * searchTransitive - if transitive dependencies should be checked.
+   * searchTransitive - if transitive dependencies should be checked. Default is true.
    
-   * excludes - a list of artifacts to ban. The format is groupId[:artifactId][:version][:type][:scope] where artifactId, version, type, and scope are optional. Wildcards may be used to replace an entire section.
+   * excludes - a list of artifacts to ban. The format is groupId[:artifactId][:version][:type][:scope][:classifier] where artifactId, version, type, scope and classifier are optional. Wildcards may be used to replace an entire or just parts of a section.
       Examples:
        
         * org.apache.maven
@@ -41,10 +41,16 @@ Banned Dependencies
         
         * org.apache.maven:artifact:badVersion
         
-        * org.apache.maven:*:1.2
+        * org.apache.maven:*:1.2 (exclude version 1.2 and above, equivalent to [1.2,) )
+
+        * org.apache.maven:*:[1.2] (explicit exclude of version 1.2)
         
         * org.apache.maven:*:*:jar:test
         
+        * *:*:*:jar:compile:tests
+
+        * org.apache.*:maven-*:*
+        
         []
 
    * includes - a list of artifacts to include. These are exceptions to the excludes. It is meant to allow wide exclusion rules with wildcards and fine tune using includes. If nothing has been excluded, then the includes have no effect. In otherwords, includes only subtract from artifacts that matched an exclude rule.
@@ -96,4 +102,41 @@ Banned Dependencies
   </build>
   [...]
 </project>
-+---+
\ No newline at end of file
++---+
+
+  Example plugin configuration which ignores transitive dependencies:
+
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-banned-dependencies</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <bannedDependencies>
+                  <excludes>
+                    <exclude>commons-lang:commons-lang</exclude>
+                  </excludes>
+                  <searchTransitive>false</searchTransitive>
+                </bannedDependencies>
+              </rules>
+              <fail>true</fail>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
diff --git a/enforcer-rules/src/site/apt/requireProperty.apt.vm b/enforcer-rules/src/site/apt/bannedPlugins.apt.vm
similarity index 57%
copy from enforcer-rules/src/site/apt/requireProperty.apt.vm
copy to enforcer-rules/src/site/apt/bannedPlugins.apt.vm
index ff1146e..8c91ca6 100644
--- a/enforcer-rules/src/site/apt/requireProperty.apt.vm
+++ b/enforcer-rules/src/site/apt/bannedPlugins.apt.vm
@@ -16,30 +16,40 @@
 ~~ under the License.    
  
   ------
-  Require Property
+  Banned Plugins
   ------
-  Brian Fox
+  Paul Gier
   ------
-  June 2007
+  November 2012
   ------
 
-Require Property
-
-  This rule can enforce that a declared property is set and optionally evaluate it against a regular expression.
+Banned Plugins
 
+   This rule checks the set of plugins used during the build and enforces that specific excluded plugins are not used.
 
    The following parameters are supported by this rule:
    
-   * property - the property to evaluate.
-   
-   * message - an optional message to the user if the rule fails. Default is: "Property 'xxx' is required for this build".	
-   
-   * regex - a regular expression used to check the value of the property.
-   
-   * regexMessage - an optional message to the user if the regex check fails.
+   * excludes - a list of plugin artifacts to ban. The format is groupId[:artifactId][:version] where artifactId and version are optional. Wildcards may be used to replace an entire section.
+      Examples:
+       
+        * org.apache.maven
+        
+        * org.apache.maven:bad-plugin
+        
+        * org.apache.maven:my-plugin:badVersion
+        
+        * org.apache.maven:*:1.2
+                
+        []
+
+   * includes - a list of plugin artifacts to include. These are exceptions to the excludes. It is meant to allow wide exclusion rules with wildcards and fine tune using includes. 
+     If nothing has been excluded, then the includes have no effect. In otherwords, includes only subtract from artifacts that matched an exclude rule.
+      
+   * message - an optional message to the user if the rule fails.
    
    []
 
+   
   Sample Plugin Configuration:
   
 +---+
@@ -53,24 +63,17 @@ Require Property
         <version>${project.version}</version>
         <executions>
           <execution>
-            <id>enforce-property</id>
+            <id>enforce-banned-dependencies</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
-                <requireProperty>
-                  <property>basedir</property>
-                  <message>You must have a basedir!</message>
-                  <regex>\d</regex>
-                  <regexMessage>You must have a digit in your baseDir!</regexMessage>
-                </requireProperty>
-                <requireProperty>
-                  <property>project.version</property>
-                  <message>"Project version must be specified."</message>
-                  <regex>(\d|-SNAPSHOT)$</regex>
-                  <regexMessage>"Project version must end in a number or -SNAPSHOT."</regexMessage>
-                </requireProperty>
+                <bannedPlugins>
+                  <excludes>
+                    <exclude>org.codehaus.mojo:build-helper-maven-plugin</exclude>
+                  </excludes>
+                </bannedPlugins>
               </rules>
               <fail>true</fail>
             </configuration>
@@ -82,4 +85,3 @@ Require Property
   [...]
 </project>
 +---+
-  
diff --git a/enforcer-rules/src/site/apt/bannedRepositories.apt.vm b/enforcer-rules/src/site/apt/bannedRepositories.apt.vm
new file mode 100644
index 0000000..88f717a
--- /dev/null
+++ b/enforcer-rules/src/site/apt/bannedRepositories.apt.vm
@@ -0,0 +1,119 @@
+~~ 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.
+
+  ------
+  Banned Specified Repositories
+  ------
+  Simon Wang
+  ------
+  June 2014
+  ------
+
+Banned Specified Repositories
+
+   This rule checks whether this maven session (defined in pom files or even settings.xml) include specified banned repository.
+
+* What's difference from "requireNoRepositories"?
+
+   The purpose for "requireNoRepositories" is: Detect whether pom and pom’s parents contains repositories definition. That guide users to use correct convention (not define repositories in pom files). So it only analyze current pom and its parent pom files.
+
+   But “BannedRepositories” is different purpose, it’s just like “BannedDependencies”. It will detect banned repositories from maven session context instead of only pom.xml and parents. It's trying to avoid misuse incorrect repositories. It will detect banned repositories from current maven session context.
+
+* Support Parameters
+
+   * banRepositories - Specify banned non-plugin repositories. This is a black list of http/https url patterns.
+
+   * banPluginRepositories - Specify banned plugin repositories. This is a black list of http/https url patterns.
+
+   * allowedRepositories - Specify explicitly allowed non-plugin repositories. This is a white list of http/https url patterns.
+
+   * allowedPluginRepositories - Specify explicitly allowed plugin repositories. This is a white list of http/https url patternes.
+
+* Sample Configuration
+
+   For example, one company want to limit repositories usage. But different developers might use different settings.xml.
+   Even their projects' pom defined different repostories too.
+   For this case, could leverage this enforcer rule to banned specified repositories or even use allowedRepositories/allowedPluginRepositories to banned others unexpected repositories.
+   
+   Ex. http://repo1/xyz is the repository that want to be banned.
+       http://repo2/xyz is the repository that want to use now.
+   
+   Sample Plugin Configuration:
+
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-banned-repositories</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <bannedRepositories>
+                  <bannedRepositories>
+                    <bannedRepository>http://repo1/*<bannedRepository>
+                  </bannedRepositories>
+                  <bannedPluginRepositories>
+                    <bannedPluginRepository>http://repo1/*<bannedPluginRepository>
+                  </bannedPluginRepositories>
+				  
+                  <!-- for some cases, white list is more effective -->
+                  <!--
+				  
+                  <allowedRepositories>
+                    <allowedRepository>http://repo2/*<allowedRepository>
+                  </allowedRepositories>
+                  <allowedPluginRepositories>
+                    <allowedPluginRepository>http://repo2/*<allowedPluginRepository>
+                  </allowedPluginRepositories>
+				  
+                  -->
+                </bannedRepositories>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
+
+* Worth to Note
+
+   * http/https url patterns support wildcard "*"
+   
+   * This rule will detect banned repositories on maven session itself istead of pom or settings, so if users defined "mirrorOf" in settings.xml, even defined banned repositories in pom.xml, it won't be detected.
+
++---+
+	<mirrors>
+	 <mirror>
+	   <id>nexus</id>
+	   <mirrorOf>*</mirrorOf>
+	   <url>http://.../nexus/..</url>
+	 </mirror>
+	</mirrors>
++---+ 
diff --git a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
index 6c8691a..890814a 100644
--- a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+++ b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
@@ -22,13 +22,15 @@
  2008-09-13
  -----
 
+Dependency Convergence
+
   This rule requires that dependency version numbers converge.  If a project has two dependencies, A and B, both depending on the same artifact, C, this rule will fail the build if A depends on a different version of C then the version of C depended on by B.
 
   Here is a concrete example.
 
   This will cause a build to fail.
   
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
 
   <dependencies>
     <dependency>
@@ -42,11 +44,11 @@
       <version>1.6.0</version>
     </dependency>
   </dependencies>  
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
 
   With this being logged during compilation
 
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
 Dependency convergence error for org.slf4j:slf4j-api1.6.1 paths to dependency are:
 
 [ERROR]
@@ -58,13 +60,11 @@ and
 +-org.myorg:my-project:1.0.0-SNAPSHOT
   +-org.slf4j:slf4j-nop:1.6.0
     +-org.slf4j:slf4j-api:1.6.0
-
-
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
 
   And this will succeed.
   
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-jdk14</artifactId>
@@ -81,12 +81,12 @@ and
         </exclusion>
       </exclusions>
     </dependency>
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
 
 
   Here is how a project should be setup to use this rule
 
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
 <project>
   ...
   <build>
@@ -101,7 +101,7 @@ and
             <id>enforce</id>
             <configuration>
               <rules>
-                <DependencyConvergence/>
+                <dependencyConvergence/>
               </rules>
             </configuration>
             <goals>
@@ -115,4 +115,16 @@ and
   </build>
   ...
 </project>
------------------------------------------------------------------------------------
++-----------------------------------------------------------------------------------
+
+* Timestamped version
+	
+	By default the non-unique versions are matched, which means the <<<X.Y-SNAPSHOT>>> instead of the timestamped versions.
+	If you want to use the unique versions of the dependencies, you can set its property to <<<true>>>.
+
++---------------------------------------------
+      <dependencyConvergence>
+        <uniqueVersions>true</uniqueVersions> 
+      </dependencyConvergence>
++---------------------------------------------
+
diff --git a/enforcer-rules/src/site/apt/index.apt b/enforcer-rules/src/site/apt/index.apt
index 9f624ad..024f852 100644
--- a/enforcer-rules/src/site/apt/index.apt
+++ b/enforcer-rules/src/site/apt/index.apt
@@ -16,48 +16,74 @@
 ~~ under the License.    
  
   ------
-  Standard Rules
+  Built-In Rules
   ------
   Brian Fox
   ------
-  August 2008
+  2015-01-27
   ------
 
-Standard Rules
+Built-In Rules
 
-  The following standard rules ship along with the enforcer plugin:
+  The following built-in rules ship along with the enforcer plugin:
+
+  * {{{./alwaysFail.html}alwaysFail}} - Always fail... used to test plugin configuration.
 
   * {{{./alwaysPass.html}alwaysPass}} - Always passes... used to test plugin configuration.
   
-  * {{{./alwaysFail.html}alwaysFail}} - Always fail... used to test plugin configuration.
- 
+  * {{{./banDistributionManagement.html}banDistributionManagement}} - enforces that project doesn't have distributionManagement.
+  
+  * {{{./banDuplicatePomDependencyVersions.html}banDuplicatePomDependencyVersions}} - enforces that the project doesn't have duplicate declared dependencies.
+  
   * {{{./bannedDependencies.html}bannedDependencies}} - enforces that excluded dependencies aren't included.
-
-  * bannedPlugins - enforces that excluded plugins aren't included.
   
+  * {{{./bannedPlugins.html}bannedPlugins}} - enforces that specific plugins aren't included in the build.
+  
+  * {{{./bannedRepositories.html}bannedRepositories}} - enforces to not include banned repositories.
+
+  * {{{./banTransitiveDependencies.html}banTransitiveDependencies}} - enforces that project doesn't have transitive dependencies.
+
   * {{{./dependencyConvergence.html}dependencyConvergence}} - ensure all dependencies converge to the same version.
 
   * {{{./evaluateBeanshell.html}evaluateBeanshell}} - evaluates a beanshell script.
 
-  * {{{./requireReleaseDeps.html}requireReleaseDeps}} - enforces that no snapshots are included as dependencies.
+  * {{{./reactorModuleConvergence.html}reactorModuleConvergence}} - enforces that a multi module build follows best practice.
 
-  * {{{./requireReleaseVersion.html}requireReleaseVersion}} - enforces that the artifact is not a snapshot.
+  * {{{./requireActiveProfile.html}requireActiveProfile}} - enforces one or more active profiles.
+  
+  * {{{./requireEnvironmentVariable.html}requireEnvironmentVariable}} - enforces the existence of an environment variable
+  
+  * {{{./requireFileChecksum.html}requireFileChecksum}} - enforces that the specified file has a certain checksum.
+  
+  * {{{./requireFilesDontExist.html}requireFilesDontExist}} - enforces that the list of files does not exist.
+  
+  * {{{./requireFilesExist.html}requireFilesExist}} - enforces that the list of files does exist.
 
-  * {{{./requireMavenVersion.html}requireMavenVersion}} - enforces the Maven version.
+  * {{{./requireFilesSize.html}requireFilesSize}} - enforces that the list of files exists and is within a certain size range.
 
   * {{{./requireJavaVersion.html}requireJavaVersion}} - enforces the JDK version.
 
-  * {{{./requireOS.html}requireOS}} - enforces the OS / CPU Archictecture.
+  * {{{./requireMavenVersion.html}requireMavenVersion}} - enforces the Maven version.
+
+  * {{{./requireNoRepositories.html}requireNoRepositories}} - enforces to not include repositories.
+
+  * {{{./requireOS.html}requireOS}} - enforces the OS / CPU Architecture.
 
   * {{{./requirePluginVersions.html}requirePluginVersions}} - enforces that all plugins have a specified version.
 
+  * {{{./requirePrerequisite.html}requirePrerequisite}} - enforces that prerequisites have been specified.
+   
   * {{{./requireProperty.html}requireProperty}} - enforces the existence and values of properties.
    
-  * {{{./requireFilesDontExist.html}requireFilesDontExist}} - enforces that the list of files do not exist.
-  
-  * {{{./requireFilesExist.html}requireFilesExist}} - enforces that the list of files do exist.
+  * {{{./requireReleaseDeps.html}requireReleaseDeps}} - enforces that no snapshots are included as dependencies.
+
+  * {{{./requireReleaseVersion.html}requireReleaseVersion}} - enforces that the artifact is not a snapshot.
+
+  * {{{./requireSnapshotVersion.html}requireSnapshotVersion}} - enforces that the artifact is not a release.
+
+  * {{{./requireSameVersions.html}requireSameVersions}} - enforces that specific dependencies and/or plugins have the same version.
 
-  * {{{./requireFilesSize.html}requireFilesSize}} - enforces that the list of files exist and are within a certain size range.
+  * {{{./requireUpperBoundDeps.html}requireUpperBoundDeps}} - ensures that every (transitive) dependency is resolved to its specified version or higher.
 
   []
 
diff --git a/enforcer-rules/src/site/apt/reactorModuleConvergence.apt.vm b/enforcer-rules/src/site/apt/reactorModuleConvergence.apt.vm
new file mode 100644
index 0000000..9318667
--- /dev/null
+++ b/enforcer-rules/src/site/apt/reactorModuleConvergence.apt.vm
@@ -0,0 +1,257 @@
+~~ 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.    
+ 
+  ------
+  Reactor Module Convergence
+  ------
+  Karl-Heinz Marbaise
+  ------
+  March 2014
+  ------
+
+Reactor Module Convergence
+
+  This rule checks that the versions within the reactor are consistent furthermore
+  it will check that every module within the project contains a parent and that the 
+  parent is part of the reactor build. Furthermore it will be checked if dependencies
+  are intermodule dependencies that they using the same version as given by the reactor. 
+
+  The following parameters are supported by this rule:
+   
+  * message - an optional supplemental message to the user if the rule fails.
+  
+  * ignoreModuleDependencies - Ignore module dependencies which references modules within the 
+    the reactor (default: false). 
+
+  Note: The current state does not correctly handle a situation like this {{mvn -pl subproject validate}}.
+        This will be handled correctly with the next major release (2.X) of enforcer.
+
+   []
+
+
+  Sample Plugin Configuration:
+  
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-no-snapshots</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <reactorModuleConvergence>
+                  <message>The reactor is not valid</message>
+                  <ignoreModuleDependencies>true</ignoreModuleDependencies>
+                </reactorModuleConvergence>
+              </rules>
+              <fail>true</fail>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
+
+  There are different situations within a multi module build which can lead to problems
+  (for example not working with maven-release-plugin etc.).
+  This rule is intended to prevent such problems.
+  
+  Let us assume we have the following (simple) project structure for a multi module setup.
+
++-----
+   root (pom.xml)
+     +--- module1 (pom.xml)
+     +--- module2 (pom.xml)
++-----
+
+  The root <<pom.xml>> looks like this:
+  
++-----
+  <groupId>com.mycompany.project</groupId>
+  <artifactId>parent</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  (..)
++-----
+
+  The best practice in Maven is that all childs inherit the version from their parent 
+  and don't define a new version which looks like this:
+  
++-----
+  <parent>
+    <groupId>...</groupId>
+    <artifactId>...</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>module1</artifactId>
+  (..)
++-----  
+
+  But sometimes people mistaken things or violate the best-practice which  
+  looks like this:
+
++-----
+  <parent>
+    <groupId>...</groupId>
+    <artifactId>...</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  
+  <artifactId>module1</artifactId>
+  <version>1.1-SNAPSHOT</version>
++-----
+
+  By using this rule you would get a message during the build 
+  with the following resulting output:
+
++-----
+[WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message:
+The reactor contains different versions.
+ --> com.mycompany.project:myproject:pom:1.1-SNAPSHOT
++-----
+
+  The next which happens is that the parent in a reactor is sometimes 
+  the wrong one like the following situation:
+  
++-----
+  <parent>
+    <groupId>...</groupId>
+    <artifactId>...</artifactId>
+    <version>1.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>module1</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  (..)
++-----  
+
+  This will prompted by the following message:
+  
++-----
+[WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message:
+Reactor modules have parents which contain a wrong version.
+ --> com.mycompany.project:myproject:pom:1.1-SNAPSHOT parent:com.mycompany.project:myproject:pom:1.0-SNAPSHOT
++-----
+
+  If you have only changed a parent by accident with the wrong version 
+  like this:
+  
++-----
+  <parent>
+    <groupId>...</groupId>
+    <artifactId>...</artifactId>
+    <version>1.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>module1</artifactId>
+  (..)
++-----  
+  
+  you will get the same message as above:
+  
++-----
+[WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message:
+The reactor contains different versions.
+ --> com.mycompany.project:myproject:pom:1.1-SNAPSHOT
++-----
+
+  An other things which happens that simply the parent will be forgotten which
+  produces a message like this:
+
++----
+[WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message:
+Reactor contains modules without parents.
+ module: com.mycompany.project:myproject:pom:1.2-SNAPSHOT
++----
+
+  In larger mutli-module builds it happens also that the defined parent is given
+  but does not belong to the reactor like this:
+  
++-----
+  <parent>
+    <groupId>org.apache.enforcer</groupId>
+    <artifactId>something-different</artifactId>
+    <version>1.1</version>
+  </parent>
+
+  <artifactId>module1</artifactId>
+  (..)
++-----  
+  
+  Usually already the Maven warning like this should be paid attention to:
+  
++-----
+[WARNING] 
+[WARNING] Some problems were encountered while building the effective model for org.apache.enforcer:pom:1.0.4-SNAPSHOT
+[WARNING] 'parent.relativePath' points at org.apache.enforcer:something-different instead of org.apache.enforcer:something-different, please verify your project structure @ line 7, column 11
+[WARNING] 
++-----
+
+  but this will oversight often. So the enforcer rule will break simply
+  such mail formed build via the message (This required that the parent
+  has the same version as the rest of the build which happens):
+   
++-----
+[WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message:
+Module parents have been found which could not be found in the reactor.
+ module: org.apache.enforcer:something-different:pom:1.0.4-SNAPSHOT
++-----
+
+
+  An other case which happens (for example by merging from a branch into trunk/master)
+  is that an intermodule dependency contains the wrong version like this:
+
++-----
+  <parent>
+    <groupId>...</groupId>
+    <artifactId>...</artifactId>
+    <version>1.2-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>module1</artifactId>
+  
+  <dependencies>
+    <dependency>
+      <groupId>com.mycompany.project</groupId>
+      <artifactId>myproject</artifactId>
+      <version>1.1</version>
+    </dependency>
+  (..)
+  </dependencies>
+  (..)
++-----
+ 
+  This will result in the following message:
+
++-----
+[WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message:
+Reactor modules contains dependencies which do not reference the reactor.
+ module: com.mycompany.project:myproject-x:jar:1.2-SNAPSHOT
+    dependency: com.mycompany.project:myproject:1.1
++-----
diff --git a/enforcer-rules/src/site/apt/requireProperty.apt.vm b/enforcer-rules/src/site/apt/requireActiveProfile.apt.vm
similarity index 54%
copy from enforcer-rules/src/site/apt/requireProperty.apt.vm
copy to enforcer-rules/src/site/apt/requireActiveProfile.apt.vm
index ff1146e..f639223 100644
--- a/enforcer-rules/src/site/apt/requireProperty.apt.vm
+++ b/enforcer-rules/src/site/apt/requireActiveProfile.apt.vm
@@ -16,30 +16,29 @@
 ~~ under the License.    
  
   ------
-  Require Property
+  Require Active Profile
   ------
-  Brian Fox
+  Karl-Heinz Marbaise
   ------
-  June 2007
+  December 2013
   ------
 
-Require Property
+Require Active Profile
 
-  This rule can enforce that a declared property is set and optionally evaluate it against a regular expression.
+  This rule checks that a specified list of profiles is activated.
 
 
    The following parameters are supported by this rule:
    
-   * property - the property to evaluate.
+   * message - an optional message to the user if the rule fails.
    
-   * message - an optional message to the user if the rule fails. Default is: "Property 'xxx' is required for this build".	
+   * profiles - A comma separated list of profile to check.
    
-   * regex - a regular expression used to check the value of the property.
-   
-   * regexMessage - an optional message to the user if the regex check fails.
+   * all - Checks if all given profiles are active. Default is true.
    
    []
 
+   
   Sample Plugin Configuration:
   
 +---+
@@ -53,24 +52,15 @@ Require Property
         <version>${project.version}</version>
         <executions>
           <execution>
-            <id>enforce-property</id>
+            <id>enforce-all-profiles-are-activated</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
-                <requireProperty>
-                  <property>basedir</property>
-                  <message>You must have a basedir!</message>
-                  <regex>\d</regex>
-                  <regexMessage>You must have a digit in your baseDir!</regexMessage>
-                </requireProperty>
-                <requireProperty>
-                  <property>project.version</property>
-                  <message>"Project version must be specified."</message>
-                  <regex>(\d|-SNAPSHOT)$</regex>
-                  <regexMessage>"Project version must end in a number or -SNAPSHOT."</regexMessage>
-                </requireProperty>
+                <requireActiveProfile>
+                  <profiles>first,second</profiles>
+                </requireActiveProfile>
               </rules>
               <fail>true</fail>
             </configuration>
@@ -82,4 +72,38 @@ Require Property
   [...]
 </project>
 +---+
+
+  Sample Plugin Configuration to check if one of the given profiles is active:
   
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-first-or-second-profile-is-active</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireActiveProfile>
+                  <profiles>first,second</profiles>
+                  <all>false</all>
+                </requireActiveProfile>
+              </rules>
+              <fail>true</fail>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
diff --git a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm b/enforcer-rules/src/site/apt/requireEnvironmentVariable.apt.vm
similarity index 71%
copy from enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
copy to enforcer-rules/src/site/apt/requireEnvironmentVariable.apt.vm
index 810b7e8..21a3a8e 100644
--- a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
+++ b/enforcer-rules/src/site/apt/requireEnvironmentVariable.apt.vm
@@ -16,27 +16,29 @@
 ~~ under the License.    
  
   ------
-  Require Maven Version
+  Require Environment Variable
   ------
-  Brian Fox
+  Karl-Heinz Marbaise
   ------
-  June 2007
+  December 2013
   ------
 
-Require Maven Version
+Require Environment Variable
+
+  This rule checks that a specified environment variable is set.
 
-   This rule enforces certain Maven versions. The rule uses the {{{./versionRanges.html}Enforcer version range syntax}} to define allowed versions.
 
    The following parameters are supported by this rule:
    
    * message - an optional message to the user if the rule fails.
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed Maven versions.
+   * variableNames - The name of the environment variable to be checked for.
    
    []
 
-   Sample Plugin Configuration:
    
+  Sample Plugin Configuration:
+  
 +---+
 <project>
   [...]
@@ -48,16 +50,17 @@ Require Maven Version
         <version>${project.version}</version>
         <executions>
           <execution>
-            <id>enforce-maven</id>
+            <id>enforce-environment-variable-is-set</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
-                <requireMavenVersion>
-                  <version>2.0.6</version>
-                </requireMavenVersion>
-              </rules>    
+                <requireEnvironmentVariable>
+                  <variableName>the_name_you_wish_to_be_checked</variableName>
+                </requireEnvironmentVariable>
+              </rules>
+              <fail>true</fail>
             </configuration>
           </execution>
         </executions>
@@ -66,4 +69,4 @@ Require Maven Version
   </build>
   [...]
 </project>
-+---+  
\ No newline at end of file
++---+
diff --git a/enforcer-rules/src/site/apt/requireFileChecksum.apt.vm b/enforcer-rules/src/site/apt/requireFileChecksum.apt.vm
new file mode 100644
index 0000000..c4606cd
--- /dev/null
+++ b/enforcer-rules/src/site/apt/requireFileChecksum.apt.vm
@@ -0,0 +1,98 @@
+~~ 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.
+
+  ------
+  Require Files Checksum
+  ------
+  Edward Samson, Lyubomyr Shaydariv
+  ------
+  February 2016
+  ------
+
+Require Files Checksum
+
+  This rule checks that the specified file has an given checksum.
+
+
+   The following parameters are supported by this rule:
+
+   * message - an optional message to the user if the rule fails.
+
+   * file - A file to check.
+
+   * checksum - Expected file checksum.
+
+   * type - Type of hashing algorithm to calculate the checksum. May be one of "md5", "sha1", "sha256", "sha384", or "sha512".
+
+   []
+
+
+  Sample Plugin Configuration:
+
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-checksum</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireFileChecksum>
+                  <file>${project.build.outputDirectory}/foo.txt</file>
+                  <checksum>d41d8cd98f00b204e9800998ecf8427e</checksum>
+                  <type>md5</type>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.build.outputDirectory}/bar.txt</file>
+                  <checksum>da39a3ee5e6b4b0d3255bfef95601890afd80709</checksum>
+                  <type>sha1</type>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.build.outputDirectory}/baz.txt</file>
+                  <checksum>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</checksum>
+                  <type>sha256</type>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.build.outputDirectory}/qux.txt</file>
+                  <checksum>38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b</checksum>
+                  <type>sha384</type>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.build.outputDirectory}/quux.txt</file>
+                  <checksum>cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e</checksum>
+                  <type>sha512</type>
+                </requireFileChecksum>
+              </rules>
+              <fail>true</fail>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
diff --git a/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm b/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm
index edb7618..c563afe 100644
--- a/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm
+++ b/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm
@@ -31,7 +31,7 @@ Require Java Version
    
    * message - an optional message to the user if the rule fails.
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed JDKs.
+   * {{{../apidocs/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed JDKs.
    
    []
 
@@ -79,7 +79,7 @@ OS Info: Arch: x86 Family: windows Name: windows xp Version: 5.1
             <configuration>
               <rules>
                 <requireJavaVersion>
-                  <version>1.5.0</version>
+                  <version>1.6.0</version>
                 </requireJavaVersion>
               </rules>    
             </configuration>
@@ -92,4 +92,4 @@ OS Info: Arch: x86 Family: windows Name: windows xp Version: 5.1
 </project>
 +---+
   
-  If you would like to enforce a certain vendor string for the JDK, you would use the {{{./requireProperty.html}RequireProperty}} rule, and check the java.vendor property with a regular expression.
\ No newline at end of file
+  If you would like to enforce a certain vendor string for the JDK, you would use the {{{./requireProperty.html}RequireProperty}} rule, and check the java.vendor property with a regular expression.
diff --git a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm b/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
index 810b7e8..268f2bd 100644
--- a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
+++ b/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
@@ -30,8 +30,8 @@ Require Maven Version
    The following parameters are supported by this rule:
    
    * message - an optional message to the user if the rule fails.
-   
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed Maven versions.
+
+   * {{{../enforcer-rules/apidocs/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed Maven versions.
    
    []
 
@@ -55,7 +55,7 @@ Require Maven Version
             <configuration>
               <rules>
                 <requireMavenVersion>
-                  <version>2.0.6</version>
+                  <version>3.0</version>
                 </requireMavenVersion>
               </rules>    
             </configuration>
@@ -66,4 +66,4 @@ Require Maven Version
   </build>
   [...]
 </project>
-+---+  
\ No newline at end of file
++---+  
diff --git a/enforcer-rules/src/site/apt/requireNoRepositories.apt.vm b/enforcer-rules/src/site/apt/requireNoRepositories.apt.vm
index 4734997..351e401 100644
--- a/enforcer-rules/src/site/apt/requireNoRepositories.apt.vm
+++ b/enforcer-rules/src/site/apt/requireNoRepositories.apt.vm
@@ -13,8 +13,8 @@
 ~~ "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.    
- 
+~~ under the License.
+
   ------
   Require No Repositories
   ------
@@ -25,30 +25,26 @@
 
 Require No Repositories
 
-   This rule enforces that all plugins have a version defined, either in the plugin or pluginManagement section of the pom or a parent pom.
+   This rule checks that this pom or its parents don't define a repository.
 
    The following parameters are supported by this rule:
-   
-   * message - an optional message to the user if the rule fails.
-   
-   * banLatest - disallow any use of "LATEST" as a version for any plugin. Default = true.
-   
-   * banRelease - disallow any use of "RELEASE" as a version for any plugin. Default = true.
-   
-   * banSnapshots - disallow any use of SNAPSHOT plugins. Default = true.
-   
-   * phases - The comma separated list of phases that should be used to find 
-     lifecycle plugin bindings. The default value is "clean,deploy,site".
-   
-   * additionalPlugins - A list of additional plugins to enforce have versions. These
-     are plugins that may not be in the poms but are used anyway, like help, eclipse etc.
-     The plugins should be specified in the form: group:artifactId.  
-     
-   
+
+   * banRepositories - Whether to ban non-plugin repositories. By default they are banned (true).
+
+   * banPluginRepositories - Whether to ban plugin repositories. By default they are banned (true).
+
+   * allowedRepositories - Specify explicitly allowed non-plugin repositories. This is a list of ids.
+
+   * allowedPluginRepositories - Specify explicitly allowed plugin repositories. This is a list of ids.
+
+   * allowSnapshotRepositories - Whether to allow repositories which only resolve snapshots. By default they are banned (false).
+
+   * allowSnapshotPluginRepositories - Whether to allow plugin repositories which only resolve snapshots. By default they are banned (false).
+
    []
 
    Sample Plugin Configuration (showing some defaults, defaults can be skipped):
-   
+
 +---+
 <project>
   [...]
@@ -60,24 +56,16 @@ Require No Repositories
         <version>${project.version}</version>
         <executions>
           <execution>
-            <id>enforce-no-repos</id>
+            <id>enforce-no-repositories</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
-                <requirePluginVersions>
-                  <message>Best Practice is to always define plugin versions!</message>
-                  <banLatest>true</banLatest>
-                  <banRelease>true</banRelease>
-                  <banSnapshots>true</banSnapshots>
-                  <phases>clean,deploy,site</phases>
-                  <additionalPlugins>
-                    <additionalPlugin>org.apache.maven.plugins:maven-eclipse-plugin</additionalPlugin>
-                    <additionalPlugin>org.apache.maven.plugins:maven-ide-plugin</additionalPlugin>
-                  </additionalPlugins>
-                </requirePluginVersions>
-              </rules>    
+                <requireNoRepositories>
+                  <message>Best Practice is to never define repositories in pom.xml (use a repository manager instead)</message>
+                </requireNoRepositories>
+              </rules>
             </configuration>
           </execution>
         </executions>
@@ -86,4 +74,4 @@ Require No Repositories
   </build>
   [...]
 </project>
-+---+  
\ No newline at end of file
++---+
\ No newline at end of file
diff --git a/enforcer-rules/src/site/apt/requireOS.apt.vm b/enforcer-rules/src/site/apt/requireOS.apt.vm
index 38fcd2e..49024f5 100644
--- a/enforcer-rules/src/site/apt/requireOS.apt.vm
+++ b/enforcer-rules/src/site/apt/requireOS.apt.vm
@@ -33,9 +33,9 @@ Require OS Version
 
    * message - an optional message to the user if the rule fails.
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/RequireOS.html#arch}arch}} - the cpu architecture.
+   * {{{../apidocs/org/apache/maven/plugins/enforcer/RequireOS.html#arch}arch}} - the cpu architecture.
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/RequireOS.html#family}family}} - the family of OS. Possible families are:
+   * {{{../apidocs/org/apache/maven/plugins/enforcer/RequireOS.html#family}family}} - the family of OS. Possible families are:
    
      * dos
   
@@ -60,11 +60,11 @@ Require OS Version
      []
    		
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/RequireOS.html#name}name}} - the name of the OS.
+   * {{{../apidocs/org/apache/maven/plugins/enforcer/RequireOS.html#name}name}} - the name of the OS.
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/RequireOS.html#version}version}} - the version of the OS.
+   * {{{../apidocs/org/apache/maven/plugins/enforcer/RequireOS.html#version}version}} - the version of the OS.
    
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/RequireOS.html#display}display}} -  flag to display the detected OS informatin.
+   * {{{../apidocs/org/apache/maven/plugins/enforcer/RequireOS.html#display}display}} -  flag to display the detected OS informatin.
    
    []
 
diff --git a/enforcer-rules/src/site/apt/requirePluginVersions.apt.vm b/enforcer-rules/src/site/apt/requirePluginVersions.apt.vm
index eee652c..e654b71 100644
--- a/enforcer-rules/src/site/apt/requirePluginVersions.apt.vm
+++ b/enforcer-rules/src/site/apt/requirePluginVersions.apt.vm
@@ -46,7 +46,7 @@ Require Plugin Versions
      are plugins that may not be in the poms but are used anyway, like help, eclipse etc.
      The plugins should be specified in the form: group:artifactId.
 
-   * unCheckedPluginsList - A comma separated list of plugins to skip version checking. Ie allow no version, or snapshots, etc. The plugins should be specified in the form: group:artifactId.
+   * unCheckedPluginList - A comma separated list of plugins to skip version checking. Ie allow no version, or snapshots, etc. The plugins should be specified in the form: group:artifactId.
 
 
    []
@@ -80,7 +80,7 @@ Require Plugin Versions
                      <additionalPlugin>org.apache.maven.plugins:maven-eclipse-plugin</additionalPlugin>
                      <additionalPlugin>org.apache.maven.plugins:maven-reactor-plugin</additionalPlugin>
                    </additionalPlugins>
-                   <unCheckedPluginsList>org.apache.maven.plugins:maven-enforcer-plugin,org.apache.maven.plugins:maven-idea-plugin</unCheckedPluginsList>
+                   <unCheckedPluginList>org.apache.maven.plugins:maven-enforcer-plugin,org.apache.maven.plugins:maven-idea-plugin</unCheckedPluginList>
                 </requirePluginVersions>
               </rules>
             </configuration>
diff --git a/enforcer-rules/src/site/apt/requirePrerequisite.apt.vm b/enforcer-rules/src/site/apt/requirePrerequisite.apt.vm
new file mode 100644
index 0000000..8a07987
--- /dev/null
+++ b/enforcer-rules/src/site/apt/requirePrerequisite.apt.vm
@@ -0,0 +1,74 @@
+ ~~ 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.
+
+ -----
+ Require Same Version
+ -----
+ Robert Scholte
+ -----
+ 2013-06-16
+ -----
+ 
+  Require Prerequisites
+
+  This rule enforces that the prerequisite is specified since it is not inherited from its parent. 
+  Defining the prerequisites is especially useful for plugins to enforce at least a certain version of Maven. 
+
+
+   The following parameters are supported by this rule:
+   
+   * mavenVersion - an optional value contain a versionrange or the version at least required.
+   
+   []
+
+   
+  Sample Plugin Configuration:
+  
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-prerequisites</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requirePrerequisite>
+                  <mavenVersion>2.2.1</mavenVersion>
+                </requirePrerequisite>
+                <!-- same rule, different notation -->
+                <requirePrerequisite>
+                  <mavenVersion>[2.2.1,)</mavenVersion>
+                </requirePrerequisite>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
diff --git a/enforcer-rules/src/site/apt/requireProperty.apt.vm b/enforcer-rules/src/site/apt/requireProperty.apt.vm
index ff1146e..0023056 100644
--- a/enforcer-rules/src/site/apt/requireProperty.apt.vm
+++ b/enforcer-rules/src/site/apt/requireProperty.apt.vm
@@ -27,18 +27,20 @@ Require Property
 
   This rule can enforce that a declared property is set and optionally evaluate it against a regular expression.
 
-
-   The following parameters are supported by this rule:
-   
-   * property - the property to evaluate.
+  The following parameters are supported by this rule:
    
-   * message - an optional message to the user if the rule fails. Default is: "Property 'xxx' is required for this build".	
+  * property - the property to evaluate.
    
-   * regex - a regular expression used to check the value of the property.
+  * message - an optional message to the user if the rule fails. Default is: "Property 'xxx' is required for this build".	
    
-   * regexMessage - an optional message to the user if the regex check fails.
+  * regex - a regular expression used to check the value of the property.
    
-   []
+  * regexMessage - an optional message to the user if the regex check fails.
+
+  []
+
+  The regex is applied to the entire value of the property (i.e. using the regex "match" method),
+  and not just a substring of the property value.
 
   Sample Plugin Configuration:
   
@@ -61,14 +63,14 @@ Require Property
               <rules>
                 <requireProperty>
                   <property>basedir</property>
-                  <message>You must have a basedir!</message>
-                  <regex>\d</regex>
-                  <regexMessage>You must have a digit in your baseDir!</regexMessage>
+                  <message>You must set a basedir property!</message>
+                  <regex>.*\d.*</regex>
+                  <regexMessage>The basedir property must contain at least one digit.</regexMessage>
                 </requireProperty>
                 <requireProperty>
                   <property>project.version</property>
                   <message>"Project version must be specified."</message>
-                  <regex>(\d|-SNAPSHOT)$</regex>
+                  <regex>.*(\d|-SNAPSHOT)$</regex>
                   <regexMessage>"Project version must end in a number or -SNAPSHOT."</regexMessage>
                 </requireProperty>
               </rules>
diff --git a/enforcer-rules/src/site/apt/requireSameVersions.apt.vm b/enforcer-rules/src/site/apt/requireSameVersions.apt.vm
new file mode 100644
index 0000000..f3c99e1
--- /dev/null
+++ b/enforcer-rules/src/site/apt/requireSameVersions.apt.vm
@@ -0,0 +1,86 @@
+ ~~ 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.
+
+ -----
+ Require Same Version
+ -----
+ Robert Scholte
+ -----
+ 2013-06-13
+ -----
+ 
+ Require Same Versions
+
+  This rule enforces that specific dependencies and/or plugins have the same version.
+
+
+   The following parameters are supported by this rule:
+   
+   * dependencies - an optional list of dependency patterns
+   
+   * buildPlugins - an optional list of build plugin patterns
+   
+   * reportPlugins - an optional list of report plugin patterns
+   
+   * plugins - an optional list of both build and report plugin patterns
+    
+   * uniqueVersions - if SNAPSHOTs should be compared by their timestamped version or not. Default: false 
+
+   []
+
+   
+  Sample Plugin Configuration:
+  
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-no-snapshots</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireSameVersions>
+                  <plugins>
+                    <plugin>org.apache.maven.plugins:maven-surefire-plugin</plugin>
+                    <plugin>org.apache.maven.plugins:maven-failsafe-plugin</plugin>
+                    <plugin>org.apache.maven.plugins:maven-surefire-report-plugin</plugin>
+                  </plugins>
+                </requireSameVersions>
+                <requireSameVersions>
+                  <dependencies>
+                    <dependency>org.apache.maven</dependency> <!-- or org.apache.maven:* -->
+                  </dependencies>
+                </requireSameVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
\ No newline at end of file
diff --git a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm b/enforcer-rules/src/site/apt/requireSnapshotVersion.apt.vm
similarity index 71%
copy from enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
copy to enforcer-rules/src/site/apt/requireSnapshotVersion.apt.vm
index 810b7e8..446acf5 100644
--- a/enforcer-rules/src/site/apt/requireMavenVersion.apt.vm
+++ b/enforcer-rules/src/site/apt/requireSnapshotVersion.apt.vm
@@ -16,27 +16,29 @@
 ~~ under the License.    
  
   ------
-  Require Maven Version
+  Require Snapshot Version
   ------
-  Brian Fox
+  Guillaume Boue
   ------
-  June 2007
+  September 2016
   ------
 
-Require Maven Version
+Require Snapshot Version
+
+  This rule checks that the current project is not a release.
 
-   This rule enforces certain Maven versions. The rule uses the {{{./versionRanges.html}Enforcer version range syntax}} to define allowed versions.
 
    The following parameters are supported by this rule:
    
    * message - an optional message to the user if the rule fails.
-   
-   * {{{../apidocs/org/apache/maven/plugin/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed Maven versions.
-   
+    
+   * failWhenParentIsRelease - if the parent should be checked. Default: true 
+
    []
 
-   Sample Plugin Configuration:
    
+  Sample Plugin Configuration:
+  
 +---+
 <project>
   [...]
@@ -48,16 +50,17 @@ Require Maven Version
         <version>${project.version}</version>
         <executions>
           <execution>
-            <id>enforce-maven</id>
+            <id>enforce-no-releases</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
-                <requireMavenVersion>
-                  <version>2.0.6</version>
-                </requireMavenVersion>
-              </rules>    
+                <requireSnapshotVersion>
+                  <message>No Releases Allowed!</message>
+                </requireSnapshotVersion>
+              </rules>
+              <fail>true</fail>
             </configuration>
           </execution>
         </executions>
@@ -66,4 +69,4 @@ Require Maven Version
   </build>
   [...]
 </project>
-+---+  
\ No newline at end of file
++---+
diff --git a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
similarity index 54%
copy from enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
copy to enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
index 6c8691a..b34a6f4 100644
--- a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+++ b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
@@ -16,74 +16,74 @@
  ~~ under the License.
 
  -----
- Comparing against a specific artifact
+ Require Upper Bound Dependencies
  -----
  -----
- 2008-09-13
+ 2012-02-08
  -----
 
-  This rule requires that dependency version numbers converge.  If a project has two dependencies, A and B, both depending on the same artifact, C, this rule will fail the build if A depends on a different version of C then the version of C depended on by B.
+  This rule requires that the version for each dependency resolved during a build, is equal
+  to or higher than all transitive dependency declarations.  The version of each dependency
+  resolved during the build will normally be the version specified in the POM or the 
+  version with the least transitive steps (the "nearest" definition).  For more 
+  information about Maven dependency resolution, see 
+  {{{http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html}the Maven site}}.
 
-  Here is a concrete example.
-
-  This will cause a build to fail.
+  Here is a concrete example. This will cause a build to fail:
   
 -----------------------------------------------------------------------------------
-
   <dependencies>
     <dependency>
       <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <version>1.6.1</version>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.4.0</version>
     </dependency>
     <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-nop</artifactId>
-      <version>1.6.0</version>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>0.9.9</version>
+      <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
     </dependency>
-  </dependencies>  
+  </dependencies>
 -----------------------------------------------------------------------------------
 
-  With this being logged during compilation
+  Because the project will run logback-classic 0.9.9 with slf4j-api 1.4.0
+  and slf4j-api 1.4.0 is probably not forwards compatible with slf4j-api 1.5.0.
+
+  This is the log message:
 
 -----------------------------------------------------------------------------------
-Dependency convergence error for org.slf4j:slf4j-api1.6.1 paths to dependency are:
 
-[ERROR]
-Dependency convergence error for org.slf4j:slf4j-api:1.6.1 paths to dependency are:
-+-org.myorg:my-project:1.0.0-SNAPSHOT
-  +-org.slf4j:slf4j-jdk14:1.6.1
-    +-org.slf4j:slf4j-api:1.6.1
+Failed while enforcing RequireUpperBoundDeps. The error(s) are [
+RequireUpperBoundDeps error for org.slf4j:slf4j-api:1.4.0 paths to dependency are:
++-test:TestParent:1.0-SNAPSHOT
+  +-org.slf4j:slf4j-api:1.4.0
 and
-+-org.myorg:my-project:1.0.0-SNAPSHOT
-  +-org.slf4j:slf4j-nop:1.6.0
-    +-org.slf4j:slf4j-api:1.6.0
-
++-test:TestParent:1.0-SNAPSHOT
+  +-ch.qos.logback:logback-classic:0.9.9
+    +-org.slf4j:slf4j-api:1.5.0
+]
 
 -----------------------------------------------------------------------------------
 
   And this will succeed.
   
 -----------------------------------------------------------------------------------
+  <dependencies>
     <dependency>
       <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <version>1.6.1</version>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.6.0</version>
     </dependency>
     <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-nop</artifactId>
-      <version>1.6.0</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-api</artifactId>
-        </exclusion>
-      </exclusions>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>0.9.9</version>
+      <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
     </dependency>
+  </dependencies>
 -----------------------------------------------------------------------------------
 
-
   Here is how a project should be setup to use this rule
 
 -----------------------------------------------------------------------------------
@@ -101,7 +101,15 @@ and
             <id>enforce</id>
             <configuration>
               <rules>
-                <DependencyConvergence/>
+                <requireUpperBoundDeps>
+                  <!-- 'uniqueVersions' (default:false) can be set to true if you want to compare the timestamped SNAPSHOTs  -->
+                  <!-- <uniqueVersions>true</uniqueVersions> -->
+                  <!-- If you wish to ignore certain cases:
+                  <excludes>
+                    <exclude>com.google.guava:guava</exclude>
+                  </excludes>
+                  -->
+                </requireUpperBoundDeps>
               </rules>
             </configuration>
             <goals>
@@ -116,3 +124,5 @@ and
   ...
 </project>
 -----------------------------------------------------------------------------------
+
+  
\ No newline at end of file
diff --git a/enforcer-rules/src/site/apt/versionRanges.apt b/enforcer-rules/src/site/apt/versionRanges.apt
index fc56e55..a27213b 100644
--- a/enforcer-rules/src/site/apt/versionRanges.apt
+++ b/enforcer-rules/src/site/apt/versionRanges.apt
@@ -25,7 +25,7 @@
 
 Version Range Specification   
 
-   The {{{./requireMavenVersion.html}RequireMavenVersion}} and {{{./requireJavaVersion.html}RequireJavaVersion}} rules use the {{{http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges}standard Maven version range syntax}} with one minor change for ease of use (denoted with *):
+   The {{{./requireMavenVersion.html}RequireMavenVersion}} and {{{./requireJavaVersion.html}RequireJavaVersion}} rules use the {{{https://cwiki.apache.org/confluence/display/MAVENOLD/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges}standard Maven version range syntax}} with one minor change for ease of use (denoted with *):
    
 
 *----------*--------------+
diff --git a/enforcer-rules/src/site/resources/images/module.png b/enforcer-rules/src/site/resources/images/module.png
new file mode 100644
index 0000000..0bac49a
Binary files /dev/null and b/enforcer-rules/src/site/resources/images/module.png differ
diff --git a/enforcer-rules/src/site/resources/images/root-with-modules.png b/enforcer-rules/src/site/resources/images/root-with-modules.png
new file mode 100644
index 0000000..d0586bf
Binary files /dev/null and b/enforcer-rules/src/site/resources/images/root-with-modules.png differ
diff --git a/enforcer-rules/src/site/resources/images/root-with-parent-and-modules.png b/enforcer-rules/src/site/resources/images/root-with-parent-and-modules.png
new file mode 100644
index 0000000..eb254fb
Binary files /dev/null and b/enforcer-rules/src/site/resources/images/root-with-parent-and-modules.png differ
diff --git a/enforcer-rules/src/site/resources/images/root-with-parent.png b/enforcer-rules/src/site/resources/images/root-with-parent.png
new file mode 100644
index 0000000..4cb7041
Binary files /dev/null and b/enforcer-rules/src/site/resources/images/root-with-parent.png differ
diff --git a/enforcer-rules/src/site/resources/images/root.png b/enforcer-rules/src/site/resources/images/root.png
new file mode 100644
index 0000000..67597a5
Binary files /dev/null and b/enforcer-rules/src/site/resources/images/root.png differ
diff --git a/enforcer-rules/src/site/site.xml b/enforcer-rules/src/site/site.xml
index da8b9d2..fef88e5 100644
--- a/enforcer-rules/src/site/site.xml
+++ b/enforcer-rules/src/site/site.xml
@@ -22,7 +22,7 @@ under the License.
     <menu name="Overview">
       <item name="Introduction" href="index.html"/>
       <item name="Rule API" href="../enforcer-api/"/>
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin/"/>
+      <item name="Maven Enforcer Plugin" href="../maven-enforcer-plugin/"/>
     </menu>
     <menu name="Custom Rules">
       <item name="Writing a custom rule" href="../enforcer-api/writing-a-custom-rule.html"/>
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BanDistributionManagementTest.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BanDistributionManagementTest.java
new file mode 100644
index 0000000..fdc33f7
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BanDistributionManagementTest.java
@@ -0,0 +1,285 @@
+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 static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.model.DeploymentRepository;
+import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Site;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.junit.Test;
+
+/**
+ * This class is intended to test the {@link BanDistributionManagement} rule.
+ *
+ * @author <a href="mailto:khmarbaise at apache.org">Karl Heinz Marbaise</a>
+ */
+public class BanDistributionManagementTest
+{
+    private MavenProject project;
+
+    private EnforcerRuleHelper helper;
+
+    @Test
+    public void shouldNotFailWithoutDistributionManagement()
+        throws Exception
+    {
+        BanDistributionManagement rule = setupProjectWithoutDistributionManagement();
+        rule.execute( helper );
+        // intentionally no assert cause in case of an exception the test will be red.
+    }
+
+    /**
+     * <pre>
+     * <distributionManagement>
+     *   <repository>
+     *    ...
+     *   </repository>
+     * </distributionManagement>
+     * </pre>
+     * 
+     * @throws Exception
+     */
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldThrowExceptionIfDistributionManagementIsDefinedWithRepository()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithDistributionManagement( new DeploymentRepository(), null, null );
+        rule.execute( helper );
+        // intentionally no assert cause we expect an exception.
+    }
+
+    /**
+     * <pre>
+     * <distributionManagement>
+     *   <repository>
+     *    ...
+     *   </repository>
+     *   <snapshotRepository>
+     *    ...
+     *   </snapshotRepository>
+     * </distributionManagement>
+     * </pre>
+     */
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldThrowExceptionIfDistributionManagementIsDefinedWithRepositorySnapshotRepository()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithDistributionManagement( new DeploymentRepository(), new DeploymentRepository(), null );
+        rule.execute( helper );
+        // intentionally no assert cause we expect an exception.
+    }
+
+    /**
+     * <pre>
+     * <distributionManagement>
+     *   <repository>
+     *    ...
+     *   </repository>
+     *   <snapshotRepository>
+     *    ...
+     *   </snapshotRepository>
+     *   <site>
+     *    ...
+     *   </site>
+     * </distributionManagement>
+     * </pre>
+     */
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldThrowExceptionIfDistributionManagementIsDefinedWithRepositorySnapshotRepositorySite()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithDistributionManagement( new DeploymentRepository(), new DeploymentRepository(),
+                                                    new Site() );
+        rule.execute( helper );
+        // intentionally no assert cause we expect an exception.
+    }
+
+    /**
+     * <pre>
+     * <distributionManagement>
+     *   <repository>
+     *    ...
+     *   </repository>
+     * </distributionManagement>
+     * </pre>
+     */
+    @Test
+    public void shouldAllowDistributionManagementHavingRepository()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithDistributionManagement( new DeploymentRepository(), null, null );
+        rule.setAllowRepository( true );
+        rule.execute( helper );
+        // intentionally no assert cause in case of an exception the test will be red.
+    }
+
+    /**
+     * <pre>
+     * <distributionManagement>
+     *   <repository>
+     *    ...
+     *   </repository>
+     *   <snapshotRepository>
+     *    ...
+     *   </snapshotRepository>
+     * </distributionManagement>
+     * </pre>
+     */
+    @Test
+    public void shouldAllowDistributionManagementHavingRepositorySnapshotRepository()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithDistributionManagement( new DeploymentRepository(), new DeploymentRepository(), null );
+        rule.setAllowRepository( true );
+        rule.setAllowSnapshotRepository( true );
+        rule.execute( helper );
+        // intentionally no assert cause in case of an exception the test will be red.
+    }
+
+    /**
+     * <pre>
+     * <distributionManagement>
+     *   <repository>
+     *    ...
+     *   </repository>
+     *   <snapshotRepository>
+     *    ...
+     *   </snapshotRepository>
+     *   <site>
+     *    ...
+     *   </site>
+     * </distributionManagement>
+     * </pre>
+     */
+    @Test
+    public void shouldAllowDistributionManagementHavingRepositorySnapshotRepositorySite()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithDistributionManagement( new DeploymentRepository(), new DeploymentRepository(),
+                                                    new Site() );
+        rule.setAllowRepository( true );
+        rule.setAllowSnapshotRepository( true );
+        rule.setAllowSite( true );
+        rule.execute( helper );
+        // intentionally no assert cause in case of an exception the test will be red.
+    }
+
+    @Test
+    public void shouldThrowExceptionCauseParentProjectHasDistributionManagementSnapshotRepository()
+        throws Exception
+    {
+        BanDistributionManagement rule =
+            setupProjectWithParentDistributionManagement( null, new DeploymentRepository(), null );
+
+        rule.setIgnoreParent( false );
+        rule.setAllowSnapshotRepository( true );
+
+        rule.execute( helper );
+    }
+
+    private BanDistributionManagement setupProjectWithParentDistributionManagement( DeploymentRepository repository,
+                                                                                    DeploymentRepository snapshotRepository,
+                                                                                    Site site )
+                                                                                        throws ExpressionEvaluationException
+    {
+        project = setupProject( null );
+
+        DistributionManagement dmParent = mock( DistributionManagement.class );
+        when( dmParent.getRepository() ).thenReturn( repository );
+        when( dmParent.getSnapshotRepository() ).thenReturn( snapshotRepository );
+        when( dmParent.getSite() ).thenReturn( site );
+
+        MavenProject parentProject = mock( MavenProject.class );
+        Model model = mock( Model.class );
+        when( model.getDistributionManagement() ).thenReturn( dmParent );
+        when( parentProject.getOriginalModel() ).thenReturn( model );
+        when( project.getParent() ).thenReturn( parentProject );
+
+        BanDistributionManagement rule = setupEnforcerRule();
+
+        return rule;
+    }
+
+    private BanDistributionManagement setupProjectWithoutDistributionManagement()
+        throws ExpressionEvaluationException
+    {
+        project = setupProject( null );
+
+        BanDistributionManagement rule = setupEnforcerRule();
+
+        return rule;
+    }
+
+    private BanDistributionManagement setupProjectWithDistributionManagement( DeploymentRepository repository,
+                                                                              DeploymentRepository snapshotRepository,
+                                                                              Site site )
+                                                                                  throws ExpressionEvaluationException
+    {
+        DistributionManagement dm = mock( DistributionManagement.class );
+        when( dm.getRepository() ).thenReturn( repository );
+        when( dm.getSnapshotRepository() ).thenReturn( snapshotRepository );
+        when( dm.getSite() ).thenReturn( site );
+
+        project = setupProject( dm );
+
+        when( project.getParent() ).thenReturn( mock( MavenProject.class ) );
+        when( project.isExecutionRoot() ).thenReturn( true );
+
+        BanDistributionManagement rule = setupEnforcerRule();
+
+        return rule;
+    }
+
+    private MavenProject setupProject( DistributionManagement distributionManagement )
+    {
+        MavenProject project = mock( MavenProject.class );
+        when( project.getPackaging() ).thenReturn( "jar" );
+        Model mavenModel = mock( Model.class );
+        when( project.getOriginalModel() ).thenReturn( mavenModel );
+        when( mavenModel.getDistributionManagement() ).thenReturn( distributionManagement );
+        return project;
+    }
+
+    private BanDistributionManagement setupEnforcerRule()
+        throws ExpressionEvaluationException
+    {
+        helper = mock( EnforcerRuleHelper.class );
+        when( helper.evaluate( "${project}" ) ).thenReturn( project );
+        BanDistributionManagement rule = new BanDistributionManagement();
+
+        when( helper.getLog() ).thenReturn( mock( Log.class ) );
+        return rule;
+    }
+
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java
new file mode 100644
index 0000000..1d36ef7
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java
@@ -0,0 +1,109 @@
+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.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+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.testing.ArtifactStubFactory;
+import org.apache.maven.project.MavenProject;
+
+public class BannedDependenciesTestSetup
+{
+    public BannedDependenciesTestSetup()
+        throws IOException
+    {
+        this.excludes = new ArrayList<String>();
+        this.includes = new ArrayList<String>();
+
+        ArtifactStubFactory factory = new ArtifactStubFactory();
+
+        MockProject project = new MockProject();
+        project.setArtifacts( factory.getMixedArtifacts() );
+        project.setDependencyArtifacts( factory.getScopedArtifacts() );
+
+        this.helper = EnforcerTestUtils.getHelper( project );
+
+        this.rule = newBannedDependenciesRule();
+        this.rule.setMessage( null );
+
+        this.rule.setExcludes( this.excludes );
+        this.rule.setIncludes( this.includes );
+    }
+
+    private List<String> excludes;
+    private List<String> includes;
+
+    private BannedDependencies rule;
+
+    private EnforcerRuleHelper helper;
+
+    public void setSearchTransitive( boolean searchTransitive )
+    {
+        rule.setSearchTransitive( searchTransitive );
+    }
+
+    public void addExcludeAndRunRule( String toAdd )
+        throws EnforcerRuleException
+    {
+        excludes.add( toAdd );
+        rule.execute( helper );
+    }
+
+    public void addIncludeExcludeAndRunRule (String incAdd, String excAdd) throws EnforcerRuleException {
+        excludes.add( excAdd );
+        includes.add( incAdd );
+        rule.execute( helper );
+    }
+    
+    public List<String> getExcludes()
+    {
+        return excludes;
+    }
+
+    public void setExcludes( List<String> excludes )
+    {
+        this.excludes = excludes;
+    }
+
+    private BannedDependencies newBannedDependenciesRule()
+    {
+        BannedDependencies rule = new BannedDependencies()
+        {
+            @SuppressWarnings( "unchecked" )
+            @Override
+            protected Set<Artifact> getDependenciesToCheck( MavenProject project )
+            {
+                // the integration with dependencyGraphTree is verified with the integration tests
+                // for unit-testing
+                return isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts();
+            }
+        };
+        return rule;
+    }
+
+
+}
+
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 929ac28..f1bd2c3 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
@@ -19,18 +19,26 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import java.util.Date;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import java.util.Properties;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.execution.MavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
 import org.apache.maven.plugin.logging.SystemStreamLog;
 import org.apache.maven.plugins.enforcer.utils.MockEnforcerExpressionEvaluator;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.sonatype.aether.RepositorySystemSession;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class EnforcerTestUtils.
  *
@@ -45,8 +53,33 @@ public final class EnforcerTestUtils
      */
     public static MavenSession getMavenSession()
     {
-        return new MavenSession( new MockPlexusContainer(), null, null, null, null, null, null, new Properties(),
-                                 new Date() );
+        PlexusContainer mock = mock( PlexusContainer.class );
+
+        try
+        {
+            when( mock.lookup( "xx" ) ).thenReturn( new MavenProject() );
+        }
+        catch ( ComponentLookupException e )
+        {
+            e.printStackTrace();
+        }
+
+        MavenExecutionRequest mer = mock( MavenExecutionRequest.class );
+
+        Properties systemProperties = new Properties();
+        systemProperties.put( "maven.version", "3.0" );
+        when( mer.getUserProperties() ).thenReturn( new Properties() );
+        when(mer.getSystemProperties()).thenReturn( systemProperties );
+
+        MavenExecutionResult meresult = mock( MavenExecutionResult.class );
+        return new MavenSession( mock, (RepositorySystemSession) null, mer, meresult );
+
+        // return new MavenSession( new MockPlexusContainer(), (MavenExecutionRequest)null, null,
+        // null );
+
+        // new MavenSession();
+        // return new MavenSession( new MockPlexusContainer(), null, null, null, null, null, null, new Properties(),
+        // new Date() );
     }
 
     /**
@@ -98,7 +131,10 @@ public final class EnforcerTestUtils
         }
         else
         {
-            eval = new EnforcerExpressionEvaluator( session, new MockPathTranslator(), project );
+//            eval = new DefaultExpressionEvaluator();
+            MojoExecution mockExecution = mock( MojoExecution.class );
+            session.setCurrentProject( project );
+            eval = new PluginParameterExpressionEvaluator( session, mockExecution );
         }
         return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), null );
     }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPathTranslator.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPathTranslator.java
index 649473a..73a74db 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPathTranslator.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPathTranslator.java
@@ -24,7 +24,6 @@ import java.io.File;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.path.PathTranslator;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class MockPathTranslator.
  *
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
index 50c087e..a73cbbd 100644
--- 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
@@ -30,7 +30,6 @@ 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.CompositionException;
 import org.codehaus.plexus.component.composition.UndefinedComponentComposerException;
 import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
 import org.codehaus.plexus.component.factory.ComponentInstantiationException;
@@ -38,12 +37,12 @@ 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;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class MockPlexusContainer.
  *
@@ -79,7 +78,6 @@ public class MockPlexusContainer
      * @see org.codehaus.plexus.PlexusContainer#addComponentDescriptor(org.codehaus.plexus.component.repository.ComponentDescriptor)
      */
     public void addComponentDescriptor( ComponentDescriptor theComponentDescriptor )
-        throws ComponentRepositoryException
     {
         // TODO Auto-generated method stub
 
@@ -126,7 +124,7 @@ public class MockPlexusContainer
      *      org.codehaus.plexus.component.repository.ComponentDescriptor)
      */
     public void composeComponent( Object theComponent, ComponentDescriptor theComponentDescriptor )
-        throws CompositionException, UndefinedComponentComposerException
+        throws UndefinedComponentComposerException
     {
         // TODO Auto-generated method stub
 
@@ -239,17 +237,6 @@ public class MockPlexusContainer
     /*
      * (non-Javadoc)
      *
-     * @see org.codehaus.plexus.PlexusContainer#getContainerRealm()
-     */
-    public ClassRealm getContainerRealm()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
      * @see org.codehaus.plexus.PlexusContainer#getContext()
      */
     public Context getContext()
@@ -533,4 +520,143 @@ public class MockPlexusContainer
 
     }
 
+    @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/MockProject.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
index 0bbbe88..2a025f2 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
@@ -100,6 +100,9 @@ public class MockProject
 
     /** The plugin artifact repositories. */
     private List pluginArtifactRepositories;
+    
+    /** The artifact repositories. */
+    private List artifactRepositories;
 
     // private ArtifactRepository releaseArtifactRepository;
 
@@ -298,7 +301,7 @@ public class MockProject
      */
     public void setRemoteArtifactRepositories( List list )
     {
-
+        this.artifactRepositories = list;
     }
 
     /*
@@ -308,7 +311,7 @@ public class MockProject
      */
     public List getRemoteArtifactRepositories()
     {
-        return Collections.singletonList( "" );
+        return artifactRepositories;
     }
 
     /*
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/ReactorModuleConvergenceTest.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/ReactorModuleConvergenceTest.java
new file mode 100644
index 0000000..93e3808
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/ReactorModuleConvergenceTest.java
@@ -0,0 +1,338 @@
+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 org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Check reactorModuleConvergence rule.
+ * 
+ * @author <a href="mailto:khmarbaise at apache.org">Karl Heinz Marbaise</a>
+ */
+public class ReactorModuleConvergenceTest
+{
+    private MavenProject project;
+
+    private MavenSession session;
+
+    private EnforcerRuleHelper helper;
+
+    private ReactorModuleConvergence rule;
+
+    @Before
+    public void before()
+        throws ExpressionEvaluationException
+    {
+        project = mock( MavenProject.class );
+        session = mock( MavenSession.class );
+        helper = mock( EnforcerRuleHelper.class );
+        when( helper.evaluate( "${project}" ) ).thenReturn( project );
+        when( helper.evaluate( "${session}" ) ).thenReturn( session );
+        when( helper.getLog() ).thenReturn( mock( Log.class ) );
+
+        rule = new ReactorModuleConvergence();
+    }
+
+    @Test
+    public void shouldNotFailWithNoProject()
+        throws EnforcerRuleException
+    {
+        when( session.getSortedProjects() ).thenReturn( Collections.<MavenProject> emptyList() );
+
+        rule.execute( helper );
+
+        //intentionally only assertTrue cause we don't expect an exception.
+        assertTrue( true );
+    }
+
+    @Test
+    public void shouldNotFailWithAValidProject()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+        MavenProject mp2 = createProjectChild1( mp1 );
+        MavenProject mp3 = createProjectChild2( mp1 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally only assertTrue cause we don't expect an exception.
+        assertTrue( true );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldFailWithWrongVersionInOneChild()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+        MavenProject mp2 = createProjectChild1( mp1 );
+        MavenProject mp3 = createProjectChild2WithWrongVersion( mp1 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally no assertTrue() cause we expect getting an exception.
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldFailWithWrongParent()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+
+        MavenProject wrongParentVerison = mock( MavenProject.class );
+        when( wrongParentVerison.getGroupId() ).thenReturn( "org.apache.enforcer" );
+        when( wrongParentVerison.getArtifactId() ).thenReturn( "m1" );
+        when( wrongParentVerison.getVersion() ).thenReturn( "1.1-SNAPSHOT" );
+        when( wrongParentVerison.getId() ).thenReturn( "org.apache.enforcer:m1:jar:1.1-SNAPSHOT" );
+        when( wrongParentVerison.getDependencies() ).thenReturn( Collections.<Dependency>emptyList() );
+
+        MavenProject mp2 = createProjectChild2( wrongParentVerison );
+        MavenProject mp3 = createProjectChild2( mp1 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally no assertTrue() cause we expect getting an exception.
+    }
+
+    @Test
+    public void shouldNotFailWithACompanyParent()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject companyParent = createCompanyParent();
+        MavenProject mp1 = createProjectParent( companyParent );
+
+        MavenProject mp2 = createProjectChild1( mp1 );
+        MavenProject mp3 = createProjectChild2( mp1 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally only assertTrue cause we don't expect an exception.
+        assertTrue( true );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldFailWithMissingParentsInReactory()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+        MavenProject mp2 = createProjectChild1( mp1 );
+        MavenProject mp3 = createProjectChild2( null );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally only assertTrue cause we don't expect an exception.
+        assertTrue( true );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldFailWithAParentWhichIsNotPartOfTheReactory()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+
+        MavenProject wrongParentVerison = mock( MavenProject.class );
+        when( wrongParentVerison.getGroupId() ).thenReturn( "org.apache" );
+        when( wrongParentVerison.getArtifactId() ).thenReturn( "m1" );
+        when( wrongParentVerison.getVersion() ).thenReturn( "1.0-SNAPSHOT" );
+        when( wrongParentVerison.getId() ).thenReturn( "org.apache.enforcer:m1:jar:1.0-SNAPSHOT" );
+        when( wrongParentVerison.getDependencies() ).thenReturn( Collections.<Dependency>emptyList() );
+
+        MavenProject mp2 = createProjectChild2( wrongParentVerison );
+        MavenProject mp3 = createProjectChild2( mp1 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally no assertTrue() cause we expect getting an exception.
+    }
+
+    @Test
+    public void shouldNotFailWithDependencyInReactory()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+        MavenProject mp2 = createProjectChild1( mp1 );
+
+        Dependency goodDependency = createDependency( "org.junit", "junit", "2.0" );
+        List<Dependency> depListMP2 = Arrays.asList( goodDependency );
+        when( mp2.getDependencies() ).thenReturn( depListMP2 );
+
+        MavenProject mp3 = createProjectChild2( mp1 );
+        Dependency dep1_MP3 = createDependency( "org.apache.commons", "commons-io", "1.0.4" );
+        List<Dependency> depListMP3 = Arrays.asList( dep1_MP3 );
+        when( mp3.getDependencies() ).thenReturn( depListMP3 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally no assertTrue() cause we do not expect to get an exception.
+        assertTrue( true );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void shouldFailWithWrongDependencyInReactor()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        MavenProject mp1 = createProjectParent();
+        MavenProject mp2 = createProjectChild1( mp1 );
+
+        Dependency goodDependency = createDependency( "org.junit", "junit", "2.0" );
+
+        Dependency wrongDepFromReactor = createDependency( "org.apache.enforcer", "m2", "1.1-SNAPSHOT" );
+        List<Dependency> depList = Arrays.asList( goodDependency, wrongDepFromReactor );
+        when( mp2.getDependencies() ).thenReturn( depList );
+
+        MavenProject mp3 = createProjectChild2( mp1 );
+
+        List<MavenProject> theList = Arrays.asList( mp1, mp2, mp3 );
+        when( session.getSortedProjects() ).thenReturn( theList );
+
+        rule.execute( helper );
+
+        //intentionally no assertTrue() cause we expect getting an exception.
+    }
+
+    /**
+     * This small setup is equivalent to the following situation:
+     * 
+     * <pre>
+     *  <parent>
+     *    <groupId>...</groupId>
+     *    <artifactId>...</artifactId>
+     *    <version>1.0-SNAPSHOT</version>
+     *  </parent>
+     *  
+     *  <version>1.1-SNAPSHOT</version>
+     * </pre>
+     * 
+     * @param parent
+     * @return Create MavenProject mock.
+     */
+    private MavenProject createProjectChild2WithWrongVersion( MavenProject parent )
+    {
+        MavenProject mp2 = mock( MavenProject.class );
+        when( mp2.getParent() ).thenReturn( parent );
+        when( mp2.getGroupId() ).thenReturn( "org.apache.enforcer" );
+        when( mp2.getArtifactId() ).thenReturn( "m1" );
+        when( mp2.getVersion() ).thenReturn( "1.1-SNAPSHOT" );
+        when( mp2.getId() ).thenReturn( "org.apache.enforcer:m1:jar:1.1-SNAPSHOT" );
+        when( mp2.getDependencies() ).thenReturn( Collections.<Dependency>emptyList() );
+        return mp2;
+    }
+
+    private MavenProject createProjectChild2( MavenProject parent )
+    {
+        MavenProject mp3 = mock( MavenProject.class );
+        when( mp3.getParent() ).thenReturn( parent );
+        when( mp3.getGroupId() ).thenReturn( "org.apache.enforcer" );
+        when( mp3.getArtifactId() ).thenReturn( "m2" );
+        when( mp3.getVersion() ).thenReturn( "1.0-SNAPSHOT" );
+        when( mp3.getId() ).thenReturn( "org.apache.enforcer:m2:jar:1.0-SNAPSHOT" );
+        when( mp3.getDependencies() ).thenReturn( Collections.<Dependency>emptyList() );
+        return mp3;
+    }
+
+    private MavenProject createProjectChild1( MavenProject parent )
+    {
+        MavenProject mp2 = mock( MavenProject.class );
+        when( mp2.getParent() ).thenReturn( parent );
+        when( mp2.getGroupId() ).thenReturn( "org.apache.enforcer" );
+        when( mp2.getArtifactId() ).thenReturn( "m1" );
+        when( mp2.getVersion() ).thenReturn( "1.0-SNAPSHOT" );
+        when( mp2.getId() ).thenReturn( "org.apache.enforcer:m1:jar:1.0-SNAPSHOT" );
+        when( mp2.getDependencies() ).thenReturn( Collections.<Dependency>emptyList() );
+        return mp2;
+    }
+
+    private MavenProject createCompanyParent()
+    {
+        MavenProject nonReactorParent = mock( MavenProject.class );
+        when( nonReactorParent.getGroupId() ).thenReturn("org.apache.enforcer.parent");
+        when( nonReactorParent.getArtifactId() ).thenReturn("parent");
+        when( nonReactorParent.getVersion() ).thenReturn( "1.1" );
+        when( nonReactorParent.getId() ).thenReturn("org.apache.enforcer.parent:parent:jar:1.1");
+        when( nonReactorParent.getDependencies() ).thenReturn(Collections.<Dependency>emptyList());
+        return nonReactorParent;
+    }
+
+    private MavenProject createProjectParent( MavenProject nonReactorParent )
+    {
+        MavenProject m = createProjectParent();
+        when( m.isExecutionRoot() ).thenReturn( true );
+        when( m.getParent() ).thenReturn( nonReactorParent );
+        return m;
+    }
+
+    private MavenProject createProjectParent()
+    {
+        MavenProject mp1 = mock( MavenProject.class );
+        when( mp1.isExecutionRoot() ).thenReturn( true );
+        when( mp1.getParent() ).thenReturn( null );
+        when( mp1.getGroupId() ).thenReturn( "org.apache.enforcer" );
+        when( mp1.getArtifactId() ).thenReturn( "parent" );
+        when( mp1.getVersion() ).thenReturn( "1.0-SNAPSHOT" );
+        when( mp1.getId() ).thenReturn( "org.apache.enforcer:parent:pom:1.0-SNAPSHOT" );
+        when( mp1.getDependencies() ).thenReturn( Collections.<Dependency>emptyList() );
+        return mp1;
+    }
+
+    private Dependency createDependency( String groupId, String artifactId, String version )
+    {
+        Dependency dep = mock( Dependency.class );
+        when( dep.getGroupId() ).thenReturn( groupId );
+        when( dep.getArtifactId() ).thenReturn( artifactId );
+        when( dep.getVersion() ).thenReturn( version );
+        return dep;
+    }
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireActiveProfileTest.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireActiveProfileTest.java
new file mode 100644
index 0000000..f6713c8
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireActiveProfileTest.java
@@ -0,0 +1,193 @@
+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 static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.model.Profile;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Check the profile rule.
+ *
+ * @author <a href="mailto:khmarbaise at apache.org">Karl Heinz Marbaise</a>
+ */
+public class RequireActiveProfileTest
+{
+    private MavenProject project;
+
+    private EnforcerRuleHelper helper;
+
+    private RequireActiveProfile rule;
+
+    @Before
+    public void before()
+        throws ExpressionEvaluationException
+    {
+        project = mock( MavenProject.class );
+        helper = mock( EnforcerRuleHelper.class );
+        when( helper.evaluate( "${project}" ) ).thenReturn( project );
+        rule = new RequireActiveProfile();
+    }
+
+    @Test
+    public void testNoActiveProfilesInProjectAndNoProfilesExpectedToBeActivated()
+        throws EnforcerRuleException
+    {
+        when( project.getActiveProfiles() ).thenReturn( Collections.<Profile> emptyList() );
+
+        rule.execute( helper );
+
+        assertTrue( true );
+    }
+
+    @Test
+    public void testActiveProfileAndExpectedActiveProfile()
+        throws EnforcerRuleException
+    {
+        List<Profile> profiles = Collections.<Profile> singletonList( createProfile( "profile-2" ) );
+
+        when( project.getActiveProfiles() ).thenReturn( profiles );
+
+        rule.setProfiles( "profile-2" );
+
+        rule.execute( helper );
+        assertTrue( true );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testNoActiveProfileButTheRuleRequestedAnActiveProfile()
+        throws EnforcerRuleException
+    {
+        when( project.getActiveProfiles() ).thenReturn( Collections.<Profile> emptyList() );
+
+        rule.setProfiles( "profile-2" );
+
+        rule.execute( helper );
+        // intentionally no assertTrue(...)
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testNoActiveProfileButWeExpectToGetAnExceptionWithAll()
+        throws EnforcerRuleException
+    {
+        when( project.getActiveProfiles() ).thenReturn( Collections.<Profile> emptyList() );
+
+        rule.setProfiles( "profile-2" );
+        rule.setAll( true );
+
+        rule.execute( helper );
+        // intentionally no assertTrue(...)
+    }
+
+    @Test
+    public void testTwoActiveProfilesWithOneRequiredProfile()
+        throws EnforcerRuleException
+    {
+        List<Profile> profiles = Arrays.asList( createProfile( "profile-1" ), createProfile( "profile-2" ) );
+
+        when( project.getActiveProfiles() ).thenReturn( profiles );
+
+        rule.setProfiles( "profile-2" );
+
+        rule.execute( helper );
+        assertTrue( true );
+    }
+
+    @Test
+    public void testTwoActiveProfilesWhereOneProfileIsRequiredToBeActivated()
+        throws EnforcerRuleException
+    {
+        List<Profile> profiles = Arrays.asList( createProfile( "profile-1" ), createProfile( "profile-2" ) );
+
+        when( project.getActiveProfiles() ).thenReturn( profiles );
+
+        rule.setProfiles( "profile-2" );
+        rule.setAll( true );
+
+        rule.execute( helper );
+        assertTrue( true );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testTwoActiveProfilesWithTwoRequiredProfilesWhereOneOfThemIsNotPartOfTheActiveProfiles()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+
+        List<Profile> profiles = Arrays.asList( createProfile( "profile-X" ), createProfile( "profile-Y" ) );
+
+        when( project.getActiveProfiles() ).thenReturn( profiles );
+
+        rule.setProfiles( "profile-Z,profile-X" );
+        rule.setAll( true );
+
+        rule.execute( helper );
+        // intentionally no assertTrue(..)
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testOneActiveProfilesWithTwoRequiredProfiles()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        List<Profile> profiles = Collections.singletonList( createProfile( "profile-X" ) );
+
+        when( project.getActiveProfiles() ).thenReturn( profiles );
+
+        rule.setProfiles( "profile-X,profile-Y" );
+        rule.setAll( true );
+
+        rule.execute( helper );
+        // intentionally no assertTrue(..)
+    }
+
+    @Test
+    public void testOneActiveProfileWithTwoProfilesButNotAll()
+        throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        List<Profile> profiles = Collections.singletonList( createProfile( "profile-X" ) );
+
+        when( project.getActiveProfiles() ).thenReturn( profiles );
+
+        rule.setProfiles( "profile-X,profile-Y" );
+        rule.setAll( false );
+
+        rule.execute( helper );
+        // intentionally no assertTrue(..)
+    }
+
+    private Profile createProfile( String profileId )
+    {
+        Profile p = new Profile();
+        p.setId( profileId );
+        return p;
+    }
+
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequirePrerequisiteTest.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequirePrerequisiteTest.java
new file mode 100644
index 0000000..dec1d73
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequirePrerequisiteTest.java
@@ -0,0 +1,165 @@
+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 static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.model.Prerequisites;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RequirePrerequisiteTest
+{
+    private MavenProject project;
+
+    private EnforcerRuleHelper helper;
+
+    @Before
+    public void before()
+        throws ExpressionEvaluationException
+    {
+        project = mock( MavenProject.class );
+        when( project.getPackaging() ).thenReturn( "maven-plugin" );
+
+        helper = mock( EnforcerRuleHelper.class );
+        when( helper.evaluate( "${project}" ) ).thenReturn( project );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testNoPrerequisite()
+        throws Exception
+    {
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.execute( helper );
+    }
+
+    @Test
+    public void testNoSpecifiedPrerequisite()
+        throws Exception
+    {
+        when( project.getPrerequisites() ).thenReturn( new Prerequisites() );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.execute( helper );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testLowerMavenPrerequisite()
+        throws Exception
+    {
+        when( project.getPrerequisites() ).thenReturn( new Prerequisites() );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.setMavenVersion( "3.0" );
+        rule.execute( helper );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testLowerMavenRangePrerequisite()
+        throws Exception
+    {
+        when( project.getPrerequisites() ).thenReturn( new Prerequisites() );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.setMavenVersion( "[3.0,)" );
+
+        rule.execute( helper );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testMavenRangesPrerequisite()
+        throws Exception
+    {
+        Prerequisites prerequisites = new Prerequisites();
+        prerequisites.setMaven( "2.2.0" );
+        when( project.getPrerequisites() ).thenReturn( prerequisites );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.setMavenVersion( "[2.0.6,2.1.0),(2.1.0,2.2.0),(2.2.0,)" );
+
+        rule.execute( helper );
+    }
+
+    @Test
+    public void testValidPrerequisite()
+        throws Exception
+    {
+        Prerequisites prerequisites = new Prerequisites();
+        prerequisites.setMaven( "3.0" );
+        when( project.getPrerequisites() ).thenReturn( prerequisites );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.setMavenVersion( "2.2.1" );
+
+        rule.execute( helper );
+    }
+
+    @Test
+    public void testPomPackaging()
+        throws Exception
+    {
+        when( project.getPackaging() ).thenReturn( "pom" );
+
+        Log log = mock( Log.class );
+        when( helper.getLog() ).thenReturn( log );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.execute( helper );
+
+        verify( log ).debug( "Packaging is pom, skipping requirePrerequisite rule" );
+    }
+
+    @Test( expected = EnforcerRuleException.class )
+    public void testMatchingPackagings()
+        throws Exception
+    {
+        when( project.getPackaging() ).thenReturn( "maven-plugin" );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.setPackagings( Collections.singletonList( "maven-plugin" ) );
+        rule.execute( helper );
+    }
+
+    @Test
+    public void testNotMatchingPackagings()
+        throws Exception
+    {
+        when( project.getPackaging() ).thenReturn( "jar" );
+
+        Log log = mock( Log.class );
+        when( helper.getLog() ).thenReturn( log );
+
+        RequirePrerequisite rule = new RequirePrerequisite();
+        rule.setPackagings( Collections.singletonList( "maven-plugin" ) );
+        rule.execute( helper );
+
+        verify( log ).debug( "Packaging is jar, skipping requirePrerequisite rule" );
+    }
+
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java
index 75f3919..06f2b55 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java
@@ -20,180 +20,293 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import java.io.IOException;
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
-import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
-import org.apache.maven.plugin.testing.ArtifactStubFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
+import org.junit.runner.RunWith;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class TestBannedDependencies.
- *
+ * 
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
  */
+ at RunWith( Enclosed.class )
 public class TestBannedDependencies
-    extends TestCase
 {
 
-    /**
-     * Test rule.
-     *
-     * @throws IOException Signals that an I/O exception has occurred.
-     */
-    public void testRule()
-        throws IOException
+    public static class ExcludesDoNotUseTransitiveDependencies
     {
-        ArtifactStubFactory factory = new ArtifactStubFactory();
-        MockProject project = new MockProject();
-        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
-        project.setArtifacts( factory.getMixedArtifacts() );
-        project.setDependencyArtifacts( factory.getScopedArtifacts() );
-        BannedDependencies rule = new BannedDependencies();
-
-        ArrayList excludes = new ArrayList();
-        rule.setSearchTransitive( false );
-
-        // test whole name
-        excludes.add( "testGroupId:release:1.0" );
-        rule.setExcludes( excludes );
-
-        execute( rule, helper, false );
-
-        // test group:artifact
-        excludes.clear();
-        excludes.add( "testGroupId:release" );
-        execute( rule, helper, false );
-
-        // test group
-        excludes.clear();
-        excludes.add( "testGroupId" );
-        execute( rule, helper, false );
-
-        // now check one that should be found in direct
-        // dependencies
-        excludes.clear();
-        excludes.add( "g:compile:1.0" );
-        execute( rule, helper, true );
-        rule.setSearchTransitive( true );
-
-        // whole name
-        excludes.clear();
-        excludes.add( "testGroupId:release:1.0" );
-        execute( rule, helper, true );
-
-        // group:artifact
-        excludes.clear();
-        excludes.add( "testGroupId:release" );
-        execute( rule, helper, true );
-
-        // group
-        excludes.clear();
-        excludes.add( "testGroupId" );
-        execute( rule, helper, true );
-
-        // now check wildcards
-        excludes.clear();
-        excludes.add( "*:release" );
-        execute( rule, helper, true );
-
-        // now check wildcards
-        excludes.clear();
-        excludes.add( "*:*:1.0" );
-        execute( rule, helper, true );
-
-        // now check wildcards
-        excludes.clear();
-        excludes.add( "*:release:*" );
-        execute( rule, helper, true );
-
-        // now check wildcards
-        excludes.clear();
-        excludes.add( "*:release:1.2" );
-        execute( rule, helper, false );
-
-        // now check multiple excludes
-        excludes.add( "*:release:*" );
-        execute( rule, helper, true );
-
-        // now check space trimming
-        excludes.clear();
-        excludes.add( "  testGroupId  :  release   :   1.0    " );
-        execute( rule, helper, true );
-
-        // now check weirdness
-        excludes.clear();
-        excludes.add( ":::" ); // null entry, won't match anything
-        execute( rule, helper, false );
+        private BannedDependenciesTestSetup setup;
+
+        @Before
+        public void beforeMethod()
+            throws IOException
+        {
+            this.setup = new BannedDependenciesTestSetup();
+            this.setup.setSearchTransitive( false );
+        }
+
+        private void addExcludeAndRunRule( String toAdd )
+            throws EnforcerRuleException
+        {
+            this.setup.addExcludeAndRunRule( toAdd );
+        }
+
+        @Test
+        public void testGroupIdArtifactIdVersion()
+            throws Exception
+        {
+            addExcludeAndRunRule( "testGroupId:release:1.0" );
+        }
+
+        @Test
+        public void testGroupIdArtifactId()
+            throws Exception
+        {
+            addExcludeAndRunRule( "testGroupId:release" );
+        }
+
+        @Test
+        public void testGroupId()
+            throws Exception
+        {
+            addExcludeAndRunRule( "testGroupId" );
+        }
+
+    }
+
+    public static class ExcludesUsingTransitiveDependencies
+    {
+
+        private BannedDependenciesTestSetup setup;
+
+        @Before
+        public void beforeMethod()
+            throws IOException
+        {
+            this.setup = new BannedDependenciesTestSetup();
+            this.setup.setSearchTransitive( true );
+        }
+
+        private void addExcludeAndRunRule( String toAdd )
+            throws EnforcerRuleException
+        {
+            this.setup.addExcludeAndRunRule( toAdd );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testGroupIdArtifactIdVersion()
+            throws Exception
+        {
+            addExcludeAndRunRule( "testGroupId:release:1.0" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testGroupIdArtifactId()
+            throws Exception
+        {
+            addExcludeAndRunRule( "testGroupId:release" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testGroupId()
+            throws Exception
+        {
+            addExcludeAndRunRule( "testGroupId" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testSpaceTrimmingGroupIdArtifactIdVersion()
+            throws Exception
+        {
+            addExcludeAndRunRule( "  testGroupId  :  release   :   1.0    " );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void groupIdArtifactIdVersionType()
+            throws Exception
+        {
+            addExcludeAndRunRule( "g:a:1.0:war" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void groupIdArtifactIdVersionTypeScope()
+            throws Exception
+        {
+            addExcludeAndRunRule( "g:a:1.0:war:compile" );
+        }
+
+        // @Test(expected = EnforcerRuleException.class)
+        // public void groupIdArtifactIdVersionTypeScopeClassifier() throws Exception {
+        // addExcludeAndRunRule("g:compile:1.0:jar:compile:one");
+        // }
+        //
+    }
+
+    public static class WildcardExcludesUsingTransitiveDependencies
+    {
+
+        private BannedDependenciesTestSetup setup;
+
+        @Before
+        public void beforeMethod()
+            throws IOException
+        {
+            this.setup = new BannedDependenciesTestSetup();
+            this.setup.setSearchTransitive( true );
+        }
+
+        private void addExcludeAndRunRule( String toAdd )
+            throws EnforcerRuleException
+        {
+            this.setup.addExcludeAndRunRule( toAdd );
+        }
+
+        @Test
+        public void testWildcardForGroupIdArtifactIdVersion()
+            throws Exception
+        {
+            addExcludeAndRunRule( "*:release:1.2" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testWildCardForGroupIdArtifactId()
+            throws Exception
+        {
+            addExcludeAndRunRule( "*:release" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testWildcardForGroupIdWildcardForArtifactIdVersion()
+            throws Exception
+        {
+            addExcludeAndRunRule( "*:*:1.0" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void testWildcardForGroupIdArtifactIdWildcardForVersion()
+            throws Exception
+        {
+            addExcludeAndRunRule( "*:release:*" );
+        }
+
     }
 
-    /**
-     * Test includes.
-     *
-     * @throws IOException Signals that an I/O exception has occurred.
-     */
-    public void testIncludes()
-        throws IOException
+    public static class PartialWildcardExcludesUsingTransitiveDependencies
     {
-        ArtifactStubFactory factory = new ArtifactStubFactory();
-        MockProject project = new MockProject();
-        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
-        project.setArtifacts( factory.getMixedArtifacts() );
-        project.setDependencyArtifacts( factory.getScopedArtifacts() );
-        BannedDependencies rule = new BannedDependencies();
 
-        ArrayList excludes = new ArrayList();
-        ArrayList includes = new ArrayList();
+        private BannedDependenciesTestSetup setup;
 
-        rule.setSearchTransitive( false );
+        @Before
+        public void beforeMethod()
+            throws IOException
+        {
+            this.setup = new BannedDependenciesTestSetup();
+            this.setup.setSearchTransitive( true );
+        }
 
-        excludes.add( "*" );
-        includes.add( "*" );
+        private void addExcludeAndRunRule( String toAdd )
+            throws EnforcerRuleException
+        {
+            this.setup.addExcludeAndRunRule( toAdd );
+        }
 
-        rule.setExcludes( excludes );
-        rule.setIncludes( includes );
+        @Test( expected = EnforcerRuleException.class )
+        public void groupIdArtifactIdWithWildcard()
+            throws EnforcerRuleException
+        {
+            addExcludeAndRunRule( "testGroupId:re*" );
+        }
 
-        execute( rule, helper, false );
+        @Test( expected = EnforcerRuleException.class )
+        public void groupIdArtifactIdVersionTypeWildcardScope()
+            throws EnforcerRuleException
+        {
+            addExcludeAndRunRule( "g:a:1.0:war:co*" );
+        }
 
-        excludes.clear();
-        excludes.add( "*:runtime" );
-        rule.setExcludes( excludes );
+        @Test( expected = EnforcerRuleException.class )
+        public void groupIdArtifactIdVersionWildcardTypeScope()
+            throws EnforcerRuleException
+        {
+            addExcludeAndRunRule( "g:a:1.0:w*:compile" );
+        }
+    }
+
+    public static class IllegalFormatsTests
+    {
+        private BannedDependenciesTestSetup setup;
 
-        execute( rule, helper, false );
+        @Before
+        public void beforeMethod()
+            throws IOException
+        {
+            this.setup = new BannedDependenciesTestSetup();
+            this.setup.setSearchTransitive( true );
+        }
+
+        private void addExcludeAndRunRule( String toAdd )
+            throws EnforcerRuleException
+        {
+            this.setup.addExcludeAndRunRule( toAdd );
+        }
+
+        @Test( expected = IllegalArgumentException.class )
+        public void onlyThreeColonsWithoutAnythingElse()
+            throws EnforcerRuleException
+        {
+            addExcludeAndRunRule( ":::" );
+        }
+
+        @Test( expected = IllegalArgumentException.class )
+        public void onlySevenColonsWithoutAnythingElse()
+            throws EnforcerRuleException
+        {
+            addExcludeAndRunRule( ":::::::" );
+        }
 
-        includes.clear();
-        includes.add( "*:test" );
-        rule.setIncludes( includes );
-        execute( rule, helper, true );
     }
 
-    /**
-     * Simpler wrapper to execute and deal with the expected result.
-     *
-     * @param rule the rule
-     * @param helper the helper
-     * @param shouldFail the should fail
-     */
-    private void execute( BannedDependencies rule, EnforcerRuleHelper helper, boolean shouldFail )
+    public static class IncludesExcludesNoTransitive
     {
-        try
+        private BannedDependenciesTestSetup setup;
+
+        @Before
+        public void beforeMethod()
+            throws IOException
         {
-            rule.message = null;
-            rule.execute( helper );
-            if ( shouldFail )
-            {
-                fail( "Exception expected." );
-            }
+            this.setup = new BannedDependenciesTestSetup();
+            this.setup.setSearchTransitive( false );
         }
-        catch ( EnforcerRuleException e )
+
+        private void addIncludeExcludeAndRunRule( String incAdd, String excAdd )
+            throws EnforcerRuleException
         {
-            if ( !shouldFail )
-            {
-                fail( "No Exception expected:" + e.getLocalizedMessage() );
-            }
-            // helper.getLog().debug(e.getMessage());
+            this.setup.addIncludeExcludeAndRunRule( incAdd, excAdd );
+        }
+
+        @Test
+        public void includeEverythingAndExcludeEverythign()
+            throws EnforcerRuleException
+        {
+            addIncludeExcludeAndRunRule( "*", "*" );
+        }
+
+        @Test
+        public void includeEverythingAndExcludeEveryGroupIdAndScopeRuntime()
+            throws EnforcerRuleException
+        {
+            addIncludeExcludeAndRunRule( "*", "*:runtime" );
+        }
+
+        @Test( expected = EnforcerRuleException.class )
+        public void includeEverythingAndExcludeEveryGroupIdAndScopeRuntimeYYYY()
+            throws EnforcerRuleException
+        {
+            addIncludeExcludeAndRunRule( "*:test", "*:runtime" );
         }
     }
+
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java
new file mode 100644
index 0000000..e27ee86
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java
@@ -0,0 +1,159 @@
+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.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.codehaus.plexus.PlexusTestCase;
+
+/**
+ * Test the "banned repositories" rule.
+ * 
+ * @author <a href="mailto:wangyf2010 at gmail.com">Simon Wang</a>
+ */
+public class TestBannedRepositories
+    extends PlexusTestCase
+{
+    private EnforcerRuleHelper helper;
+
+    private BannedRepositories rule;
+
+    private MockProject project;
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        rule = new BannedRepositories();
+        rule.setMessage( "my message" );
+
+        project = new MockProject();
+        project.setGroupId( "org.apache.maven.plugins.enforcer.test" );
+        project.setVersion( "1.0-SNAPSHOT" );
+
+        helper = EnforcerTestUtils.getHelper( project );
+    }
+
+    public void testNoCheckRules()
+        throws EnforcerRuleException
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( "repo1", "http://repo1/", null );
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        rule.execute( helper );
+    }
+
+    public void testBannedRepositories()
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( "repo1", "http://repo1/", null );
+        DefaultArtifactRepository repo2 = new DefaultArtifactRepository( "repo1", "http://repo1/test", null );
+        DefaultArtifactRepository repo3 = new DefaultArtifactRepository( "repo1", "http://repo2/test", null );
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+        repos.add( repo2 );
+        repos.add( repo3 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        List<String> bannedRepositories = new ArrayList<String>();
+        String pattern1 = "http://repo1/*";
+
+        bannedRepositories.add( pattern1 );
+
+        rule.setBannedRepositories( bannedRepositories );
+
+        try
+        {
+            rule.execute( helper );
+            fail( "should throw exception" );
+        }
+        catch ( EnforcerRuleException e )
+        {
+        }
+
+    }
+
+    public void testAllowedRepositoriesAllOK()
+        throws EnforcerRuleException
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( "repo1", "http://repo1/", null );
+        DefaultArtifactRepository repo2 = new DefaultArtifactRepository( "repo1", "http://repo1/test", null );
+
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+        repos.add( repo2 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        List<String> bannedRepositories = new ArrayList<String>();
+        String pattern1 = "http://repo1/*";
+
+        bannedRepositories.add( pattern1 );
+
+        rule.setAllowedRepositories( bannedRepositories );
+        rule.setAllowedPluginRepositories( bannedRepositories );
+
+        rule.execute( helper );
+    }
+
+    public void testAllowedRepositoriesException()
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( "repo1", "http://repo1/", null );
+        DefaultArtifactRepository repo2 = new DefaultArtifactRepository( "repo1", "http://repo1/test", null );
+        DefaultArtifactRepository repo3 = new DefaultArtifactRepository( "repo1", "http://repo2/test", null );
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+        repos.add( repo2 );
+        repos.add( repo3 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        List<String> patterns = new ArrayList<String>();
+        String pattern1 = "http://repo1/*";
+
+        patterns.add( pattern1 );
+
+        rule.setAllowedPluginRepositories( patterns );
+        rule.setAllowedRepositories( patterns );
+
+        try
+        {
+            rule.execute( helper );
+            fail( "should throw exception" );
+        }
+        catch ( EnforcerRuleException e )
+        {
+        }
+
+    }
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestEvaluateBeanshell.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestEvaluateBeanshell.java
index ab65511..7f8faa7 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestEvaluateBeanshell.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestEvaluateBeanshell.java
@@ -20,12 +20,11 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import junit.framework.TestCase;
-
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.easymock.MockControl;
+import static org.mockito.Mockito.*;
 
 /**
  * The Class TestEvaluateBeanshell.
@@ -51,8 +50,8 @@ public class TestEvaluateBeanshell
     {
         EvaluateBeanshell rule = new EvaluateBeanshell();
         // this property should not be set
-        rule.condition = "${env} == \"This is a test.\"";
-        rule.message = "We have a variable : ${env}";
+        rule.setCondition( "${env} == \"This is a test.\"" );
+        rule.setMessage( "We have a variable : ${env}" );
 
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
         rule.execute( helper );
@@ -64,8 +63,8 @@ public class TestEvaluateBeanshell
         EvaluateBeanshell rule = new EvaluateBeanshell();
         // this property should be set by the surefire
         // plugin
-        rule.condition = "${env} == null";
-        rule.message = "We have a variable : ${env}";
+        rule.setCondition( "${env} == null" );
+        rule.setMessage( "We have a variable : ${env}" );
 
         try
         {
@@ -75,7 +74,7 @@ public class TestEvaluateBeanshell
         }
         catch ( EnforcerRuleException e )
         {
-            assertEquals( e.getLocalizedMessage(), rule.message );
+            assertEquals( e.getLocalizedMessage(), rule.getMessage() );
         }
     }
 
@@ -85,7 +84,7 @@ public class TestEvaluateBeanshell
         EvaluateBeanshell rule = new EvaluateBeanshell();
         // this property should be set by the surefire
         // plugin
-        rule.condition = "${env} == null";
+        rule.setCondition( "${env} == null" );
         try
         {
             EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
@@ -94,7 +93,7 @@ public class TestEvaluateBeanshell
         }
         catch ( EnforcerRuleException e )
         {
-            assertEquals( e.getLocalizedMessage(), rule.message );
+            assertEquals( e.getLocalizedMessage(), "The expression \"${env} == null\" is not true." );
             assertTrue( e.getLocalizedMessage().length() > 0 );
         }
     }
@@ -103,34 +102,29 @@ public class TestEvaluateBeanshell
         throws EnforcerRuleException, ExpressionEvaluationException
     {
         EvaluateBeanshell rule = new EvaluateBeanshell();
-        rule.condition = "${env} == null";
-        rule.message = "We have a variable : ${env}";
-        MockControl evalControl = MockControl.createControl( ExpressionEvaluator.class );
+        rule.setCondition( "${env} == null" );
+        rule.setMessage( "We have a variable : ${env}" );
+
+        ExpressionEvaluator eval = mock( ExpressionEvaluator.class );
+        when( eval.evaluate( rule.getCondition() ) ).thenThrow( new ExpressionEvaluationException( "expected error" ) );
         try
         {
-            ExpressionEvaluator eval = (ExpressionEvaluator) evalControl.getMock();
-            eval.evaluate( rule.condition );
-            evalControl.expectAndDefaultThrow( null, new ExpressionEvaluationException( "expected error" ) );
-            evalControl.replay();
-
             EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project, eval );
             rule.execute( helper );
             fail( "Expected an exception." );
         }
         catch ( EnforcerRuleException e )
         {
-            assertFalse( e.getLocalizedMessage().equals( rule.message ) );
+            assertFalse( e.getLocalizedMessage().equals( rule.getMessage() ) );
         }
-
-        evalControl.verify();
     }
 
     public void testRuleInvalidBeanshell()
         throws EnforcerRuleException, ExpressionEvaluationException
     {
         EvaluateBeanshell rule = new EvaluateBeanshell();
-        rule.condition = "this is not valid beanshell";
-        rule.message = "We have a variable : ${env}";
+        rule.setCondition( "this is not valid beanshell" );
+        rule.setMessage( "We have a variable : ${env}" );
         try
         {
             EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
@@ -139,7 +133,7 @@ public class TestEvaluateBeanshell
         }
         catch ( EnforcerRuleException e )
         {
-            assertFalse( e.getLocalizedMessage().equals( rule.message ) );
+            assertFalse( e.getLocalizedMessage().equals( rule.getMessage() ) );
         }
     }
 }
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 627f801..343b5bc 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
@@ -19,13 +19,12 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import junit.framework.TestCase;
-
-import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang3.SystemUtils;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 
-// TODO: Auto-generated Javadoc
+import junit.framework.TestCase;
+
 /**
  * The Class TestMavenVersion.
  *
@@ -66,7 +65,7 @@ public class TestMavenVersion
         }
 
         // this shouldn't crash
-        rule.setVersion( SystemUtils.JAVA_VERSION_TRIMMED );
+        rule.setVersion( SystemUtils.JAVA_VERSION );
         rule.execute( helper );
 
     }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java
index e6d5670..296c267 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java
@@ -20,12 +20,15 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import java.io.IOException;
+import java.util.Set;
 
 import junit.framework.TestCase;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.apache.maven.plugin.testing.ArtifactStubFactory;
 import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
+import org.apache.maven.project.MavenProject;
 
 /**
  * The Class TestNoSnapshots.
@@ -50,7 +53,7 @@ public class TestNoSnapshots
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
         project.setArtifacts( factory.getMixedArtifacts() );
         project.setDependencyArtifacts( factory.getScopedArtifacts() );
-        NoSnapshots rule = new NoSnapshots();
+        NoSnapshots rule = newNoSnapshots();
         rule.setSearchTransitive( false );
 
         TestEnforcerRuleUtils.execute( rule, helper, false );
@@ -64,12 +67,26 @@ public class TestNoSnapshots
         TestEnforcerRuleUtils.execute( rule, helper, true );
     }
 
+    private NoSnapshots newNoSnapshots()
+    {
+        NoSnapshots rule = new NoSnapshots()
+        {
+            protected Set<Artifact> getDependenciesToCheck( MavenProject project )
+            {
+                // the integration with dependencyGraphTree is verified with the integration tests
+                // for unit-testing 
+                return isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts();
+            }
+        };
+        return rule;
+    }
+
     /**
      * Test id.
      */
     public void testId()
     {
-        NoSnapshots rule = new NoSnapshots();
+        NoSnapshots rule = newNoSnapshots();
         rule.getCacheId();
     }
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireEnvironmentVariable.java
old mode 100644
new mode 100755
similarity index 75%
copy from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
copy to enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireEnvironmentVariable.java
index e20fe6f..27ba381
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireEnvironmentVariable.java
@@ -20,17 +20,15 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import junit.framework.TestCase;
-
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 
-// TODO: Auto-generated Javadoc
 /**
- * The Class TestRequireProperty.
+ * Unit test for {@link RequireEnvironmentVariable}}
  *
- * @author Paul Gier
+ * @author <a href='mailto:marvin[at]marvinformatics[dot]com'>Marvin Froeder</a>
  */
-public class TestRequireProperty
+public class TestRequireEnvironmentVariable
     extends TestCase
 {
 
@@ -46,9 +44,9 @@ public class TestRequireProperty
         project.setProperty( "testProp", "This is a test." );
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
 
-        RequireProperty rule = new RequireProperty();
-        // this property should not be set
-        rule.property = "testPropJunk";
+        RequireEnvironmentVariable rule = new RequireEnvironmentVariable();
+        // this env variable should not be set
+        rule.setVariableName( "JUNK" );
 
         try
         {
@@ -60,9 +58,8 @@ public class TestRequireProperty
             // expected to catch this.
         }
 
-        // this property should be set by the surefire
-        // plugin
-        rule.property = "testProp";
+        // PATH shall be common to windows and linux
+        rule.setVariableName( "PATH" );
         try
         {
             rule.execute( helper );
@@ -81,15 +78,13 @@ public class TestRequireProperty
     public void testRuleWithRegex()
         throws EnforcerRuleException
     {
-        MockProject project = new MockProject();
-        project.setProperty( "testProp", "This is a test." );
-        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
 
-        RequireProperty rule = new RequireProperty();
-        rule.property = "testProp";
+        RequireEnvironmentVariable rule = new RequireEnvironmentVariable();
+        rule.setVariableName( "PATH" );
         // This expression should not match the property
         // value
-        rule.regex = "[^abc]";
+        rule.setRegex( "[^abc]" );
 
         try
         {
@@ -101,8 +96,8 @@ public class TestRequireProperty
             // expected to catch this.
         }
 
-        // this expr should match the property
-        rule.regex = "[This].*[.]";
+        // can't really predict what a PATH will looks like, just enforce it ain't empty
+        rule.setRegex( ".{1,}" );
         try
         {
             rule.execute( helper );
@@ -113,12 +108,4 @@ public class TestRequireProperty
         }
     }
 
-    /**
-     * Test id.
-     */
-    public void testId()
-    {
-        RequireProperty rule = new RequireProperty();
-        rule.getCacheId();
-    }
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFileChecksum.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFileChecksum.java
new file mode 100644
index 0000000..4333cb3
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFileChecksum.java
@@ -0,0 +1,233 @@
+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.IOException;
+
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.codehaus.plexus.util.FileUtils;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TemporaryFolder;
+
+/**
+ * Test the "RequireFileChecksum" rule
+ *
+ * @author Lyubomyr Shaydariv
+ */
+public class TestRequireFileChecksum
+{
+
+    private RequireFileChecksum rule = new RequireFileChecksum();
+
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void testFileChecksumMd5()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        rule.setFile( f );
+        rule.setChecksum( "78e731027d8fd50ed642340b7c9a63b3" );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5UpperCase()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        rule.setFile( f );
+        rule.setChecksum( "78E731027D8FD50ED642340B7C9A63B3" );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5NoFileFailure()
+        throws IOException, EnforcerRuleException
+    {
+        File f = new File( "foo" )
+        {
+            private static final long serialVersionUID = 6987790643999338089L;
+
+            @Override
+            public boolean canRead()
+            {
+                return false;
+            }
+        };
+
+        expectedException.expect( EnforcerRuleException.class );
+        expectedException.expectMessage( "Cannot read file: " + f.getAbsolutePath() );
+
+        rule.setFile( f );
+        rule.setChecksum( "78e731027d8fd50ed642340b7c9a63b3" );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5GivenFileIsADirectoryFailure()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFolder();
+
+        expectedException.expect( EnforcerRuleException.class );
+        expectedException.expectMessage( "Cannot read file: " + f.getAbsolutePath() );
+
+        rule.setFile( f );
+        rule.setChecksum( "78e731027d8fd50ed642340b7c9a63b3" );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5NoFileSpecifiedFailure()
+        throws IOException, EnforcerRuleException
+    {
+        expectedException.expect( EnforcerRuleException.class );
+        expectedException.expectMessage( "Input file unspecified" );
+
+        rule.setChecksum( "78e731027d8fd50ed642340b7c9a63b3" );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5NoChecksumSpecifiedFailure()
+        throws IOException, EnforcerRuleException
+    {
+        expectedException.expect( EnforcerRuleException.class );
+        expectedException.expectMessage( "Checksum unspecified" );
+
+        File f = temporaryFolder.newFile();
+
+        rule.setFile( f );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5NoTypeSpecifiedFailure()
+        throws IOException, EnforcerRuleException
+    {
+        expectedException.expect( EnforcerRuleException.class );
+        expectedException.expectMessage( "Hash type unspecified" );
+
+        File f = temporaryFolder.newFile();
+
+        rule.setFile( f );
+        rule.setChecksum( "78e731027d8fd50ed642340b7c9a63b3" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumMd5ChecksumMismatchFailure()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        expectedException.expect( EnforcerRuleException.class );
+        expectedException.expectMessage( "md5 hash of " + f.getAbsolutePath()
+            + " was 78e731027d8fd50ed642340b7c9a63b3 but expected ffeeddccbbaa99887766554433221100" );
+
+        rule.setFile( f );
+        rule.setChecksum( "ffeeddccbbaa99887766554433221100" );
+        rule.setType( "md5" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumSha1()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        rule.setFile( f );
+        rule.setChecksum( "6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d" );
+        rule.setType( "sha1" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumSha256()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        rule.setFile( f );
+        rule.setChecksum( "ab530a13e45914982b79f9b7e3fba994cfd1f3fb22f71cea1afbf02b460c6d1d" );
+        rule.setType( "sha256" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumSha384()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        rule.setFile( f );
+        rule.setChecksum( "353eb7516a27ef92e96d1a319712d84b902eaa828819e53a8b09af7028103a9978ba8feb6161e33c3619c5da4c4666a5" );
+        rule.setType( "sha384" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+
+    @Test
+    public void testFileChecksumSha512()
+        throws IOException, EnforcerRuleException
+    {
+        File f = temporaryFolder.newFile();
+        FileUtils.fileWrite( f, "message" );
+
+        rule.setFile( f );
+        rule.setChecksum( "f8daf57a3347cc4d6b9d575b31fe6077e2cb487f60a96233c08cb479dbf31538cc915ec6d48bdbaa96ddc1a16db4f4f96f37276cfcb3510b8246241770d5952c" );
+        rule.setType( "sha512" );
+
+        rule.execute( EnforcerTestUtils.getHelper() );
+    }
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java
index ad2308c..22287a4 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java
@@ -42,7 +42,7 @@ public class TestRequireFilesDontExist
         File f = File.createTempFile( "enforcer", "tmp" );
         f.deleteOnExit();
 
-        rule.files = new File[] { f };
+        rule.setFiles( new File[] { f } );
 
         try
         {
@@ -59,7 +59,7 @@ public class TestRequireFilesDontExist
     public void testEmptyFile()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] { null };
+        rule.setFiles( new File[] { null } );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -74,8 +74,8 @@ public class TestRequireFilesDontExist
     public void testEmptyFileAllowNull()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] { null };
-        rule.allowNulls = true;
+        rule.setFiles( new File[] { null } );
+        rule.setAllowNulls( true );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -89,8 +89,8 @@ public class TestRequireFilesDontExist
     public void testEmptyFileList()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] {};
-        assertEquals( 0, rule.files.length );
+        rule.setFiles( new File[] {} );
+        assertEquals( 0, rule.getFiles().length );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -105,9 +105,9 @@ public class TestRequireFilesDontExist
     public void testEmptyFileListAllowNull()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] {};
-        assertEquals( 0, rule.files.length );
-        rule.allowNulls = true;
+        rule.setFiles( new File[] {} );
+        assertEquals( 0, rule.getFiles().length );
+        rule.setAllowNulls( true );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -126,7 +126,7 @@ public class TestRequireFilesDontExist
 
         assertTrue( !f.exists() );
 
-        rule.files = new File[] { f };
+        rule.setFiles( new File[] { f } );
 
         rule.execute( EnforcerTestUtils.getHelper() );
     }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java
index b9842c6..b05a4fb 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java
@@ -42,7 +42,7 @@ public class TestRequireFilesExist
         File f = File.createTempFile( "enforcer", "tmp" );
         f.deleteOnExit();
 
-        rule.files = new File[] { f };
+        rule.setFiles( new File[] { f } );
 
         rule.execute( EnforcerTestUtils.getHelper() );
 
@@ -52,7 +52,7 @@ public class TestRequireFilesExist
     public void testEmptyFile()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] { null };
+        rule.setFiles( new File[] { null } );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -67,8 +67,8 @@ public class TestRequireFilesExist
     public void testEmptyFileAllowNull()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] { null };
-        rule.allowNulls = true;
+        rule.setFiles( new File[] { null } );
+        rule.setAllowNulls( true );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -82,8 +82,8 @@ public class TestRequireFilesExist
     public void testEmptyFileList()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] {};
-        assertEquals(0,rule.files.length);
+        rule.setFiles( new File[] {} );
+        assertEquals( 0, rule.getFiles().length );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -98,9 +98,9 @@ public class TestRequireFilesExist
     public void testEmptyFileListAllowNull()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] {};
-        assertEquals(0,rule.files.length);
-        rule.allowNulls = true;
+        rule.setFiles( new File[] {} );
+        assertEquals( 0, rule.getFiles().length );
+        rule.setAllowNulls( true );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -116,8 +116,8 @@ public class TestRequireFilesExist
     {
         File f = File.createTempFile( "enforcer", "tmp" );
         f.delete();
-        assertTrue(!f.exists());
-        rule.files = new File[] { f };
+        assertTrue( !f.exists() );
+        rule.setFiles( new File[] { f } );
 
         try
         {
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java
index eac3c98..93996cf 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java
@@ -46,7 +46,7 @@ public class TestRequireFilesSize
         File f = File.createTempFile( "enforcer", "tmp" );
         f.deleteOnExit();
 
-        rule.files = new File[] { f };
+        rule.setFiles( new File[] { f } );
 
         rule.execute( EnforcerTestUtils.getHelper() );
 
@@ -56,7 +56,7 @@ public class TestRequireFilesSize
     public void testEmptyFile()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] { null };
+        rule.setFiles( new File[] { null } );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -71,8 +71,8 @@ public class TestRequireFilesSize
     public void testEmptyFileAllowNull()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] { null };
-        rule.allowNulls = true;
+        rule.setFiles( new File[] { null } );
+        rule.setAllowNulls( true );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -86,9 +86,9 @@ public class TestRequireFilesSize
     public void testEmptyFileList()
         throws EnforcerRuleException, IOException
     {
-        rule.files = new File[] {};
+        rule.setFiles( new File[] {} );
 
-        assertEquals( 0, rule.files.length );
+        assertEquals( 0, rule.getFiles().length );
 
         MockProject project = new MockProject();
         File f = File.createTempFile( "enforcer", "tmp" );
@@ -97,12 +97,12 @@ public class TestRequireFilesSize
         Artifact a = factory.getReleaseArtifact();
         a.setFile( f );
 
-        project.setArtifact(a);
+        project.setArtifact( a );
 
         // sanity check the mockProject
         assertSame( f, project.getArtifact().getFile() );
 
-        rule.execute( EnforcerTestUtils.getHelper(project) );
+        rule.execute( EnforcerTestUtils.getHelper( project ) );
 
     }
 
@@ -112,7 +112,7 @@ public class TestRequireFilesSize
         File f = File.createTempFile( "enforcer", "tmp" );
         f.delete();
         assertTrue( !f.exists() );
-        rule.files = new File[] { f };
+        rule.setFiles( new File[] { f } );
 
         try
         {
@@ -130,8 +130,8 @@ public class TestRequireFilesSize
     {
         File f = File.createTempFile( "enforcer", "tmp" );
         f.deleteOnExit();
-        rule.files = new File[] { f };
-        rule.minsize = 10;
+        rule.setFiles( new File[] { f } );
+        rule.setMinsize( 10 );
         try
         {
             rule.execute( EnforcerTestUtils.getHelper() );
@@ -163,8 +163,8 @@ public class TestRequireFilesSize
             System.err.println( "Error: " + e.getMessage() );
         }
 
-        rule.files = new File[] { f };
-        rule.maxsize = 10;
+        rule.setFiles( new File[] { f } );
+        rule.setMaxsize( 10 );
         assertTrue( f.length() > 10 );
         try
         {
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java
index f0c756a..368df70 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java
@@ -19,45 +19,48 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import junit.framework.TestCase;
+import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang3.SystemUtils;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.junit.Ignore;
+import org.junit.Test;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class TestRequireJavaVersion.
  *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
  */
 public class TestRequireJavaVersion
-    extends TestCase
 {
 
     /**
      * Test fix jdk version.
      */
+    @Test
     public void testFixJDKVersion()
     {
         // test that we only take the first 3 versions for
-        // comparision
-        assertEquals( "1.5.0-11", RequireJavaVersion.normalizeJDKVersion( "1.5.0_11" ) );
-        assertEquals( "1.5.1", RequireJavaVersion.normalizeJDKVersion( "1.5.1" ) );
-        assertEquals( "1.5.2-1", RequireJavaVersion.normalizeJDKVersion( "1.5.2-1.b11" ) );
-        assertEquals( "1.5.3-11", RequireJavaVersion.normalizeJDKVersion( "1.5.3_11" ) );
-        assertEquals( "1.5.4-5", RequireJavaVersion.normalizeJDKVersion( "1.5.4.5_11" ) );
-        assertEquals( "1.5.5-6", RequireJavaVersion.normalizeJDKVersion( "1.5.5.6_11.2" ) );
+        // comparison
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.0_11" ) ).isEqualTo( "1.5.0-11" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.1" ) ).isEqualTo( "1.5.1" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.2-1.b11" ) ).isEqualTo( "1.5.2-1" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.3_11" ) ).isEqualTo( "1.5.3-11" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.4.5_11" ) ).isEqualTo( "1.5.4-5" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.5.6_11.2" ) ).isEqualTo( "1.5.5-6" );
 
         // test for non-standard versions
-        assertEquals( "1.5.0-11", RequireJavaVersion.normalizeJDKVersion( "1-5-0-11" ) );
-        assertEquals( "1.5.0-11", RequireJavaVersion.normalizeJDKVersion( "1-_5-_0-_11" ) );
-        assertEquals( "1.5.0-11", RequireJavaVersion.normalizeJDKVersion( "1_5_0_11" ) );
-        assertEquals( "1.5.0-7", RequireJavaVersion.normalizeJDKVersion( "1.5.0-07" ) );
-        assertEquals( "1.5.0-7", RequireJavaVersion.normalizeJDKVersion( "1.5.0-b7" ) );
-        assertEquals( "1.5.0-7", RequireJavaVersion.normalizeJDKVersion( "1.5.0-;7" ) );
-        assertEquals( "1.6.0", RequireJavaVersion.normalizeJDKVersion( "1.6.0-dp" ) );
-        assertEquals( "1.6.0-2", RequireJavaVersion.normalizeJDKVersion( "1.6.0-dp2" ) );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1-5-0-11" ) ).isEqualTo( "1.5.0-11" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1-_5-_0-_11" ) ).isEqualTo( "1.5.0-11" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1_5_0_11" ) ).isEqualTo( "1.5.0-11" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.0-07" ) ).isEqualTo( "1.5.0-7" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.0-b7" ) ).isEqualTo( "1.5.0-7" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.5.0-;7" ) ).isEqualTo( "1.5.0-7" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.6.0-dp" ) ).isEqualTo( "1.6.0" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.6.0-dp2" ) ).isEqualTo( "1.6.0-2" );
+        assertThat( RequireJavaVersion.normalizeJDKVersion( "1.8.0_73" ) ).isEqualTo( "1.8.0-73" );
+
     }
 
     /**
@@ -65,44 +68,58 @@ public class TestRequireJavaVersion
      *
      * @throws EnforcerRuleException the enforcer rule exception
      */
-    public void testRule()
+    @Test
+    public void settingsTheJavaVersionAsNormalizedVersionShouldNotFail()
         throws EnforcerRuleException
     {
-        String thisVersion = RequireJavaVersion.normalizeJDKVersion( SystemUtils.JAVA_VERSION_TRIMMED );
+        String normalizedJDKVersion = RequireJavaVersion.normalizeJDKVersion( SystemUtils.JAVA_VERSION );
 
         RequireJavaVersion rule = new RequireJavaVersion();
-        rule.setVersion( thisVersion );
+        rule.setVersion( normalizedJDKVersion );
 
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
 
         // test the singular version
         rule.execute( helper );
+        // intentionally no assertThat(...) because we don't expect and exception.
+    }
 
+    @Test( expected = EnforcerRuleException.class )
+    public void excludingTheCurrentJavaVersionViaRangeThisShouldFailWithException()
+        throws EnforcerRuleException
+    {
+        String thisVersion = RequireJavaVersion.normalizeJDKVersion( SystemUtils.JAVA_VERSION );
+
+        RequireJavaVersion rule = new RequireJavaVersion();
         // exclude this version
         rule.setVersion( "(" + thisVersion );
 
-        try
-        {
-            rule.execute( helper );
-            fail( "Expected an exception." );
-        }
-        catch ( EnforcerRuleException e )
-        {
-            // expected to catch this.
-        }
-
-        // this shouldn't crash
-        rule.setVersion( SystemUtils.JAVA_VERSION_TRIMMED );
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
         rule.execute( helper );
+        // intentionally no assertThat(...) because we expect and exception.
+    }
 
+    @Test
+    @Ignore
+    // TODO: Think about the intention of this test? What should it prove?
+    public void thisShouldNotCrash()
+        throws EnforcerRuleException
+    {
+        RequireJavaVersion rule = new RequireJavaVersion();
+        rule.setVersion( SystemUtils.JAVA_VERSION );
+
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
+        rule.execute( helper );
+        // intentionally no assertThat(...) because we don't expect and exception.
     }
 
     /**
      * Test id.
      */
+    @Test
     public void testId()
     {
         RequireJavaVersion rule = new RequireJavaVersion();
-        rule.getCacheId();
+        assertThat( rule.getCacheId() ).isEqualTo( "0" );
     }
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java
index 884ce0a..9b6ac8b 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java
@@ -45,7 +45,7 @@ public class TestRequireNoRepositories
         super.setUp();
 
         rule = new RequireNoRepositories();
-        rule.message = "my message";
+        rule.setMessage( "my message" );
 
         project = new MockProject();
         project.setGroupId( "org.apache.maven.plugins.enforcer.test" );
@@ -83,7 +83,7 @@ public class TestRequireNoRepositories
     public void testAllBannedWithAllowedRepositories()
         throws EnforcerRuleException
     {
-        rule.allowedRepositories = Collections.singletonList( "repo" );
+        rule.setAllowedRepositories( Collections.singletonList( "repo" ) );
 
         project.setArtifactId( "with-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/with-repositories/child" ) );
@@ -94,7 +94,7 @@ public class TestRequireNoRepositories
     public void testAllBannedWithAllowedPluginRepositories()
         throws EnforcerRuleException
     {
-        rule.allowedPluginRepositories = Collections.singletonList( "repo" );
+        rule.setAllowedPluginRepositories( Collections.singletonList( "repo" ) );
 
         project.setArtifactId( "with-plugin-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/with-plugin-repositories/child" ) );
@@ -105,7 +105,7 @@ public class TestRequireNoRepositories
     public void testReposNotBannedNoRepositories()
         throws EnforcerRuleException
     {
-        rule.banRepositories = false;
+        rule.setBanRepositories( false );
 
         project.setArtifactId( "no-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/no-repositories/child" ) );
@@ -116,7 +116,7 @@ public class TestRequireNoRepositories
     public void testReposNotBannedWithRepositories()
         throws EnforcerRuleException
     {
-        rule.banRepositories = false;
+        rule.setBanRepositories( false );
 
         project.setArtifactId( "with-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/with-repositories/child" ) );
@@ -127,7 +127,7 @@ public class TestRequireNoRepositories
     public void testReposNotBannedWithPluginRepositories()
         throws EnforcerRuleException
     {
-        rule.banRepositories = false;
+        rule.setBanRepositories( false );
 
         project.setArtifactId( "with-plugin-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/with-plugin-repositories/child" ) );
@@ -146,7 +146,7 @@ public class TestRequireNoRepositories
     public void testPluginReposNotBannedNoRepositories()
         throws EnforcerRuleException
     {
-        rule.banPluginRepositories = false;
+        rule.setBanPluginRepositories( false );
 
         project.setArtifactId( "no-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/no-repositories/child" ) );
@@ -157,7 +157,7 @@ public class TestRequireNoRepositories
     public void testPluginReposNotBannedWithRepositories()
         throws EnforcerRuleException
     {
-        rule.banPluginRepositories = false;
+        rule.setBanPluginRepositories( false );
 
         project.setArtifactId( "with-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/with-repositories/child" ) );
@@ -176,7 +176,7 @@ public class TestRequireNoRepositories
     public void testPluginReposNotBannedWithPluginRepositories()
         throws EnforcerRuleException
     {
-        rule.banPluginRepositories = false;
+        rule.setBanPluginRepositories( false );
 
         project.setArtifactId( "with-plugin-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/with-plugin-repositories/child" ) );
@@ -187,7 +187,7 @@ public class TestRequireNoRepositories
     public void testReposNotAllowedWithSnapshotRepositories()
         throws EnforcerRuleException
     {
-        rule.allowSnapshotRepositories = true;
+        rule.setAllowSnapshotRepositories( true );
 
         project.setArtifactId( "snapshot-plugin-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/snapshot-plugin-repositories/child" ) );
@@ -206,7 +206,7 @@ public class TestRequireNoRepositories
     public void testReposAllowedWithSnapshotRepositories()
         throws EnforcerRuleException
     {
-        rule.allowSnapshotRepositories = true;
+        rule.setAllowSnapshotRepositories( true );
 
         project.setArtifactId( "snapshot-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/snapshot-repositories/child" ) );
@@ -217,7 +217,7 @@ public class TestRequireNoRepositories
     public void testPluginReposNotAllowedWithSnapshotRepositories()
         throws EnforcerRuleException
     {
-        rule.allowSnapshotPluginRepositories = true;
+        rule.setAllowSnapshotPluginRepositories( true );
 
         project.setArtifactId( "snapshot-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/snapshot-repositories/child" ) );
@@ -236,7 +236,7 @@ public class TestRequireNoRepositories
     public void testPluginReposAllowedWithSnapshotPluginRepositories()
         throws EnforcerRuleException
     {
-        rule.allowSnapshotPluginRepositories = true;
+        rule.setAllowSnapshotPluginRepositories( true );
 
         project.setArtifactId( "snapshot-plugin-repositories-child" );
         project.setBaseDir( getTestFile( "target/test-classes/requireNoRepositories/snapshot-plugin-repositories/child" ) );
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java
index 63b3c07..65d1abd 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java
@@ -28,7 +28,6 @@ import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.logging.SystemStreamLog;
 import org.codehaus.plexus.util.Os;
 
-// TODO: Auto-generated Javadoc
 /**
  * Exhaustively check the OS mojo.
  *
@@ -48,7 +47,7 @@ public class TestRequireOS
         RequireOS rule = new RequireOS();
         rule.displayOSInfo( log, true );
 
-        Iterator iter = Os.getValidFamilies().iterator();
+        Iterator<String> iter = Os.getValidFamilies().iterator();
         String validFamily = null;
         String invalidFamily = null;
         while ( iter.hasNext() )
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java
index 832d278..cd74480 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java
@@ -63,7 +63,7 @@ public class TestRequirePluginVersions
         // searched for versions before giving up.
         // banLatest/Release will fail if it is found
         // anywhere in the list
-        List plugins = new ArrayList();
+        List<Plugin> plugins = new ArrayList<Plugin>();
         plugins.add( EnforcerTestUtils.newPlugin( "group", "a-artifact", "1.0" ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "foo", null ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "foo", "" ) );
@@ -81,7 +81,7 @@ public class TestRequirePluginVersions
         plugins.add( EnforcerTestUtils.newPlugin( "group", "g-artifact", "1.0-12345678.123456-1" ) );
 
 
-        plugins = PluginWrapper.addAll( plugins, "unit" );
+        List<PluginWrapper> pluginWrappers = PluginWrapper.addAll( plugins, "unit" );
 
         RequirePluginVersions rule = new RequirePluginVersions();
         rule.setBanLatest( false );
@@ -90,41 +90,41 @@ public class TestRequirePluginVersions
 
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
 
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that LATEST is allowed
         source.setArtifactId( "c-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that LATEST is banned
         rule.setBanLatest( true );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that LATEST is exhausively checked
         rule.setBanSnapshots( false );
         source.setArtifactId( "f-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         rule.setBanLatest( false );
         rule.setBanSnapshots( true );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that TIMESTAMP is allowed
         rule.setBanTimestamps( false );
         source.setArtifactId( "g-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that RELEASE is allowed
         source.setArtifactId( "d-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that RELEASE is banned
         rule.setBanRelease( true );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // check that RELEASE is exhaustively checked
         source.setArtifactId( "e-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
     }
 
     /**
@@ -136,7 +136,7 @@ public class TestRequirePluginVersions
         source.setGroupId( "group" );
 
         // setup the plugins.
-        List plugins = new ArrayList();
+        List<Plugin> plugins = new ArrayList<Plugin>();
         plugins.add( EnforcerTestUtils.newPlugin( "group", "a-artifact", "1.0-${SNAPSHOT}" ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "b-artifact", "${1.0}" ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "c-artifact", "${LATEST}" ) );
@@ -144,7 +144,7 @@ public class TestRequirePluginVersions
         plugins.add( EnforcerTestUtils.newPlugin( "group", "e-artifact", "${}" ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "f-artifact", "${   }" ) );
 
-        plugins = PluginWrapper.addAll( plugins, "unit" );
+        List<PluginWrapper> pluginWrappers = PluginWrapper.addAll( plugins, "unit" );
 
         RequirePluginVersions rule = new RequirePluginVersions();
         rule.setBanLatest( false );
@@ -154,40 +154,40 @@ public class TestRequirePluginVersions
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( true );
 
         source.setArtifactId( "a-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         source.setArtifactId( "b-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         source.setArtifactId( "c-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         source.setArtifactId( "d-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // this one checks empty property values
         source.setArtifactId( "e-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // this one checks empty property values
         source.setArtifactId( "f-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         rule.setBanLatest( true );
         source.setArtifactId( "c-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         rule.setBanRelease( true );
         source.setArtifactId( "d-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         rule.setBanSnapshots( true );
         source.setArtifactId( "a-artifact" );
-        assertFalse( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertFalse( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
 
         // release versions should pass everything
         source.setArtifactId( "b-artifact" );
-        assertTrue( rule.hasValidVersionSpecified( helper, source, plugins ) );
+        assertTrue( rule.hasValidVersionSpecified( helper, source, pluginWrappers ) );
     }
 
     /**
@@ -215,7 +215,7 @@ public class TestRequirePluginVersions
         project.setBaseDir( projectDir );
 
         rule.setUtils( new EnforcerRuleUtils( EnforcerTestUtils.getHelper( project ) ) );
-        List plugins = rule.getAllPluginEntries( project );
+        List<PluginWrapper> plugins = rule.getAllPluginEntries( project );
 
         // there should be 3
         assertEquals( 3, plugins.size() );
@@ -240,12 +240,12 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        List additional = new ArrayList();
+        List<String> additional = new ArrayList<String>();
 
         // invalid format (not enough sections)
         additional.add( "group" );
 
-        Set plugins = new HashSet();
+        Set<Plugin> plugins = new HashSet<Plugin>();
         try
         {
             rule.addAdditionalPlugins( plugins, additional );
@@ -279,17 +279,17 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
+        Set<Plugin> plugins = new HashSet<Plugin>();
         plugins.add( EnforcerTestUtils.newPlugin( "group", "a-artifact", "1.0" ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "foo", null ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "foo2", "" ) );
 
-        List additional = new ArrayList();
+        List<String> additional = new ArrayList<String>();
         additional.add( "group:a-artifact" );
         additional.add( "group:another-artifact" );
 
         // make sure a null set can be handled
-        Set results = rule.addAdditionalPlugins( null, additional );
+        Set<Plugin> results = rule.addAdditionalPlugins( null, additional );
 
         assertNotNull( results );
         assertContainsPlugin( "group", "a-artifact", results );
@@ -307,16 +307,16 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
+        Set<Plugin> plugins = new HashSet<Plugin>();
         plugins.add( EnforcerTestUtils.newPlugin( "group", "a-artifact", "1.0" ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "foo", null ) );
         plugins.add( EnforcerTestUtils.newPlugin( "group", "foo2", "" ) );
 
-        List additional = new ArrayList();
+        List<String> additional = new ArrayList<String>();
         additional.add( "group:a-artifact" );
         additional.add( "group:another-artifact" );
 
-        Set results = rule.addAdditionalPlugins( plugins, additional );
+        Set<Plugin> results = rule.addAdditionalPlugins( plugins, additional );
 
         // make sure only one new plugin has been added
         assertNotNull( results );
@@ -345,7 +345,7 @@ public class TestRequirePluginVersions
         //intentionally inserting spaces to make sure they are handled correctly.
         unchecked.add( "group : a-artifact" );
 
-        Collection results = rule.removeUncheckedPlugins( unchecked, plugins );
+        Collection<Plugin> results = rule.removeUncheckedPlugins( unchecked, plugins );
 
 
         // make sure only one new plugin has been added
@@ -364,12 +364,12 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
+        Set<String> plugins = new HashSet<String>();
         plugins.add( "group:a-artifact" );
         plugins.add( "group:foo" );
         plugins.add( "group:foo2" );
 
-        Collection results = rule.combineUncheckedPlugins( plugins, "group2:a,group3:b" );
+        Collection<String> results = rule.combineUncheckedPlugins( plugins, "group2:a,group3:b" );
 
         // make sure only one new plugin has been added
         assertNotNull( results );
@@ -388,8 +388,8 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
-        Collection results = rule.combineUncheckedPlugins( plugins, "group2:a,group3:b" );
+        Set<String> plugins = new HashSet<String>();
+        Collection<String> results = rule.combineUncheckedPlugins( plugins, "group2:a,group3:b" );
 
 
         // make sure only one new plugin has been added
@@ -406,7 +406,7 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Collection results = rule.combineUncheckedPlugins( null, "group2:a,group3:b" );
+        Collection<String> results = rule.combineUncheckedPlugins( null, "group2:a,group3:b" );
 
 
         // make sure only one new plugin has been added
@@ -423,12 +423,12 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
+        Set<String> plugins = new HashSet<String>();
         plugins.add( "group:a-artifact" );
         plugins.add( "group:foo" );
         plugins.add( "group:foo2" );
 
-        Collection results = rule.combineUncheckedPlugins( plugins, "" );
+        Collection<String> results = rule.combineUncheckedPlugins( plugins, "" );
         assertNotNull( results );
         assertEquals( 3, results.size() );
         assertTrue( results.contains( "group:foo") );
@@ -443,12 +443,12 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
+        Set<String> plugins = new HashSet<String>();
         plugins.add( "group:a-artifact" );
         plugins.add( "group:foo" );
         plugins.add( "group:foo2" );
 
-        Collection results = rule.combineUncheckedPlugins( plugins, null );
+        Collection<String> results = rule.combineUncheckedPlugins( plugins, null );
         assertNotNull( results );
         assertEquals( 3, results.size() );
         assertTrue( results.contains( "group:foo") );
@@ -463,12 +463,12 @@ public class TestRequirePluginVersions
     {
         RequirePluginVersions rule = new RequirePluginVersions();
 
-        Set plugins = new HashSet();
+        Set<String> plugins = new HashSet<String>();
         plugins.add( "group:a-artifact" );
         plugins.add( "group:foo" );
         plugins.add( "group:foo2" );
 
-        Collection results = rule.combineUncheckedPlugins( plugins, "a" );
+        Collection<String> results = rule.combineUncheckedPlugins( plugins, "a" );
         assertNotNull( results );
         assertEquals( 4, results.size() );
         assertTrue( results.contains( "group:foo") );
@@ -485,7 +485,7 @@ public class TestRequirePluginVersions
      * @param artifact the artifact
      * @param theSet the the set
      */
-    private void assertContainsPlugin( String group, String artifact, Collection theSet )
+    private void assertContainsPlugin( String group, String artifact, Collection<Plugin> theSet )
     {
         Plugin p = new Plugin();
         p.setGroupId( group );
@@ -500,7 +500,7 @@ public class TestRequirePluginVersions
      * @param artifact the artifact
      * @param theSet the the set
      */
-    private void assertNotContainPlugin( String group, String artifact, Collection theSet )
+    private void assertNotContainPlugin( String group, String artifact, Collection<Plugin> theSet )
     {
         Plugin p = new Plugin();
         p.setGroupId( group );
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
index e20fe6f..c890086 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
@@ -48,7 +48,7 @@ public class TestRequireProperty
 
         RequireProperty rule = new RequireProperty();
         // this property should not be set
-        rule.property = "testPropJunk";
+        rule.setProperty( "testPropJunk" );
 
         try
         {
@@ -62,7 +62,7 @@ public class TestRequireProperty
 
         // this property should be set by the surefire
         // plugin
-        rule.property = "testProp";
+        rule.setProperty( "testProp" );
         try
         {
             rule.execute( helper );
@@ -86,10 +86,10 @@ public class TestRequireProperty
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
 
         RequireProperty rule = new RequireProperty();
-        rule.property = "testProp";
+        rule.setProperty( "testProp" );
         // This expression should not match the property
         // value
-        rule.regex = "[^abc]";
+        rule.setRegex( "[^abc]" );
 
         try
         {
@@ -102,7 +102,7 @@ public class TestRequireProperty
         }
 
         // this expr should match the property
-        rule.regex = "[This].*[.]";
+        rule.setRegex( "[This].*[.]" );
         try
         {
             rule.execute( helper );
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
index 3cde2c3..efe023e 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
@@ -20,14 +20,16 @@ package org.apache.maven.plugins.enforcer;
  */
 
 import java.io.IOException;
+import java.util.Set;
 
 import junit.framework.TestCase;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.apache.maven.plugin.testing.ArtifactStubFactory;
 import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
+import org.apache.maven.project.MavenProject;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class TestNoSnapshots.
  *
@@ -51,7 +53,7 @@ public class TestRequireReleaseDeps
         EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
         project.setArtifacts( factory.getMixedArtifacts() );
         project.setDependencyArtifacts( factory.getScopedArtifacts() );
-        RequireReleaseDeps rule = new RequireReleaseDeps();
+        RequireReleaseDeps rule = newRequireReleaseDeps();
         rule.setSearchTransitive( false );
 
         TestEnforcerRuleUtils.execute( rule, helper, false );
@@ -66,7 +68,7 @@ public class TestRequireReleaseDeps
 
         TestEnforcerRuleUtils.execute( rule, helper, true );
 
-        rule.onlyWhenRelease = true;
+        rule.setOnlyWhenRelease( true );
 
         TestEnforcerRuleUtils.execute( rule, helper, false );
 
@@ -90,12 +92,26 @@ public class TestRequireReleaseDeps
 
     }
 
+    private RequireReleaseDeps newRequireReleaseDeps()
+    {
+        RequireReleaseDeps rule = new RequireReleaseDeps()
+        {
+            protected Set<Artifact> getDependenciesToCheck( MavenProject project )
+            {
+                // the integration with dependencyGraphTree is verified with the integration tests
+                // for unit-testing 
+                return isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts();
+            }
+        };        
+        return rule;
+    }
+
     /**
      * Test id.
      */
     public void testId()
     {
-        RequireReleaseDeps rule = new RequireReleaseDeps();
+        RequireReleaseDeps rule = newRequireReleaseDeps();
         rule.getCacheId();
     }
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java
similarity index 53%
copy from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
copy to enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java
index 3cde2c3..4c1c60e 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java
@@ -19,83 +19,83 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.apache.maven.plugin.testing.ArtifactStubFactory;
 import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
+import org.apache.maven.project.MavenProject;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
 
-// TODO: Auto-generated Javadoc
 /**
- * The Class TestNoSnapshots.
- *
- * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
+ * Test class for the RequireSnapshotVersion rule.
  */
-public class TestRequireReleaseDeps
-    extends TestCase
+public class TestRequireSnapshotVersion
 {
 
-    /**
-     * Test rule.
-     *
-     * @throws IOException Signals that an I/O exception has occurred.
-     */
-    public void testRule()
-        throws IOException
-    {
+    private MavenProject project;
 
-        ArtifactStubFactory factory = new ArtifactStubFactory();
-        MockProject project = new MockProject();
-        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
-        project.setArtifacts( factory.getMixedArtifacts() );
-        project.setDependencyArtifacts( factory.getScopedArtifacts() );
-        RequireReleaseDeps rule = new RequireReleaseDeps();
-        rule.setSearchTransitive( false );
+    private EnforcerRuleHelper helper;
 
-        TestEnforcerRuleUtils.execute( rule, helper, false );
+    private ArtifactStubFactory factory;
 
-        rule.setSearchTransitive( true );
-
-        TestEnforcerRuleUtils.execute( rule, helper, true );
+    private RequireSnapshotVersion rule;
 
-        // test onlyWhenRelease in each case
-
-        project.setArtifact( factory.getSnapshotArtifact() );
+    @Before
+    public void before()
+    {
+        project = new MockProject();
+        helper = EnforcerTestUtils.getHelper( project );
+        factory = new ArtifactStubFactory();
+        rule = new RequireSnapshotVersion();
+    }
 
+    @Test
+    public void testRequireSnapshot()
+        throws IOException
+    {
+        project.setArtifact( factory.getReleaseArtifact() );
         TestEnforcerRuleUtils.execute( rule, helper, true );
 
-        rule.onlyWhenRelease = true;
-
+        project.setArtifact( factory.getSnapshotArtifact() );
         TestEnforcerRuleUtils.execute( rule, helper, false );
+    }
 
-        project.setArtifact( factory.getReleaseArtifact() );
+    @Test
+    public void testWithParentShouldFail()
+        throws IOException
+    {
+        project.setArtifact( factory.getSnapshotArtifact() );
+        rule.setFailWhenParentIsRelease( true );
 
+        MockProject parent = new MockProject();
+        parent.setArtifact( factory.getReleaseArtifact() );
+        project.setParent( parent );
         TestEnforcerRuleUtils.execute( rule, helper, true );
 
-        MockProject parent = new MockProject();
+        parent = new MockProject();
         parent.setArtifact( factory.getSnapshotArtifact() );
         project.setParent( parent );
-        project.setArtifacts( null );
-        project.setDependencyArtifacts( null );
-        helper = EnforcerTestUtils.getHelper(project);
+        TestEnforcerRuleUtils.execute( rule, helper, false );
+    }
 
-        rule.setFailWhenParentIsSnapshot( true );
-        TestEnforcerRuleUtils.execute( rule, helper, true );
+    @Test
+    public void testWithParentShouldPass()
+        throws IOException
+    {
+        project.setArtifact( factory.getSnapshotArtifact() );
+        rule.setFailWhenParentIsRelease( false );
 
-        rule.setFailWhenParentIsSnapshot( false );
+        MockProject parent = new MockProject();
+        parent.setArtifact( factory.getReleaseArtifact() );
+        project.setParent( parent );
         TestEnforcerRuleUtils.execute( rule, helper, false );
 
-
+        parent = new MockProject();
+        parent.setArtifact( factory.getSnapshotArtifact() );
+        project.setParent( parent );
+        TestEnforcerRuleUtils.execute( rule, helper, false );
     }
 
-    /**
-     * Test id.
-     */
-    public void testId()
-    {
-        RequireReleaseDeps rule = new RequireReleaseDeps();
-        rule.getCacheId();
-    }
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java
index ae13bce..c3b3135 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java
@@ -20,6 +20,8 @@ package org.apache.maven.plugins.enforcer.utils;
  */
 
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugins.enforcer.EnforcerExpressionEvaluator;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.path.PathTranslator;
@@ -43,7 +45,7 @@ public class MockEnforcerExpressionEvaluator
     public MockEnforcerExpressionEvaluator( MavenSession theContext, PathTranslator thePathTranslator,
                                             MavenProject theProject )
     {
-        super( theContext, thePathTranslator, theProject );
+        super( theContext, thePathTranslator, theProject, new MojoExecution( new MojoDescriptor() ) );
         // TODO Auto-generated constructor stub
     }
 
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestArtifactMatcher.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestArtifactMatcher.java
new file mode 100644
index 0000000..8740635
--- /dev/null
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestArtifactMatcher.java
@@ -0,0 +1,163 @@
+package org.apache.maven.plugins.enforcer.utils;
+
+/*
+ * 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 junit.framework.TestCase;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.ArtifactHandler;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher.Pattern;
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class TestArtifactMatcher extends TestCase
+{
+	private ArtifactMatcher matcher;
+	
+	Collection<String> patterns = new ArrayList<String>();
+	
+	Collection<String> ignorePatterns = new ArrayList<String>();
+	
+	public void testPatternInvalidInput() throws InvalidVersionSpecificationException
+	{
+		try
+		{
+			new Pattern(null);
+			fail("NullPointerException expected.");
+		}
+		catch(NullPointerException e){}
+		
+		try
+		{
+			new Pattern("a:b:c:d:e:f:g");
+			fail("IllegalArgumentException expected.");
+		}
+		catch(IllegalArgumentException e){}
+		
+		try
+		{
+			new Pattern("a::");
+			fail("IllegalArgumentException expected.");
+		}
+		catch(IllegalArgumentException e){}
+		
+		try
+		{
+			Pattern p = new Pattern("*");
+			p.match(null);
+			fail("NullPointerException expected.");
+		}
+		catch(NullPointerException e){}
+	}
+
+	public void testPattern() throws InvalidVersionSpecificationException
+	{
+		executePatternMatch("groupId:artifactId:1.0:jar:compile", "groupId", "artifactId", "1.0", "compile", "jar", true);
+		
+		executePatternMatch("groupId:artifactId:1.0:jar:compile", "groupId", "artifactId", "1.0", "", "", true);
+		
+		executePatternMatch("groupId:artifactId:1.0", "groupId", "artifactId", "1.0", "", "", true);
+		
+		executePatternMatch("groupId:artifactId:1.0", "groupId", "artifactId", "1.1", "", "", true);
+		
+		executePatternMatch("groupId:artifactId:[1.0]", "groupId", "artifactId", "1.1", "", "", false);
+		
+		executePatternMatch("groupId:*:1.0", "groupId", "artifactId", "1.0", "test", "", true);
+		
+		executePatternMatch("*:*:1.0", "groupId", "artifactId", "1.0", "", "", true);
+		
+		executePatternMatch("*:artifactId:*", "groupId", "artifactId", "1.0", "", "", true);
+		
+		executePatternMatch("*", "groupId", "artifactId", "1.0", "", "", true);
+		
+		// MENFORCER-74/75
+		executePatternMatch("*:*:*:jar:compile:tests", "groupId", "artifactId", "1.0", "", "", "tests", true);
+		
+		// MENFORCER-83
+        executePatternMatch("*upId", "groupId", "artifactId", "1.0", "", "", true);
+        
+        executePatternMatch("gr*pId:?rt?f?ct?d:1.0", "groupId", "artifactId", "1.0", "", "", true);
+        
+        executePatternMatch("org.apache.*:maven-*:*", "org.apache.maven", "maven-core", "3.0", "", "", true);
+	}
+	
+	public void testMatch() throws InvalidVersionSpecificationException
+	{
+		patterns.add("groupId:artifactId:1.0");
+		patterns.add("*:anotherArtifact");
+		
+		ignorePatterns.add("badGroup:*:*:test");
+		ignorePatterns.add("*:anotherArtifact:1.1");
+		
+		matcher = new ArtifactMatcher(patterns, ignorePatterns);
+		
+		executeMatch(matcher, "groupId", "artifactId", "1.0", "", "", true);	
+		
+		executeMatch(matcher, "groupId", "anotherArtifact", "1.0", "", "", true);	
+		
+		executeMatch(matcher, "badGroup", "artifactId", "1.0", "", "test", false);
+		
+		executeMatch(matcher, "badGroup", "anotherArtifact", "1.0", "", "", true);	
+		
+		executeMatch(matcher, "groupId", "anotherArtifact", "1.1", "", "", false);	
+	}
+	
+    private void executePatternMatch( final String pattern, final String groupId, final String artifactId,
+                                      final String versionRange, final String scope, final String type,
+                                      boolean expectedResult )
+        throws InvalidVersionSpecificationException
+    {
+        executePatternMatch( pattern, groupId, artifactId, versionRange, scope, type, "", expectedResult );
+    }
+
+    private void executePatternMatch( final String pattern, final String groupId, final String artifactId,
+                                      final String versionRange, final String scope, final String type,
+                                      final String classifier, boolean expectedResult )
+        throws InvalidVersionSpecificationException
+    {
+        assertEquals( expectedResult, new ArtifactMatcher.Pattern( pattern ).match( createMockArtifact( groupId,
+                                                                                                        artifactId,
+                                                                                                        versionRange,
+                                                                                                        scope, type,
+                                                                                                        classifier ) ) );
+    }
+
+    private void executeMatch( final ArtifactMatcher matcher, final String groupId, final String artifactId,
+                               final String versionRange, final String scope, final String type,
+                               final boolean expectedResult )
+        throws InvalidVersionSpecificationException
+    {
+        assertEquals( expectedResult,
+                      matcher.match( createMockArtifact( groupId, artifactId, versionRange, scope, type, "" ) ) );
+    }
+
+    private static Artifact createMockArtifact( final String groupId, final String artifactId,
+                                                final String versionRange, final String scope, final String type,
+                                                final String classifier )
+    {
+        ArtifactHandler artifactHandler = new DefaultArtifactHandler();
+
+        VersionRange version = VersionRange.createFromVersion( versionRange );
+        return new DefaultArtifact( groupId, artifactId, version, scope, type, classifier, artifactHandler );
+    }
+}
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/child/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/child/pom.xml
index df61f3b..c7f5303 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/child/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/child/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
     </groupId>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/pom.xml
index a367bfe..d56435e 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/no-repositories/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <groupId>org.apache.maven.plugins.enforcer.test</groupId>
   <artifactId>no-repositories</artifactId>
   <version>1.0-SNAPSHOT</version>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/child/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/child/pom.xml
index ddd80c1..3737768 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/child/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/child/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
     </groupId>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/pom.xml
index 71e4bf1..8cf8efb 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-plugin-repositories/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <groupId>org.apache.maven.plugins.enforcer.test</groupId>
   <artifactId>snapshot-plugin-repositories</artifactId>
   <version>1.0-SNAPSHOT</version>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/child/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/child/pom.xml
index 82293a9..45bc16f 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/child/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/child/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
     </groupId>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/pom.xml
index e34a962..32872f5 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/snapshot-repositories/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <groupId>org.apache.maven.plugins.enforcer.test</groupId>
   <artifactId>snapshot-repositories</artifactId>
   <version>1.0-SNAPSHOT</version>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/child/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/child/pom.xml
index f9616b5..73e4e04 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/child/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/child/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
     </groupId>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/pom.xml
index 822e8b4..771f86b 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/with-plugin-repositories/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <groupId>org.apache.maven.plugins.enforcer.test</groupId>
   <artifactId>with-plugin-repositories</artifactId>
   <version>1.0-SNAPSHOT</version>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/child/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/child/pom.xml
index 25064fa..e388c48 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/child/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/child/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
     </groupId>
diff --git a/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/pom.xml b/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/pom.xml
index a6695c4..32f94f0 100644
--- a/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/pom.xml
+++ b/enforcer-rules/src/test/resources/requireNoRepositories/with-repositories/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
   <groupId>org.apache.maven.plugins.enforcer.test</groupId>
   <artifactId>with-repositories</artifactId>
   <version>1.0-SNAPSHOT</version>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginPropertyVersion/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginPropertyVersion/pom.xml
index bc66bf1..d7ac40b 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginPropertyVersion/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginPropertyVersion/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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>
     <artifactId>a</artifactId>
     <groupId>group</groupId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml
index cd61a3d..48a688a 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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>
     <artifactId>a</artifactId>
     <groupId>group</groupId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/c/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/c/pom.xml
index 80bf210..40ff1c6 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/c/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/c/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
 	<parent>
 		<artifactId>b</artifactId>
 		<groupId>group</groupId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/pom.xml
index 1ec24d2..43c4f2e 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/b/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
 	<parent>
 		<artifactId>a</artifactId>
 		<groupId>group</groupId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/pom.xml
index 93e0e4e..763f933 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/getPomRecursively/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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">
 	<artifactId>a</artifactId>
 	<groupId>group</groupId>
 	<version>1.0</version>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/child/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/child/pom.xml
index a850c0f..b67803a 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/child/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/child/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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>
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/pom.xml
index 8b69f86..4149be7 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/parentExpression/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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.test</groupId>
   <artifactId>parentExpression</artifactId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/parent/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/parent/pom.xml
index ec6acef..bccf617 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/parent/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/parent/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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.test
   </groupId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/pom.xml
index e3b789d..f4db837 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePath/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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>
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/parent/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/parent/pom.xml
index ec6acef..bccf617 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/parent/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/parent/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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.test
   </groupId>
diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/pom.xml
index 65f44de..de0ec62 100644
--- a/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/pom.xml
+++ b/enforcer-rules/src/test/resources/requirePluginVersions/parentRelativePathDirectory/pom.xml
@@ -1,4 +1,24 @@
-<project>
+<?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>
   <parent>
     <groupId>org.apache.maven.plugins.enforcer.test
diff --git a/maven-enforcer-plugin/NOTICE b/maven-enforcer-plugin/NOTICE
deleted file mode 100644
index 975ec23..0000000
--- a/maven-enforcer-plugin/NOTICE
+++ /dev/null
@@ -1,9 +0,0 @@
-Maven Dependency Plugin
-   Copyright 1999-2006 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-   
-   Portions of this software utilize the Plexus Container, API, and
-   Components.  Copyright the Codehaus. The original software is
-   available from http://plexus.codehaus.org/
\ No newline at end of file
diff --git a/maven-enforcer-plugin/pom.xml b/maven-enforcer-plugin/pom.xml
index 766429c..869629e 100644
--- a/maven-enforcer-plugin/pom.xml
+++ b/maven-enforcer-plugin/pom.xml
@@ -1,21 +1,21 @@
 <?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
+  * or more contributor license agreements. See the NOTICE file
   * distributed with this work for additional information
-  * regarding copyright ownership.  The ASF licenses this file
+  * 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
+  * 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
+  * KIND, either express or implied. See the License for the
   * specific language governing permissions and limitations
-  * under the License. 
+  * 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">
@@ -24,46 +24,19 @@
   <parent>
     <groupId>org.apache.maven.enforcer</groupId>
     <artifactId>enforcer</artifactId>
-    <version>1.0.1</version>
+    <version>1.4.2</version>
   </parent>
 
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-enforcer-plugin</artifactId>
-  <version>1.0.1</version>
   <packaging>maven-plugin</packaging>
 
-  <name>Maven Enforcer Plugin</name>
-  <description>The Loving Iron Fist of Maven</description>
-  <url>http://maven.apache.org/plugins/maven-enforcer-plugin/</url>
-  <inceptionYear>2007</inceptionYear>
-
-  <developers>
-    <developer>
-      <id>brianf</id>
-      <name>Brian Fox</name>
-      <email>brianf at apache.org</email>
-      <roles>
-        <role>Lead Developer</role>
-      </roles>
-      <timezone>5</timezone>
-    </developer>
-  </developers>
-
   <prerequisites>
-    <!--because of the encoding fixes, I need a new plexus-utils. The new plexus utils can only be used in 2.0.6 or later: http://jira.codehaus.org/browse/MNG-2892 -->
-    <maven>2.0.6</maven>
+    <maven>2.2.1</maven>
   </prerequisites>
 
-  <issueManagement>
-    <system>JIRA</system>
-    <url>http://jira.codehaus.org/browse/MENFORCER</url>
-  </issueManagement>
-  <distributionManagement>
-    <site>
-      <id>apache.website</id>
-      <url>${site.deploy.url}/plugins/maven-enforcer-plugin</url>
-    </site>
-  </distributionManagement>
+  <name>Apache Maven Enforcer Plugin</name>
+  <description>The Loving Iron Fist of Maven</description>
 
   <dependencies>
     <dependency>
@@ -76,10 +49,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
     </dependency>
     <dependency>
@@ -104,42 +73,63 @@
       <type>test-jar</type>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.shared</groupId>
+      <groupId>org.apache.maven.plugin-testing</groupId>
       <artifactId>maven-plugin-testing-harness</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 
   <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <configuration>
+            <excludes combine.children="append">
+              <!--
+                The manifest specification does not describe any method for writing comments into the manifest.
+              -->
+              <exclude>src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/META-INF/MANIFEST.MF</exclude>
+            </excludes>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
     <plugins>
       <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>cobertura-maven-plugin</artifactId>
-        <version>2.2</version>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-plugin-plugin</artifactId>
+        <configuration>
+          <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
+        </configuration>
         <executions>
           <execution>
-            <phase>clean</phase>
+            <id>generate-helpmojo</id>
             <goals>
-              <goal>clean</goal>
+              <goal>helpmojo</goal>
             </goals>
           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-site-plugin</artifactId>
-        <configuration>
-          <stagingSiteURL>
-            scp://people.apache.org/www/maven.apache.org/plugins/${project.artifactId}-${project.version}
-          </stagingSiteURL>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <executions>
           <execution>
-            <id>generated-helpmojo</id>
+            <id>mojo-descriptor</id>
             <goals>
-              <goal>helpmojo</goal>
+              <goal>descriptor</goal>
             </goals>
           </execution>
         </executions>
@@ -163,7 +153,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-plugin-plugin</artifactId>
-        <version>${maven.plugin.plugin.version}</version>
+        <version>${mavenPluginPluginVersion}</version>
       </plugin>
     </plugins>
   </reporting>
@@ -175,14 +165,15 @@
         <plugins>
           <plugin>
             <artifactId>maven-invoker-plugin</artifactId>
-            <version>1.5</version>
+            <version>2.0.0</version>
             <configuration>
               <debug>true</debug>
+              <projectsDirectory>src/it/projects</projectsDirectory>
               <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
               <preBuildHookScript>setup</preBuildHookScript>
               <postBuildHookScript>verify</postBuildHookScript>
               <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
-              <settingsFile>src/it/settings.xml</settingsFile>
+              <settingsFile>src/it/mrm/settings.xml</settingsFile>
               <goals>
                 <goal>validate</goal>
               </goals>
@@ -197,6 +188,28 @@
               </execution>
             </executions>
           </plugin>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>mrm-maven-plugin</artifactId>
+            <version>1.0.0</version>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>start</goal>
+                  <goal>stop</goal>
+                </goals>
+              </execution>
+            </executions>
+            <configuration>
+              <propertyName>repository.proxy.url</propertyName>
+              <repositories>
+                <mockRepo>
+                  <source>src/it/mrm/repository</source>
+                </mockRepo>
+                <proxyRepo />
+              </repositories>
+            </configuration>
+          </plugin>
         </plugins>
       </build>
     </profile>
diff --git a/maven-enforcer-plugin/src/it/always-fail/invoker.properties b/maven-enforcer-plugin/src/it/always-fail/invoker.properties
deleted file mode 100644
index c21e972..0000000
--- a/maven-enforcer-plugin/src/it/always-fail/invoker.properties
+++ /dev/null
@@ -1 +0,0 @@
-invoker.buildResult = failure
diff --git a/maven-enforcer-plugin/src/it/builds_a_pom_noop/module/pom.xml b/maven-enforcer-plugin/src/it/builds_a_pom_noop/module/pom.xml
deleted file mode 100644
index eb4ad89..0000000
--- a/maven-enforcer-plugin/src/it/builds_a_pom_noop/module/pom.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>test</groupId>
-    <artifactId>TestParent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>TestModule</artifactId>
-  <version>1.0-SNAPSHOT</version>
-</project>
diff --git a/maven-enforcer-plugin/src/it/builds_a_pom_noop/pom.xml b/maven-enforcer-plugin/src/it/builds_a_pom_noop/pom.xml
deleted file mode 100644
index 0f73306..0000000
--- a/maven-enforcer-plugin/src/it/builds_a_pom_noop/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>test</groupId>
-  <artifactId>TestParent</artifactId>
-  <version>1.0-SNAPSHOT</version>
-  <packaging>pom</packaging>
-  <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>
-                <DependencyConvergence/>
-              </rules>
-            </configuration>
-            <goals>
-              <goal>enforce</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/dependencies_converge/module/pom.xml b/maven-enforcer-plugin/src/it/dependencies_converge/module/pom.xml
deleted file mode 100644
index eb4ad89..0000000
--- a/maven-enforcer-plugin/src/it/dependencies_converge/module/pom.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>test</groupId>
-    <artifactId>TestParent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>TestModule</artifactId>
-  <version>1.0-SNAPSHOT</version>
-</project>
diff --git a/maven-enforcer-plugin/src/it/dependencies_not_converging/invoker.properties b/maven-enforcer-plugin/src/it/dependencies_not_converging/invoker.properties
deleted file mode 100644
index 324b5fb..0000000
--- a/maven-enforcer-plugin/src/it/dependencies_not_converging/invoker.properties
+++ /dev/null
@@ -1 +0,0 @@
-invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/dependencies_not_converging/module/pom.xml b/maven-enforcer-plugin/src/it/dependencies_not_converging/module/pom.xml
deleted file mode 100644
index e27990b..0000000
--- a/maven-enforcer-plugin/src/it/dependencies_not_converging/module/pom.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>test</groupId>
-    <artifactId>TestParent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>TestModule</artifactId>
-  <version>1.1-SNAPSHOT</version>
-</project>
diff --git a/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/invoker.properties b/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/invoker.properties
deleted file mode 100644
index 324b5fb..0000000
--- a/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/invoker.properties
+++ /dev/null
@@ -1 +0,0 @@
-invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/module/pom.xml b/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/module/pom.xml
deleted file mode 100644
index e27990b..0000000
--- a/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/module/pom.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>test</groupId>
-    <artifactId>TestParent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>TestModule</artifactId>
-  <version>1.1-SNAPSHOT</version>
-</project>
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer126_maven-plugin-1.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer126_maven-plugin-1.0.pom
new file mode 100644
index 0000000..093f5ae
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer126_maven-plugin-1.0.pom
@@ -0,0 +1,27 @@
+<?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>menforcer126_maven-plugin</artifactId>
+  <version>1.0</version>
+  <packaging>maven-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.4.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.4.0.pom
new file mode 100644
index 0000000..d09821b
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.4.0.pom
@@ -0,0 +1,26 @@
+<?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>menforcer128_api</artifactId>
+  <version>1.4.0</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.5.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.5.0.pom
new file mode 100644
index 0000000..c410d13
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.5.0.pom
@@ -0,0 +1,26 @@
+<?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>menforcer128_api</artifactId>
+  <version>1.5.0</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.6.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.6.0.pom
new file mode 100644
index 0000000..720c462
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_api-1.6.0.pom
@@ -0,0 +1,26 @@
+<?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>menforcer128_api</artifactId>
+  <version>1.6.0</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_classic-0.9.9.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_classic-0.9.9.pom
new file mode 100644
index 0000000..1db4f40
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer128_classic-0.9.9.pom
@@ -0,0 +1,34 @@
+<?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>menforcer128_classic</artifactId>
+  <version>0.9.9</version>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_api</artifactId>
+      <version>1.5.0</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_model-1.0-20130423.042904-7222.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_model-1.0-20130423.042904-7222.pom
new file mode 100644
index 0000000..125cc1d
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_model-1.0-20130423.042904-7222.pom
@@ -0,0 +1,26 @@
+<?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>menforcer134_model</artifactId>
+  <version>1.0-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_model-1.0-20130423.044324-5638.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_model-1.0-20130423.044324-5638.pom
new file mode 100644
index 0000000..125cc1d
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_model-1.0-20130423.044324-5638.pom
@@ -0,0 +1,26 @@
+<?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>menforcer134_model</artifactId>
+  <version>1.0-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_modelbuilder-1.0-SNAPSHOT.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_modelbuilder-1.0-SNAPSHOT.pom
new file mode 100644
index 0000000..38cae84
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_modelbuilder-1.0-SNAPSHOT.pom
@@ -0,0 +1,34 @@
+<?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>menforcer134_modelbuilder</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer134_model</artifactId>
+      <version>1.0-20130423.044324-5638</version>
+    </dependency>  
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_project-1.0-SNAPSHOT.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_project-1.0-SNAPSHOT.pom
new file mode 100644
index 0000000..c36a02a
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer134_project-1.0-SNAPSHOT.pom
@@ -0,0 +1,39 @@
+<?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>menforcer134_project</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer134_modelbuilder</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>  
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer134_model</artifactId>
+      <version>1.0-20130423.042904-7222</version>
+    </dependency>  
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_archiver-2.1.1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_archiver-2.1.1.pom
new file mode 100644
index 0000000..0531dee
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_archiver-2.1.1.pom
@@ -0,0 +1,44 @@
+<?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>menforcer138_archiver</artifactId>
+  <version>2.1.1</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_container-default</artifactId>
+      <version>1.0-alpha-9-stable-1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_utils</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_io</artifactId>
+      <version>2.0.3</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_classworlds-1.1-alpha-2.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_classworlds-1.1-alpha-2.pom
new file mode 100644
index 0000000..cd47f0e
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_classworlds-1.1-alpha-2.pom
@@ -0,0 +1,26 @@
+<?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>menforcer138_classworlds</artifactId>
+  <version>1.1-alpha-2</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom
new file mode 100644
index 0000000..de898f9
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom
@@ -0,0 +1,39 @@
+<?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>menforcer138_container-default</artifactId>
+  <version>1.0-alpha-9-stable-1</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer1308_utils</artifactId>
+      <version>1.0.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_classworlds</artifactId>
+      <version>1.1-alpha-2</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_io-2.0.3.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_io-2.0.3.pom
new file mode 100644
index 0000000..97ccfe1
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_io-2.0.3.pom
@@ -0,0 +1,34 @@
+<?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>menforcer138_io</artifactId>
+  <version>2.0.3</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_utils</artifactId>
+      <version>3.0</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom
new file mode 100644
index 0000000..44a2097
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom
@@ -0,0 +1,26 @@
+<?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>menforcer1308_utils</artifactId>
+  <version>1.0.4</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-3.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-3.0.pom
new file mode 100644
index 0000000..f96a394
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-3.0.pom
@@ -0,0 +1,26 @@
+<?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>menforcer138_utils</artifactId>
+  <version>3.0</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_b-1.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_b-1.0.pom
new file mode 100644
index 0000000..c846821
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_b-1.0.pom
@@ -0,0 +1,34 @@
+<?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>menforcer146-b</artifactId>
+  <version>1.0</version>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer146-x</artifactId>
+      <version>2.1</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-1.1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-1.1.pom
new file mode 100644
index 0000000..24e781e
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-1.1.pom
@@ -0,0 +1,26 @@
+<?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>menforcer146-x</artifactId>
+  <version>1.1</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-2.1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-2.1.pom
new file mode 100644
index 0000000..a7272c9
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-2.1.pom
@@ -0,0 +1,26 @@
+<?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>menforcer146-x</artifactId>
+  <version>2.1</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-3.1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-3.1.pom
new file mode 100644
index 0000000..20eeb17
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer146_x-3.1.pom
@@ -0,0 +1,26 @@
+<?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>menforcer146-x</artifactId>
+  <version>3.1</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer152-1.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer152-1.0.pom
new file mode 100644
index 0000000..084991b
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer152-1.0.pom
@@ -0,0 +1,27 @@
+<?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>menforcer152</artifactId>
+  <version>1.0</version>
+  <packaging>jar</packaging>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer158_utils-1.0.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer158_utils-1.0.pom
new file mode 100644
index 0000000..33f8b33
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer158_utils-1.0.pom
@@ -0,0 +1,26 @@
+<?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>menforcer158_utils</artifactId>
+  <version>1.0</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer72_junit-3.8.1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer72_junit-3.8.1.pom
new file mode 100644
index 0000000..1286d9f
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer72_junit-3.8.1.pom
@@ -0,0 +1,26 @@
+<?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>menforcer72_junit</artifactId>
+  <version>3.8.1</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer72_logging-1.1.1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer72_logging-1.1.1.pom
new file mode 100644
index 0000000..ddfc314
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer72_logging-1.1.1.pom
@@ -0,0 +1,27 @@
+<?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>menforcer72_logging</artifactId>
+  <version>1.1.1</version>
+  <packaging>pom</packaging>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer85_api-1.0-SNAPSHOT.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer85_api-1.0-SNAPSHOT.pom
new file mode 100644
index 0000000..080c633
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer85_api-1.0-SNAPSHOT.pom
@@ -0,0 +1,26 @@
+<?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>menforcer85_api</artifactId>
+  <version>1.0-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/mrm/settings.xml b/maven-enforcer-plugin/src/it/mrm/settings.xml
new file mode 100644
index 0000000..49f7016
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/mrm/settings.xml
@@ -0,0 +1,73 @@
+<?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. 
+  *
+-->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
+                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
+  <mirrors>
+    <mirror>
+      <id>mrm-maven-plugin</id>
+      <name>Mock Repository Manager</name>
+      <url>@repository.proxy.url@</url>
+      <mirrorOf>*</mirrorOf>
+    </mirror>
+  </mirrors>
+  <profiles>
+    <profile>
+      <id>it-repo</id>
+      <repositories>
+        <repository>
+          <id>snapshots</id>
+          <url>@repository.proxy.url@</url>
+          <releases>
+            <enabled>true</enabled>
+            <checksumPolicy>ignore</checksumPolicy>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+            <checksumPolicy>ignore</checksumPolicy>
+            <updatePolicy>always</updatePolicy>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>snapshots</id>
+          <url>@repository.proxy.url@</url>
+          <releases>
+            <enabled>true</enabled>
+            <checksumPolicy>ignore</checksumPolicy>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+            <checksumPolicy>ignore</checksumPolicy>
+            <updatePolicy>always</updatePolicy>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+  </profiles>
+  <activeProfiles>
+    <activeProfile>it-repo</activeProfile>
+  </activeProfiles>
+</settings>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/pom.xml b/maven-enforcer-plugin/src/it/pom.xml
index a93a64e..776da8e 100644
--- a/maven-enforcer-plugin/src/it/pom.xml
+++ b/maven-enforcer-plugin/src/it/pom.xml
@@ -1,3 +1,23 @@
+<?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</groupId>
diff --git a/maven-enforcer-plugin/src/it/projects/always-fail-warn/invoker.properties b/maven-enforcer-plugin/src/it/projects/always-fail-warn/invoker.properties
new file mode 100644
index 0000000..1dcdc65
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/always-fail-warn/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult = success
diff --git a/maven-enforcer-plugin/src/it/require-no-repositories/pom.xml b/maven-enforcer-plugin/src/it/projects/always-fail-warn/pom.xml
similarity index 94%
copy from maven-enforcer-plugin/src/it/require-no-repositories/pom.xml
copy to maven-enforcer-plugin/src/it/projects/always-fail-warn/pom.xml
index c66de18..0f809c6 100644
--- a/maven-enforcer-plugin/src/it/require-no-repositories/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/always-fail-warn/pom.xml
@@ -43,8 +43,9 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <requireNoRepositories>
-                </requireNoRepositories>
+                <AlwaysFail>
+                  <level>WARN</level>
+                </AlwaysFail>
               </rules>
             </configuration>
           </execution>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy
similarity index 67%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy
index 5594174..c05c677 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.enforcer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.plugins.enforcer;
  * "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
+ *   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
@@ -18,17 +16,8 @@ package org.apache.maven.plugins.enforcer;
  * specific language governing permissions and limitations
  * under the License.
  */
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.AlwaysFail warned with message:' )
 
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
 
-}
+ 
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/always-fail/invoker.properties b/maven-enforcer-plugin/src/it/projects/always-fail/invoker.properties
new file mode 100644
index 0000000..58b6526
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/always-fail/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult = failure
diff --git a/maven-enforcer-plugin/src/it/always-fail/pom.xml b/maven-enforcer-plugin/src/it/projects/always-fail/pom.xml
similarity index 100%
copy from maven-enforcer-plugin/src/it/always-fail/pom.xml
copy to maven-enforcer-plugin/src/it/projects/always-fail/pom.xml
diff --git a/maven-enforcer-plugin/src/it/always-pass/pom.xml b/maven-enforcer-plugin/src/it/projects/always-pass/pom.xml
similarity index 100%
copy from maven-enforcer-plugin/src/it/always-pass/pom.xml
copy to maven-enforcer-plugin/src/it/projects/always-pass/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/invoker.properties b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/invoker.properties
new file mode 100644
index 0000000..58b6526
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult = failure
diff --git a/enforcer-rules/src/site/site.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/module1/pom.xml
similarity index 60%
copy from enforcer-rules/src/site/site.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/module1/pom.xml
index da8b9d2..0271bd1 100644
--- a/enforcer-rules/src/site/site.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/module1/pom.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?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
@@ -17,15 +18,25 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
+
 <project>
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Rule API" href="../enforcer-api/"/>
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin/"/>
-    </menu>
-    <menu name="Custom Rules">
-      <item name="Writing a custom rule" href="../enforcer-api/writing-a-custom-rule.html"/>
-    </menu>
-  </body>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.enforcer</groupId>
+    <artifactId>ban-distribution-management-mm</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>module1</artifactId>
+
+  <!--
+    ! This entry will fail the build.
+  -->
+  <distributionManagement>
+    <repository>
+      <id>first</id>
+      <name>This is the name</name>
+      <url>file:///Test</url>
+    </repository>
+  </distributionManagement>
 </project>
diff --git a/enforcer-rules/src/site/site.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/module2/pom.xml
similarity index 61%
copy from enforcer-rules/src/site/site.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/module2/pom.xml
index da8b9d2..fda2cd8 100644
--- a/enforcer-rules/src/site/site.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/module2/pom.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?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
@@ -17,15 +18,22 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
+
 <project>
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Rule API" href="../enforcer-api/"/>
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin/"/>
-    </menu>
-    <menu name="Custom Rules">
-      <item name="Writing a custom rule" href="../enforcer-api/writing-a-custom-rule.html"/>
-    </menu>
-  </body>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.enforcer</groupId>
+    <artifactId>ban-distribution-management-mm</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>module2</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.its.enforcer</groupId>
+      <artifactId>module1</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/maven-enforcer-plugin/src/it/always-pass/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/pom.xml
similarity index 75%
copy from maven-enforcer-plugin/src/it/always-pass/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/pom.xml
index 2375f8c..3c4a0a4 100644
--- a/maven-enforcer-plugin/src/it/always-pass/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/pom.xml
@@ -23,11 +23,20 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
+  <artifactId>ban-distribution-management-mm</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
 
-  <description>
-  </description>
+  <!--
+    ! This entry is allowed
+  -->
+  <distributionManagement>
+    <repository>
+      <id>first</id>
+      <name>This is the name</name>
+      <url>file:///Test</url>
+    </repository>
+  </distributionManagement>
 
   <build>
     <plugins>
@@ -43,7 +52,7 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <AlwaysPass/>
+                <banDistributionManagement/>
               </rules>
             </configuration>
           </execution>
@@ -51,4 +60,9 @@ under the License.
       </plugin>
     </plugins>
   </build>
+  
+  <modules>
+    <module>module1</module>
+    <module>module2</module>
+  </modules>
 </project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/verify.groovy
index 5594174..6ff5ee5 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-build/verify.groovy
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.enforcer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.plugins.enforcer;
  * "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
+ *   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
@@ -18,17 +16,7 @@ package org.apache.maven.plugins.enforcer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[INFO] BUILD FAILURE' )
+assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDistributionManagement failed with message:' )
+assert buildLog.text.contains( 'You have defined a repository in distributionManagement.' )
diff --git a/enforcer-rules/src/site/site.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/module1/pom.xml
similarity index 62%
copy from enforcer-rules/src/site/site.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/module1/pom.xml
index da8b9d2..e3b22a0 100644
--- a/enforcer-rules/src/site/site.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/module1/pom.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?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
@@ -17,15 +18,23 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
+
 <project>
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Rule API" href="../enforcer-api/"/>
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin/"/>
-    </menu>
-    <menu name="Custom Rules">
-      <item name="Writing a custom rule" href="../enforcer-api/writing-a-custom-rule.html"/>
-    </menu>
-  </body>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.enforcer</groupId>
+    <artifactId>ban-distribution-management-mm-except-site</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>module1</artifactId>
+
+  <distributionManagement>
+    <site>
+      <id>site-location</id>
+      <name>This is the site</name>
+      <url>file:///Test/module1</url>
+    </site>
+  </distributionManagement>
+
 </project>
diff --git a/maven-enforcer-plugin/src/it/always-pass/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/module2/pom.xml
similarity index 55%
copy from maven-enforcer-plugin/src/it/always-pass/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/module2/pom.xml
index 2375f8c..29ce1ab 100644
--- a/maven-enforcer-plugin/src/it/always-pass/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/module2/pom.xml
@@ -22,33 +22,26 @@ under the License.
 <project>
   <modelVersion>4.0.0</modelVersion>
 
-  <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
+  <parent>
+    <groupId>org.apache.maven.its.enforcer</groupId>
+    <artifactId>ban-distribution-management-mm-except-site</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>module2</artifactId>
 
-  <description>
-  </description>
+  <distributionManagement>
+    <site>
+      <id>site-location</id>
+      <name>This is the site</name>
+      <url>file:///Test/module2</url>
+    </site>
+  </distributionManagement>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-enforcer-plugin</artifactId>
-        <version>@project.version@</version>
-        <executions>
-          <execution>
-            <id>test</id>
-            <goals>
-              <goal>enforce</goal>
-            </goals>
-            <configuration>
-              <rules>
-                <AlwaysPass/>
-              </rules>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.its.enforcer</groupId>
+      <artifactId>module1</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/maven-enforcer-plugin/src/it/require-plugin-versions/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/pom.xml
similarity index 74%
copy from maven-enforcer-plugin/src/it/require-plugin-versions/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/pom.xml
index 7bd7043..b7b4db6 100644
--- a/maven-enforcer-plugin/src/it/require-plugin-versions/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/pom.xml
@@ -23,12 +23,17 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
+  <artifactId>ban-distribution-management-mm-except-site</artifactId>
+  <version>1.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
-  <description>
-  </description>
+  <distributionManagement>
+    <site>
+      <id>site-location</id>
+      <name>This is the site</name>
+      <url>file:///Test</url>
+    </site>
+  </distributionManagement>
 
   <build>
     <plugins>
@@ -44,12 +49,9 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <requirePluginVersions>
-                  <banSnapshots>false</banSnapshots>
-                  <unCheckedPluginList>
-                    org.apache.maven.plugins:maven-clean-plugin,org.apache.maven.plugins:maven-install-plugin,org.apache.maven.plugins:maven-deploy-plugin,org.apache.maven.plugins:maven-site-plugin
-                  </unCheckedPluginList>
-                </requirePluginVersions>
+                <banDistributionManagement>
+                  <allowSite>true</allowSite>
+                </banDistributionManagement>
               </rules>
             </configuration>
           </execution>
@@ -57,4 +59,9 @@ under the License.
       </plugin>
     </plugins>
   </build>
+  
+  <modules>
+    <module>module1</module>
+    <module>module2</module>
+  </modules>
 </project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/verify.groovy
index 5594174..6db67a7 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management-multi-module-except-site/verify.groovy
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.enforcer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.plugins.enforcer;
  * "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
+ *   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
@@ -18,17 +16,5 @@ package org.apache.maven.plugins.enforcer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[INFO] BUILD SUCCESS' )
diff --git a/maven-enforcer-plugin/src/it/require-release-dependencies/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-distribution-management/pom.xml
similarity index 93%
copy from maven-enforcer-plugin/src/it/require-release-dependencies/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management/pom.xml
index 6693dc6..304aa5e 100644
--- a/maven-enforcer-plugin/src/it/require-release-dependencies/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management/pom.xml
@@ -23,7 +23,7 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>ban-distribution-management</artifactId>
   <version>1.0</version>
 
   <description>
@@ -43,7 +43,7 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <requireReleaseDeps/>
+                <banDistributionManagement/>
               </rules>
             </configuration>
           </execution>
@@ -51,4 +51,5 @@ under the License.
       </plugin>
     </plugins>
   </build>
+
 </project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/ban-distribution-management/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/ban-distribution-management/verify.groovy
index 5594174..6db67a7 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/ban-distribution-management/verify.groovy
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.enforcer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.plugins.enforcer;
  * "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
+ *   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
@@ -18,17 +16,5 @@ package org.apache.maven.plugins.enforcer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[INFO] BUILD SUCCESS' )
diff --git a/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/invoker.properties b/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/pom.xml
similarity index 73%
copy from maven-enforcer-plugin/src/it/require-active-profile/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/pom.xml
index b57cce6..95c345a 100644
--- a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/pom.xml
@@ -23,11 +23,8 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
-
-  <description>
-  </description>
+  <artifactId>ban-pom-dependency-version</artifactId>
+  <version>1.0-SNAPSHOT</version>
 
   <build>
     <plugins>
@@ -43,9 +40,7 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <requireActiveProfile>
-                  <profiles>it</profiles>
-                </requireActiveProfile>
+                <banDuplicatePomDependencyVersions/>
               </rules>
             </configuration>
           </execution>
@@ -54,12 +49,17 @@ under the License.
     </plugins>
   </build>
 
-  <profiles>
-    <profile>
-      <id>it</id>
-      <activation>
-        <activeByDefault>true</activeByDefault>
-      </activation>
-    </profile>
-  </profiles>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer152</artifactId>
+      <version>1.0</version>
+    </dependency>  
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer152</artifactId>
+      <version>1.0</version>
+    </dependency>  
+  </dependencies>
+
 </project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/verify.groovy
similarity index 61%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/verify.groovy
index 5594174..0c25128 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/ban-pom-dependency-version/verify.groovy
@@ -1,34 +1,26 @@
-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 org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+/*
+ * 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.
+ */
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:' )
+assert buildLog.text.contains( 'Found 1 duplicate dependency declaration in this project:' )
+assert buildLog.text.contains( '- dependencies.dependency[org.apache.maven.plugins.enforcer.its:menforcer152:jar] ( 2 times )' )
+
+
+
+ 
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/invoker.properties b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/invoker.properties
new file mode 100644
index 0000000..58b6526
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult = failure
diff --git a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/pom.xml
similarity index 70%
copy from maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/pom.xml
index 46fdcb6..071260e 100644
--- a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/pom.xml
@@ -23,12 +23,9 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>ban-transitive-fail-test</artifactId>
   <version>1.0</version>
 
-  <description>
-  </description>
-
   <build>
     <plugins>
       <plugin>
@@ -43,14 +40,12 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <bannedDependencies>
+                <BanTransitiveDependencies>
                   <excludes>
-                    <exclude>*:*:*:jar</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer138_classworlds</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer138_io</exclude>
                   </excludes>
-                  <includes>
-                    <include>junit:*:*:*:test</include>
-                  </includes>
-                </bannedDependencies>
+                </BanTransitiveDependencies>
               </rules>
             </configuration>
           </execution>
@@ -58,19 +53,18 @@ under the License.
       </plugin>
     </plugins>
   </build>
-  
+
   <dependencies>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>1.1.1</version>
-      <type>pom</type>
-    </dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_archiver</artifactId>
+      <version>2.1.1</version>
+    </dependency>  
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.1</version>
-      <scope>test</scope>
-    </dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_utils</artifactId>
+      <version>3.0</version>
+    </dependency>  
   </dependencies>
+
 </project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/verify.groovy
index 5594174..5dacb94 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-fail/verify.groovy
@@ -1,34 +1,21 @@
-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 org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+/*
+ * 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.
+ */
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanTransitiveDependencies failed with message:' )
+ 
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies/pom.xml
similarity index 70%
copy from maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
copy to maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies/pom.xml
index 46fdcb6..d83287a 100644
--- a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies/pom.xml
@@ -23,12 +23,9 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>ban-transitive-test</artifactId>
   <version>1.0</version>
 
-  <description>
-  </description>
-
   <build>
     <plugins>
       <plugin>
@@ -43,14 +40,12 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <bannedDependencies>
+                <BanTransitiveDependencies>
                   <excludes>
-                    <exclude>*:*:*:jar</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer138_container-default</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer138_io</exclude>
                   </excludes>
-                  <includes>
-                    <include>junit:*:*:*:test</include>
-                  </includes>
-                </bannedDependencies>
+                </BanTransitiveDependencies>
               </rules>
             </configuration>
           </execution>
@@ -58,19 +53,18 @@ under the License.
       </plugin>
     </plugins>
   </build>
-  
+
   <dependencies>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>1.1.1</version>
-      <type>pom</type>
-    </dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_archiver</artifactId>
+      <version>2.1.1</version>
+    </dependency>  
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.1</version>
-      <scope>test</scope>
-    </dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer138_utils</artifactId>
+      <version>3.0</version>
+    </dependency>  
   </dependencies>
+
 </project>
diff --git a/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/invoker.properties b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/invoker.properties
new file mode 100644
index 0000000..58b6526
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult = failure
diff --git a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/pom.xml
similarity index 79%
copy from maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
copy to maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/pom.xml
index 46fdcb6..c07f134 100644
--- a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/pom.xml
@@ -23,7 +23,7 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>menforcer72</artifactId>
   <version>1.0</version>
 
   <description>
@@ -45,11 +45,9 @@ under the License.
               <rules>
                 <bannedDependencies>
                   <excludes>
-                    <exclude>*:*:*:jar</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer72_junit:[3.8,4.0):jar</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer72_logging:[1.0,2.0)</exclude>
                   </excludes>
-                  <includes>
-                    <include>junit:*:*:*:test</include>
-                  </includes>
                 </bannedDependencies>
               </rules>
             </configuration>
@@ -61,14 +59,14 @@ under the License.
   
   <dependencies>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer72_logging</artifactId>
       <version>1.1.1</version>
       <type>pom</type>
     </dependency>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer72_junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/verify.groovy
index 5594174..c1e0943 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange-fail/verify.groovy
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.enforcer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.plugins.enforcer;
  * "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
+ *   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
@@ -18,17 +16,6 @@ package org.apache.maven.plugins.enforcer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BannedDependencies failed with message:' )
+ 
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange/pom.xml
similarity index 79%
copy from maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
copy to maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange/pom.xml
index 46fdcb6..d934fa6 100644
--- a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-versionrange/pom.xml
@@ -23,7 +23,7 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>menforcer72</artifactId>
   <version>1.0</version>
 
   <description>
@@ -45,10 +45,10 @@ under the License.
               <rules>
                 <bannedDependencies>
                   <excludes>
-                    <exclude>*:*:*:jar</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer72_junit:[3.8,4.0):jar</exclude>
                   </excludes>
                   <includes>
-                    <include>junit:*:*:*:test</include>
+                    <include>org.apache.maven.plugins.enforcer.its:menforcer72_junit:[3.8,4.0):*:test</include>
                   </includes>
                 </bannedDependencies>
               </rules>
@@ -61,14 +61,14 @@ under the License.
   
   <dependencies>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer72_logging</artifactId>
       <version>1.1.1</version>
       <type>pom</type>
     </dependency>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer72_junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
diff --git a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml b/maven-enforcer-plugin/src/it/projects/banned-dependencies-wildcards/pom.xml
similarity index 85%
rename from maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
rename to maven-enforcer-plugin/src/it/projects/banned-dependencies-wildcards/pom.xml
index 46fdcb6..563631e 100644
--- a/maven-enforcer-plugin/src/it/banned-dependencies-wildcards/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-wildcards/pom.xml
@@ -23,7 +23,7 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>menforcer72</artifactId>
   <version>1.0</version>
 
   <description>
@@ -48,7 +48,7 @@ under the License.
                     <exclude>*:*:*:jar</exclude>
                   </excludes>
                   <includes>
-                    <include>junit:*:*:*:test</include>
+                    <include>*:menforcer72_junit:*:*:test</include>
                   </includes>
                 </bannedDependencies>
               </rules>
@@ -61,14 +61,14 @@ under the License.
   
   <dependencies>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer72_logging</artifactId>
       <version>1.1.1</version>
       <type>pom</type>
     </dependency>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer72_junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
diff --git a/maven-enforcer-plugin/src/it/banned-dependencies/pom.xml b/maven-enforcer-plugin/src/it/projects/banned-dependencies/pom.xml
similarity index 94%
rename from maven-enforcer-plugin/src/it/banned-dependencies/pom.xml
rename to maven-enforcer-plugin/src/it/projects/banned-dependencies/pom.xml
index a0137f2..8fd7fc5 100644
--- a/maven-enforcer-plugin/src/it/banned-dependencies/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies/pom.xml
@@ -45,7 +45,7 @@ under the License.
               <rules>
                 <BannedDependencies>
                   <excludes>
-                    <exclude>commons-logging:commons-logging</exclude>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer72_logging</exclude>
                   </excludes>
                 </BannedDependencies>
               </rules>
diff --git a/maven-enforcer-plugin/src/it/banned-plugins/pom.xml b/maven-enforcer-plugin/src/it/projects/banned-plugins/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/banned-plugins/pom.xml
rename to maven-enforcer-plugin/src/it/projects/banned-plugins/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/builds_a_pom_noop/module/pom.xml b/maven-enforcer-plugin/src/it/projects/builds_a_pom_noop/module/pom.xml
new file mode 100644
index 0000000..f0dfcfd
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/builds_a_pom_noop/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.0-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/projects/builds_a_pom_noop/pom.xml b/maven-enforcer-plugin/src/it/projects/builds_a_pom_noop/pom.xml
new file mode 100644
index 0000000..0ffa71b
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/builds_a_pom_noop/pom.xml
@@ -0,0 +1,49 @@
+<?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>test</groupId>
+  <artifactId>TestParent</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <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>
+                <DependencyConvergence/>
+              </rules>
+            </configuration>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/dependencies_converge/module/pom.xml b/maven-enforcer-plugin/src/it/projects/dependencies_converge/module/pom.xml
new file mode 100644
index 0000000..f0dfcfd
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_converge/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.0-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/dependencies_converge/pom.xml b/maven-enforcer-plugin/src/it/projects/dependencies_converge/pom.xml
similarity index 57%
rename from maven-enforcer-plugin/src/it/dependencies_converge/pom.xml
rename to maven-enforcer-plugin/src/it/projects/dependencies_converge/pom.xml
index 2986949..5cb6be3 100644
--- a/maven-enforcer-plugin/src/it/dependencies_converge/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_converge/pom.xml
@@ -1,6 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
+<!--
+  * 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>test</groupId>
   <artifactId>TestParent</artifactId>
diff --git a/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/invoker.properties b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/module/pom.xml b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/module/pom.xml
new file mode 100644
index 0000000..6d2c1bb
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.1-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/dependencies_not_converging/pom.xml b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/pom.xml
similarity index 54%
rename from maven-enforcer-plugin/src/it/dependencies_not_converging/pom.xml
rename to maven-enforcer-plugin/src/it/projects/dependencies_not_converging/pom.xml
index 92fa729..a33316a 100644
--- a/maven-enforcer-plugin/src/it/dependencies_not_converging/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging/pom.xml
@@ -1,6 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
+<!--
+  * 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>test</groupId>
   <artifactId>TestParent</artifactId>
diff --git a/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/invoker.properties b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/module/pom.xml b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/module/pom.xml
new file mode 100644
index 0000000..6d2c1bb
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.1-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/pom.xml b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/pom.xml
similarity index 54%
rename from maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/pom.xml
rename to maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/pom.xml
index 9fd8da5..223aa9a 100644
--- a/maven-enforcer-plugin/src/it/dependencies_not_converging_test_scope/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/dependencies_not_converging_test_scope/pom.xml
@@ -1,6 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
+<!--
+  * 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>test</groupId>
   <artifactId>TestParent</artifactId>
diff --git a/maven-enforcer-plugin/src/it/evaluate-beanshell/pom.xml b/maven-enforcer-plugin/src/it/projects/evaluate-beanshell/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/evaluate-beanshell/pom.xml
rename to maven-enforcer-plugin/src/it/projects/evaluate-beanshell/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/multimodule/invoker.properties b/maven-enforcer-plugin/src/it/projects/multimodule/invoker.properties
new file mode 100644
index 0000000..d77c182
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/multimodule/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.goals = validate
diff --git a/enforcer-api/src/site/site.xml b/maven-enforcer-plugin/src/it/projects/multimodule/module1/pom.xml
similarity index 67%
copy from enforcer-api/src/site/site.xml
copy to maven-enforcer-plugin/src/it/projects/multimodule/module1/pom.xml
index 5d51c8a..549ffeb 100644
--- a/enforcer-api/src/site/site.xml
+++ b/maven-enforcer-plugin/src/it/projects/multimodule/module1/pom.xml
@@ -1,30 +1,32 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-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>
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Writing a custom rule" href="writing-a-custom-rule.html"/>
-    </menu>
-    <menu name="Rule Execution Engines">
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin"/>
-    </menu>
-  </body>
-</project>
\ No newline at end of file
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.enforcer</groupId>
+    <artifactId>multimodule</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>module1</artifactId>
+
+</project>
diff --git a/enforcer-rules/src/site/site.xml b/maven-enforcer-plugin/src/it/projects/multimodule/module2/pom.xml
similarity index 60%
copy from enforcer-rules/src/site/site.xml
copy to maven-enforcer-plugin/src/it/projects/multimodule/module2/pom.xml
index da8b9d2..f6de11a 100644
--- a/enforcer-rules/src/site/site.xml
+++ b/maven-enforcer-plugin/src/it/projects/multimodule/module2/pom.xml
@@ -1,31 +1,39 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-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>
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Rule API" href="../enforcer-api/"/>
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin/"/>
-    </menu>
-    <menu name="Custom Rules">
-      <item name="Writing a custom rule" href="../enforcer-api/writing-a-custom-rule.html"/>
-    </menu>
-  </body>
-</project>
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.enforcer</groupId>
+    <artifactId>multimodule</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>module2</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.its.enforcer</groupId>
+      <artifactId>module1</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/maven-enforcer-plugin/src/it/always-pass/pom.xml b/maven-enforcer-plugin/src/it/projects/multimodule/pom.xml
similarity index 85%
rename from maven-enforcer-plugin/src/it/always-pass/pom.xml
rename to maven-enforcer-plugin/src/it/projects/multimodule/pom.xml
index 2375f8c..6b45cb2 100644
--- a/maven-enforcer-plugin/src/it/always-pass/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/multimodule/pom.xml
@@ -1,54 +1,57 @@
-<?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>
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
-
-  <description>
-  </description>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-enforcer-plugin</artifactId>
-        <version>@project.version@</version>
-        <executions>
-          <execution>
-            <id>test</id>
-            <goals>
-              <goal>enforce</goal>
-            </goals>
-            <configuration>
-              <rules>
-                <AlwaysPass/>
-              </rules>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.enforcer</groupId>
+  <artifactId>multimodule</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <AlwaysPass/>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <modules>
+    <module>module1</module>
+    <module>module2</module>
+  </modules>
+</project>
diff --git a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml b/maven-enforcer-plugin/src/it/projects/require-active-profile-all/pom.xml
similarity index 82%
copy from maven-enforcer-plugin/src/it/require-active-profile/pom.xml
copy to maven-enforcer-plugin/src/it/projects/require-active-profile-all/pom.xml
index b57cce6..c7082dd 100644
--- a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-active-profile-all/pom.xml
@@ -44,7 +44,8 @@ under the License.
             <configuration>
               <rules>
                 <requireActiveProfile>
-                  <profiles>it</profiles>
+                  <profiles>it1,it2,it3</profiles>
+                  <all>true</all>
                 </requireActiveProfile>
               </rules>
             </configuration>
@@ -56,7 +57,19 @@ under the License.
 
   <profiles>
     <profile>
-      <id>it</id>
+      <id>it1</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+    </profile>
+    <profile>
+      <id>it2</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+    </profile>
+    <profile>
+      <id>it3</id>
       <activation>
         <activeByDefault>true</activeByDefault>
       </activation>
diff --git a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml b/maven-enforcer-plugin/src/it/projects/require-active-profile-from-settings/pom.xml
similarity index 79%
copy from maven-enforcer-plugin/src/it/require-active-profile/pom.xml
copy to maven-enforcer-plugin/src/it/projects/require-active-profile-from-settings/pom.xml
index b57cce6..bd9359b 100644
--- a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-active-profile-from-settings/pom.xml
@@ -44,7 +44,9 @@ under the License.
             <configuration>
               <rules>
                 <requireActiveProfile>
-                  <profiles>it</profiles>
+                  <!-- it-repo is activated in the settings.xml -->
+                  <profiles>it1,it2,it3,it-repo</profiles>
+                  <all>true</all>
                 </requireActiveProfile>
               </rules>
             </configuration>
@@ -56,7 +58,19 @@ under the License.
 
   <profiles>
     <profile>
-      <id>it</id>
+      <id>it1</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+    </profile>
+    <profile>
+      <id>it2</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+    </profile>
+    <profile>
+      <id>it3</id>
       <activation>
         <activeByDefault>true</activeByDefault>
       </activation>
diff --git a/maven-enforcer-plugin/src/it/require-active-profile/pom.xml b/maven-enforcer-plugin/src/it/projects/require-active-profile/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-active-profile/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-active-profile/pom.xml
diff --git a/enforcer-api/src/site/site.xml b/maven-enforcer-plugin/src/it/projects/require-file-checksum/LICENSE
similarity index 61%
copy from enforcer-api/src/site/site.xml
copy to maven-enforcer-plugin/src/it/projects/require-file-checksum/LICENSE
index 5d51c8a..a6301e0 100644
--- a/enforcer-api/src/site/site.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-file-checksum/LICENSE
@@ -1,5 +1,3 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
 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
@@ -8,7 +6,7 @@ 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
+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
@@ -16,15 +14,3 @@ software distributed under the License is distributed on an
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
--->
-<project>
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Writing a custom rule" href="writing-a-custom-rule.html"/>
-    </menu>
-    <menu name="Rule Execution Engines">
-      <item name="Maven Enforcer Plugin" href="../../plugins/maven-enforcer-plugin"/>
-    </menu>
-  </body>
-</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/always-fail/pom.xml b/maven-enforcer-plugin/src/it/projects/require-file-checksum/pom.xml
similarity index 50%
copy from maven-enforcer-plugin/src/it/always-fail/pom.xml
copy to maven-enforcer-plugin/src/it/projects/require-file-checksum/pom.xml
index 53c77c8..46e5a44 100644
--- a/maven-enforcer-plugin/src/it/always-fail/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-file-checksum/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <groupId>org.apache.maven.its.enforcer</groupId>
   <artifactId>test</artifactId>
   <version>1.0</version>
-
+  <url>https://issues.apache.org/jira/browse/MENFORCER-247</url>
   <description>
   </description>
 
@@ -43,7 +43,31 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <AlwaysFail/>
+                <requireFileChecksum>
+                  <file>${project.basedir}/LICENSE</file>
+                  <type>md5</type>
+                  <checksum>7c5b65d44e8123e70d24d9eef17e9fa2</checksum>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.basedir}/LICENSE</file>
+                  <type>sha1</type>
+                  <checksum>278661cbaf6a1bcbd34e3877b6de0e8bd7097846</checksum>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.basedir}/LICENSE</file>
+                  <type>sha256</type>
+                  <checksum>61b825d68516541151e5ce0145e54765c48cd5802b886aee8fb8cf1953f02d10</checksum>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.basedir}/LICENSE</file>
+                  <type>sha384</type>
+                  <checksum>6f9e6b81487911c5a339c541016a459acaf8312e430ccabe5c10cb2ddf9a307f4595c78555f911377f4fb853ffe87046</checksum>
+                </requireFileChecksum>
+                <requireFileChecksum>
+                  <file>${project.basedir}/LICENSE</file>
+                  <type>sha512</type>
+                  <checksum>c51c3cf07c87af78dd7af4407ae3993ea1051d8a7c260cf34bbaa41c468dcd3b62d2be3d9a09807a8595d0065e2d75d1bf9ffc8276d567a983ff057f6b51b0cc</checksum>
+                </requireFileChecksum>
               </rules>
             </configuration>
           </execution>
diff --git a/maven-enforcer-plugin/src/it/require-files-dont-exist/pom.xml b/maven-enforcer-plugin/src/it/projects/require-files-dont-exist/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-files-dont-exist/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-files-dont-exist/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-files-exist/pom.xml b/maven-enforcer-plugin/src/it/projects/require-files-exist/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-files-exist/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-files-exist/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-files-size/pom.xml b/maven-enforcer-plugin/src/it/projects/require-files-size/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-files-size/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-files-size/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-java-version/pom.xml b/maven-enforcer-plugin/src/it/projects/require-java-version/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-java-version/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-java-version/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-maven-version/pom.xml b/maven-enforcer-plugin/src/it/projects/require-maven-version/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-maven-version/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-maven-version/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-no-repositories/pom.xml b/maven-enforcer-plugin/src/it/projects/require-no-repositories/pom.xml
similarity index 100%
copy from maven-enforcer-plugin/src/it/require-no-repositories/pom.xml
copy to maven-enforcer-plugin/src/it/projects/require-no-repositories/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/require-no-repositories/pom.xml b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/pom.xml
similarity index 86%
rename from maven-enforcer-plugin/src/it/require-no-repositories/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/pom.xml
index c66de18..2075770 100644
--- a/maven-enforcer-plugin/src/it/require-no-repositories/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/pom.xml
@@ -1,55 +1,60 @@
-<?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>
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
-
-  <description>
-  </description>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-enforcer-plugin</artifactId>
-        <version>@project.version@</version>
-        <executions>
-          <execution>
-            <id>test</id>
-            <goals>
-              <goal>enforce</goal>
-            </goals>
-            <configuration>
-              <rules>
-                <requireNoRepositories>
-                </requireNoRepositories>
-              </rules>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.enforcer</groupId>
+  <artifactId>test</artifactId>
+  <version>1.0</version>
+
+  <repositories>
+    <repository>
+      <id>com.asual.maven.public</id>
+      <name>Asual Public Repository</name>
+      <url>http://localhost</url>
+    </repository>
+  </repositories> 
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireNoRepositories>
+                </requireNoRepositories>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy
similarity index 63%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy
index 5594174..c065765 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy
@@ -1,34 +1,22 @@
-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 org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+/*
+ * 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.
+ */
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' )
+assert buildLog.text.contains( 'Some poms have repositories defined:' )
+assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has repositories [com.asual.maven.public]' )
diff --git a/maven-enforcer-plugin/src/it/require-plugin-versions-custom-packaging/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-custom-packaging/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-plugin-versions-custom-packaging/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-plugin-versions-custom-packaging/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-expressions/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-expressions/invoker.properties
new file mode 100644
index 0000000..aa66e8f
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-expressions/invoker.properties
@@ -0,0 +1,25 @@
+# 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.
+
+# When running with M2.2.1 Maven already fails to download the pom, so it doesn't even reach the rule. Not sure why MRM can't serve this file, but does with M3
+#
+#Caused by: java.io.FileNotFoundException: http://localhost:50910/org/apache/maven/enforcer/its/menforcer126_maven-plugin/1.0/menforcer126_maven-plugin-1.0.pom
+#	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434)
+#	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
+#	at org.apache.maven.wagon.providers.http.LightweightHttpWagon.fillInputData(LightweightHttpWagon.java:115)
+#	... 33 more
+invoker.maven.version=3.0+
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-expressions/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-expressions/pom.xml
new file mode 100644
index 0000000..33321a9
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-expressions/pom.xml
@@ -0,0 +1,155 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requirePluginVersions_Expressions</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <properties>
+    <expressionplugin.groupId>org.apache.maven.enforcer.its</expressionplugin.groupId>
+    <expressionplugin.artifactId>menforcer126_maven-plugin</expressionplugin.artifactId>
+    <expressionplugin.version>1.0</expressionplugin.version>
+  </properties>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>2.5</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>2.6</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.5.1</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.12.4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>2.4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>2.4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>2.7</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-site-plugin</artifactId>
+          <version>3.2</version>
+        </plugin>
+        <plugin>
+          <groupId>${expressionplugin.groupId}</groupId>
+          <artifactId>${expressionplugin.artifactId}</artifactId>
+          <version>${expressionplugin.version}</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requirePluginVersions>
+                  <banSnapshots>false</banSnapshots>
+                </requirePluginVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>${expressionplugin.groupId}</groupId>
+        <artifactId>${expressionplugin.artifactId}</artifactId>
+        <version>${expressionplugin.version}</version>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>${expressionplugin.groupId}</groupId>
+        <artifactId>${expressionplugin.artifactId}</artifactId>
+        <version>${expressionplugin.version}</version>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <profiles>
+    <profile>
+      <id>menforcer126</id>
+      <build>
+        <pluginManagement>
+          <plugins>
+            <plugin>
+              <groupId>${expressionplugin.groupId}</groupId>
+              <artifactId>${expressionplugin.artifactId}</artifactId>
+              <version>${expressionplugin.version}</version>
+            </plugin>
+          </plugins>
+        </pluginManagement>
+        <plugins>
+          <plugin>
+            <groupId>${expressionplugin.groupId}</groupId>
+            <artifactId>${expressionplugin.artifactId}</artifactId>
+            <version>${expressionplugin.version}</version>
+          </plugin>
+        </plugins>
+      </build>
+      <reporting>
+        <plugins>
+          <plugin>
+            <groupId>${expressionplugin.groupId}</groupId>
+            <artifactId>${expressionplugin.artifactId}</artifactId>
+            <version>${expressionplugin.version}</version>
+          </plugin>
+        </plugins>
+      </reporting>
+    </profile>
+  </profiles>
+
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-extensions/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-extensions/pom.xml
new file mode 100644
index 0000000..73faf7b
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-extensions/pom.xml
@@ -0,0 +1,94 @@
+<?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.its.enforcer</groupId>
+  <artifactId>pluginWithExtensions</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>zip</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requirePluginVersions>
+                  <banSnapshots>false</banSnapshots>
+                  <unCheckedPluginList>
+                    org.apache.maven.plugins:maven-clean-plugin,org.apache.maven.plugins:maven-install-plugin,org.apache.maven.plugins:maven-deploy-plugin,org.apache.maven.plugins:maven-site-plugin
+                  </unCheckedPluginList>
+                </requirePluginVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <!-- For https://issues.apache.org/jira/browse/MENFORCER-11 This plugin
+          attaches additional lifecycles "generate-sources" which were failed to be
+          handled correctly. -->
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>pde-maven-plugin</artifactId>
+        <version>1.0-alpha-1</version>
+        <extensions>true</extensions>
+        <configuration>
+          <buildProperties>
+            <pdeProductFilename>example.product</pdeProductFilename>
+          </buildProperties>
+        </configuration>
+        <!-- Also bind to mvn clean -->
+        <executions>
+          <execution>
+            <id>clean-pde</id>
+            <phase>clean</phase>
+            <goals>
+              <goal>clean</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.5</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.5.1</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.12</version>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/META-INF/MANIFEST.MF b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..40fd337
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Bundle-SymbolicName: pluginWithIntegrationTestLifecycle
+Bundle-Version: 1.0.0.qualifier
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/invoker.properties
new file mode 100644
index 0000000..ff7096b
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.maven.version=3.0+
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/pom.xml
new file mode 100644
index 0000000..225209c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-plugin-with-integration-test-lifecycle/pom.xml
@@ -0,0 +1,94 @@
+<?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.its.enforcer</groupId>
+  <artifactId>pluginWithIntegrationTestLifecycle</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+  <properties>
+    <tycho-version>0.19.0</tycho-version><!-- minimum 0.18.1: depends on https://bugs.eclipse.org/bugs/show_bug.cgi?id=406056 -->
+  </properties>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requirePluginVersions>
+                  <banSnapshots>false</banSnapshots>
+                  <unCheckedPluginList>
+                    org.apache.maven.plugins:maven-clean-plugin,org.apache.maven.plugins:maven-install-plugin,org.apache.maven.plugins:maven-deploy-plugin,org.apache.maven.plugins:maven-site-plugin
+                  </unCheckedPluginList>
+                </requirePluginVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <!-- For https://issues.apache.org/jira/browse/MENFORCER-11 This plugin
+          attaches additional lifecycles "integration-test" which were failed to be
+          handled correctly. -->
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-maven-plugin</artifactId>
+        <version>${tycho-version}</version>
+        <extensions>true</extensions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>target-platform-configuration</artifactId>
+        <version>${tycho-version}</version>
+        <configuration>
+          <!-- recommended: use p2-based target platform resolver -->
+          <resolver>p2</resolver>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-compiler-plugin</artifactId>
+        <version>${tycho-version}</version>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-packaging-plugin</artifactId>
+        <version>${tycho-version}</version>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-plugin</artifactId>
+        <version>${tycho-version}</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.4.3</version>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-projectGAVexpressions/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-projectGAVexpressions/pom.xml
new file mode 100644
index 0000000..f2ed9c7
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-projectGAVexpressions/pom.xml
@@ -0,0 +1,101 @@
+<?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>${projectGAV.groupId}</groupId>
+  <artifactId>${projectGAV.artifactId}</artifactId>
+  <version>${projectGAV.version}</version>
+
+  <properties>
+    <projectGAV.groupId>org.apache.maven.enforcer.its</projectGAV.groupId>
+    <projectGAV.artifactId>menforcer92</projectGAV.artifactId>
+    <projectGAV.version>1.0</projectGAV.version>
+  </properties>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>2.5</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>2.6</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.5.1</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.12.4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>2.4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>2.4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>2.7</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-site-plugin</artifactId>
+          <version>3.2</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requirePluginVersions>
+                  <banSnapshots>false</banSnapshots>
+                </requirePluginVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/require-plugin-versions/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-plugin-versions/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-plugin-versions/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-property/pom.xml b/maven-enforcer-plugin/src/it/projects/require-property/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-property/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-property/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes/pom.xml b/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes/pom.xml
new file mode 100644
index 0000000..a20df3b
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes/pom.xml
@@ -0,0 +1,63 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requireReleaseDeps</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireReleaseDeps>
+                  <message>No Snapshots Allowed!</message>
+                  <excludes>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer85_api</exclude>
+                  </excludes>
+                </requireReleaseDeps>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer85_api</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+ </project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes_failure/pom.xml
new file mode 100644
index 0000000..cc0de84
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-release-dependencies-excludes_failure/pom.xml
@@ -0,0 +1,63 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requireReleaseDeps</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireReleaseDeps>
+                  <message>No Snapshots Allowed!</message>
+                  <excludes>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer85_api:[2.0,)</exclude>
+                  </excludes>
+                </requireReleaseDeps>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer85_api</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+ </project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/require-release-dependencies/pom.xml b/maven-enforcer-plugin/src/it/projects/require-release-dependencies/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-release-dependencies/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-release-dependencies/pom.xml
diff --git a/maven-enforcer-plugin/src/it/require-release-version/pom.xml b/maven-enforcer-plugin/src/it/projects/require-release-version/pom.xml
similarity index 100%
rename from maven-enforcer-plugin/src/it/require-release-version/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-release-version/pom.xml
diff --git a/maven-enforcer-plugin/src/it/projects/require-same-versions_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-same-versions_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-same-versions_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-same-versions_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-same-versions_failure/pom.xml
new file mode 100644
index 0000000..b920167
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-same-versions_failure/pom.xml
@@ -0,0 +1,87 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requireSameVersion</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireSameVersions>
+                  <buildPlugins>
+                    <buildPlugin>org.apache.maven.plugins:maven-surefire-plugin</buildPlugin>
+                    <buildPlugin>org.apache.maven.plugins:maven-failsafe-plugin</buildPlugin>
+                  </buildPlugins>
+                  <reportPlugins>
+                    <reportPlugin>org.apache.maven.plugins:maven-surefire-report-plugin</reportPlugin>
+                  </reportPlugins>
+                </requireSameVersions>
+                <!-- almost the rule configuration -->
+                <requireSameVersions>
+                  <plugins>
+                    <plugin>org.apache.maven.plugins:maven-surefire-plugin</plugin>
+                    <plugin>org.apache.maven.plugins:maven-failsafe-plugin</plugin>
+                    <plugin>org.apache.maven.plugins:maven-surefire-report-plugin</plugin>
+                  </plugins>
+                </requireSameVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.14</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <version>2.15</version>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+        <version>2.13</version>
+      </plugin>
+    </plugins>
+  </reporting>
+  
+
+ </project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-same-versions_success/pom.xml b/maven-enforcer-plugin/src/it/projects/require-same-versions_success/pom.xml
new file mode 100644
index 0000000..7e61396
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-same-versions_success/pom.xml
@@ -0,0 +1,88 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requireSameVersion</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireSameVersions>
+                  <buildPlugins>
+                    <buildPlugin>org.apache.maven.plugins:maven-surefire-plugin</buildPlugin>
+                    <buildPlugin>org.apache.maven.plugins:maven-failsafe-plugin</buildPlugin>
+                  </buildPlugins>
+                  <reportPlugins>
+                    <reportPlugin>org.apache.maven.plugins:maven-surefire-report-plugin</reportPlugin>
+                  </reportPlugins>
+                </requireSameVersions>
+                <!-- almost the rule configuration -->
+                <requireSameVersions>
+                  <plugins>
+                    <plugin>org.apache.maven.plugins:maven-surefire-plugin</plugin>
+                    <plugin>org.apache.maven.plugins:maven-failsafe-plugin</plugin>
+                    <plugin>org.apache.maven.plugins:maven-surefire-report-plugin</plugin>
+                  </plugins>
+                </requireSameVersions>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.14</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <version>2.14</version>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+        <version>2.14</version>
+      </plugin>
+    </plugins>
+  </reporting>
+  
+
+ </project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-snapshot-version_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-snapshot-version_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-snapshot-version_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/always-fail/pom.xml b/maven-enforcer-plugin/src/it/projects/require-snapshot-version_failure/pom.xml
similarity index 89%
copy from maven-enforcer-plugin/src/it/always-fail/pom.xml
copy to maven-enforcer-plugin/src/it/projects/require-snapshot-version_failure/pom.xml
index 53c77c8..f2e2e1f 100644
--- a/maven-enforcer-plugin/src/it/always-fail/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-snapshot-version_failure/pom.xml
@@ -23,11 +23,10 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
+  <artifactId>menforcer-204</artifactId>
   <version>1.0</version>
 
-  <description>
-  </description>
+  <description>https://issues.apache.org/jira/browse/MENFORCER-204</description>
 
   <build>
     <plugins>
@@ -43,7 +42,7 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <AlwaysFail/>
+                <requireSnapshotVersion/>
               </rules>
             </configuration>
           </execution>
diff --git a/maven-enforcer-plugin/src/it/always-fail/pom.xml b/maven-enforcer-plugin/src/it/projects/require-snapshot-version_success/pom.xml
similarity index 87%
rename from maven-enforcer-plugin/src/it/always-fail/pom.xml
rename to maven-enforcer-plugin/src/it/projects/require-snapshot-version_success/pom.xml
index 53c77c8..0c32f53 100644
--- a/maven-enforcer-plugin/src/it/always-fail/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/require-snapshot-version_success/pom.xml
@@ -23,11 +23,10 @@ under the License.
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.enforcer</groupId>
-  <artifactId>test</artifactId>
-  <version>1.0</version>
+  <artifactId>menforcer-204</artifactId>
+  <version>1.0-SNAPSHOT</version>
 
-  <description>
-  </description>
+  <description>https://issues.apache.org/jira/browse/MENFORCER-204</description>
 
   <build>
     <plugins>
@@ -43,7 +42,7 @@ under the License.
             </goals>
             <configuration>
               <rules>
-                <AlwaysFail/>
+                <requireSnapshotVersion/>
               </rules>
             </configuration>
           </execution>
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/pom.xml
new file mode 100644
index 0000000..4ac3887
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/pom.xml
@@ -0,0 +1,67 @@
+<?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.enforcer.its</groupId>
+  <artifactId>menforcer146-a</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireUpperBoundDeps/>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+        <artifactId>menforcer146-x</artifactId>
+        <version>1.1</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer146-b</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/verify.groovy
new file mode 100644
index 0000000..35b2b66
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_failure/verify.groovy
@@ -0,0 +1,29 @@
+/*
+ * 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 = 'Failed while enforcing RequireUpperBoundDeps. The error(s) are [' + LS+
+'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer146-x:1.1 paths to dependency are:' + LS+
+'+-org.apache.maven.enforcer.its:menforcer146-a:1.0-SNAPSHOT' + LS+
+'  +-org.apache.maven.plugins.enforcer.its:menforcer146-b:1.0' + LS+
+'    +-org.apache.maven.plugins.enforcer.its:menforcer146-x:1.1 (managed) <-- org.apache.maven.plugins.enforcer.its:menforcer146-x:2.1' + LS+
+']' + LS
+assert buildLog.text.contains( message )
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_success/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_success/pom.xml
new file mode 100644
index 0000000..7dd758a
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-managed_success/pom.xml
@@ -0,0 +1,67 @@
+<?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.enforcer.its</groupId>
+  <artifactId>menforcer146-a</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireUpperBoundDeps/>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+        <artifactId>menforcer146-x</artifactId>
+        <version>3.1</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer146-b</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/pom.xml
new file mode 100644
index 0000000..c2c4366
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/pom.xml
@@ -0,0 +1,60 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requireUpperBoundDependenciesUnique</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireUpperBoundDeps>
+                  <uniqueVersions>true</uniqueVersions>
+                </requireUpperBoundDeps>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer134_project</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+ </project>
\ No newline at end of file
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/verify.groovy
similarity index 64%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/verify.groovy
index 5594174..d65ff00 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_failure/verify.groovy
@@ -1,34 +1,21 @@
-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 org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+/*
+ * 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.
+ */
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )
+assert buildLog.text.contains( 'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer134_model:1.0-20130423.042904-7222 paths to dependency are:' )
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_success/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_success/pom.xml
new file mode 100644
index 0000000..17e9e2a
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-unique_success/pom.xml
@@ -0,0 +1,58 @@
+<?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.enforcer.its</groupId>
+  <artifactId>requireUpperBoundDependenciesUnique</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireUpperBoundDeps/> <!-- 'unique' is false by default -->
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer134_project</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+ </project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/invoker.properties
new file mode 100644
index 0000000..c98ac4c
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/module/pom.xml
new file mode 100644
index 0000000..6d2c1bb
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.1-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/pom.xml
new file mode 100644
index 0000000..49701f5
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/pom.xml
@@ -0,0 +1,62 @@
+<?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>menforcer128</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>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+      <!-- 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/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/verify.groovy
new file mode 100644
index 0000000..38bb648
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure/verify.groovy
@@ -0,0 +1,32 @@
+/*
+ * 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 paths to dependency are:'+LS+
+'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
+'  +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0'+LS+
+'and'+LS+
+'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
+'  +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9'+LS+
+'    +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0'+LS
+assert buildLog.text.contains( message )
+
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/module/pom.xml
new file mode 100644
index 0000000..6d2c1bb
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.1-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/pom.xml
new file mode 100644
index 0000000..746e074
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/pom.xml
@@ -0,0 +1,66 @@
+<?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>menforcer128</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>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+      <!-- 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>
+                  <excludes>
+                    <exclude>org.apache.maven.plugins.enforcer.its:menforcer128_api</exclude>
+                  </excludes>
+                </requireUpperBoundDeps>
+              </rules>
+            </configuration>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/verify.groovy
index 5594174..a85ae64 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_ignored/verify.groovy
@@ -1,34 +1,22 @@
-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 org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+/*
+ * 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( 'Ignoring requireUpperBoundDeps in org.apache.maven.plugins.enforcer.its:menforcer128_api' )
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_success/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_success/module/pom.xml
new file mode 100644
index 0000000..6d2c1bb
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_success/module/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+  <parent>
+    <groupId>test</groupId>
+    <artifactId>TestParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>TestModule</artifactId>
+  <version>1.1-SNAPSHOT</version>
+</project>
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_success/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_success/pom.xml
new file mode 100644
index 0000000..107c554
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_success/pom.xml
@@ -0,0 +1,62 @@
+<?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>menforcer128</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.6.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+      <!-- 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/resolve_collect_dependencies/invoker.properties b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/invoker.properties
new file mode 100644
index 0000000..cb255e2
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.goals = clean package
\ No newline at end of file
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
new file mode 100644
index 0000000..aafa75f
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
@@ -0,0 +1,72 @@
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.enforcer</groupId>
+  <artifactId>resolve_collect_dependencies</artifactId>
+  <version>1.0</version>
+  <packaging>pom</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requirePluginVersions />
+              </rules>
+              <fail>false</fail>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.5.5</version>
+        <executions>
+          <execution>
+            <id>assemble</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>src/assembly/extjars.xml</descriptor>
+              </descriptors>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer158_utils</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>
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
new file mode 100644
index 0000000..a3b5433
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
@@ -0,0 +1,31 @@
+<?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. -->
+<assembly   xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+            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">
+    <id>extjars</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <dependencySets>
+        <dependencySet>
+            <!-- Copy including versions -->
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
+            <useTransitiveDependencies>false</useTransitiveDependencies>
+            <useProjectArtifact>false</useProjectArtifact>
+        </dependencySet>
+    </dependencySets>
+</assembly>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/verify.groovy
similarity index 66%
copy from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
copy to maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/verify.groovy
index 5594174..48fc91a 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractStandardEnforcerRule.java
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/verify.groovy
@@ -1,34 +1,20 @@
-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 org.apache.maven.enforcer.rule.api.EnforcerRule;
-
-/**
- * The Class AbstractStandardEnforcerRule.
- */
-public abstract class AbstractStandardEnforcerRule
-    implements EnforcerRule
-{
-
-    /** Specify a friendly message if the rule fails. */
-    public String message = null;
-
-}
+/*
+ * 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.
+ */
+assert new File( basedir, 'target/resolve_collect_dependencies-1.0-extjars.zip' ).isFile()
+
diff --git a/maven-enforcer-plugin/src/it/require-release-dependencies-excludes/goals.txt b/maven-enforcer-plugin/src/it/require-release-dependencies-excludes/goals.txt
deleted file mode 100644
index 1d8e0fd..0000000
--- a/maven-enforcer-plugin/src/it/require-release-dependencies-excludes/goals.txt
+++ /dev/null
@@ -1 +0,0 @@
-validate
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/require-release-dependencies-excludes/pom.xml b/maven-enforcer-plugin/src/it/require-release-dependencies-excludes/pom.xml
deleted file mode 100644
index 5e84f75..0000000
--- a/maven-enforcer-plugin/src/it/require-release-dependencies-excludes/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><project>
-  
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.maven.enforcer.its</groupId>
-  <artifactId>requireReleaseDeps</artifactId>
-  <packaging>jar</packaging>
-  <version>1.0-SNAPSHOT</version>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-enforcer-plugin</artifactId>
-        <version>@project.version@</version>
-        <executions>
-          <execution>
-            <id>enforce</id>
-            <goals>
-              <goal>enforce</goal>
-            </goals>
-            <configuration>
-              <rules>
-                <requireReleaseDeps>
-                  <message>No Snapshots Allowed!</message>
-                  <excludes>
-                    <exclude>org.apache.maven.enforcer:enforcer-api</exclude>
-                  </excludes>
-                </requireReleaseDeps>
-              </rules>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven.enforcer</groupId>
-      <artifactId>enforcer-api</artifactId>
-      <version>@project.version@</version>
-    </dependency>
-  </dependencies>
- </project>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/settings.xml b/maven-enforcer-plugin/src/it/settings.xml
deleted file mode 100644
index c8f77f0..0000000
--- a/maven-enforcer-plugin/src/it/settings.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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.
--->
-
-<settings>
-  <profiles>
-    <profile>
-      <id>it-repo</id>
-      <activation>
-        <activeByDefault>true</activeByDefault>
-      </activation>
-      <repositories>
-        <repository>
-          <id>local.central</id>
-          <url>@localRepositoryUrl@</url>
-          <releases>
-            <enabled>true</enabled>
-          </releases>
-          <snapshots>
-            <enabled>true</enabled>
-          </snapshots>
-        </repository>
-      </repositories>
-      <pluginRepositories>
-        <pluginRepository>
-          <id>local.central</id>
-          <url>@localRepositoryUrl@</url>
-          <releases>
-            <enabled>true</enabled>
-          </releases>
-          <snapshots>
-            <enabled>true</enabled>
-          </snapshots>
-        </pluginRepository>
-      </pluginRepositories>
-    </profile>
-  </profiles>
-</settings>
diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/DisplayInfoMojo.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/DisplayInfoMojo.java
index 467ae0c..1118a3c 100644
--- a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/DisplayInfoMojo.java
+++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/DisplayInfoMojo.java
@@ -21,14 +21,14 @@ package org.apache.maven.plugins.enforcer;
 
 import org.apache.commons.lang.SystemUtils;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.execution.RuntimeInformation;
 import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.path.PathTranslator;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.context.Context;
 import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
@@ -36,45 +36,38 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 /**
  * This goal displays the current platform information.
  *
- * @goal display-info
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: DisplayInfoMojo.java 1127643 2011-05-25 19:24:38Z krosenvold $
- * @threadSafe
+ * @version $Id: DisplayInfoMojo.java 1791757 2017-04-18 07:52:22Z khmarbaise $
  */
+ at Mojo( name = "display-info", threadSafe = true )
 public class DisplayInfoMojo
     extends AbstractMojo
     implements Contextualizable
 {
 
     /**
-     * Path Translator needed by the ExpressionEvaluator
-     *
-     * @component role="org.apache.maven.project.path.PathTranslator"
+     * MojoExecution needed by the ExpressionEvaluator
      */
-    protected PathTranslator translator;
+    @Parameter( defaultValue = "${mojoExecution}", readonly = true, required = true )
+    protected MojoExecution mojoExecution;
 
     /**
      * The MavenSession
-     *
-     * @parameter default-value="${session}"
-     * @readonly
      */
+    @Parameter( defaultValue = "${session}", readonly = true, required = true )
     protected MavenSession session;
 
     /**
      * POM
-     *
-     * @parameter default-value="${project}"
-     * @readonly
-     * @required
      */
+    @Parameter( defaultValue = "${project}", readonly = true, required = true )
     protected MavenProject project;
 
     // set by the contextualize method. Only way to get the
     // plugin's container in 2.0.x
     protected PlexusContainer container;
 
-    public void contextualize ( Context context )
+    public void contextualize( Context context )
         throws ContextException
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
@@ -83,27 +76,15 @@ public class DisplayInfoMojo
     /**
      * Entry point to the mojo
      */
-    public void execute ()
+    public void execute()
         throws MojoExecutionException
     {
-        try
-        {
-            EnforcerExpressionEvaluator evaluator = new EnforcerExpressionEvaluator( session, translator, project );
-            DefaultEnforcementRuleHelper helper = new DefaultEnforcementRuleHelper( session, evaluator, getLog(),
-                                                                                    container );
-            RuntimeInformation rti = (RuntimeInformation) helper.getComponent( RuntimeInformation.class );
-            getLog().info( "Maven Version: " + rti.getApplicationVersion() );
-            getLog().info( "JDK Version: " + SystemUtils.JAVA_VERSION + " normalized as: "
-                               + RequireJavaVersion.normalizeJDKVersion( SystemUtils.JAVA_VERSION_TRIMMED ) );
-            RequireOS os = new RequireOS();
-            os.displayOSInfo( getLog(), true );
-
-        }
-        catch ( ComponentLookupException e )
-        {
-            getLog().warn( "Unable to Lookup component: " + e.getLocalizedMessage() );
-        }
-
+        String mavenVersion = session.getSystemProperties().getProperty( "maven.version" );
+        getLog().info( "Maven Version: " + mavenVersion );
+        getLog().info( "JDK Version: " + SystemUtils.JAVA_VERSION + " normalized as: "
+            + RequireJavaVersion.normalizeJDKVersion( SystemUtils.JAVA_VERSION_TRIMMED ) );
+        RequireOS os = new RequireOS();
+        os.displayOSInfo( getLog(), true );
     }
 
 }
diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
index 5319148..3fc3cfb 100644
--- a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
+++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
@@ -21,15 +21,23 @@ package org.apache.maven.plugins.enforcer;
 
 import java.util.ArrayList;
 import java.util.Hashtable;
-import java.util.Iterator;
+import java.util.List;
 
+import org.apache.maven.enforcer.rule.api.EnforcerLevel;
 import org.apache.maven.enforcer.rule.api.EnforcerRule;
+import org.apache.maven.enforcer.rule.api.EnforcerRule2;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.path.PathTranslator;
 import org.codehaus.plexus.PlexusConstants;
@@ -39,213 +47,212 @@ import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
 /**
- * This goal executes the defined enforcer-rules once per
- * module.
- * 
- * @requiresDependencyResolution test
- * @goal enforce
- * @phase validate
- * @threadSafe
+ * This goal executes the defined enforcer-rules once per module.
+ *
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * @version $Id: EnforceMojo.java 1127643 2011-05-25 19:24:38Z krosenvold $
+ * @version $Id: EnforceMojo.java 1714313 2015-11-14 13:00:58Z khmarbaise $
  */
+// CHECKSTYLE_OFF: LineLength
+ at Mojo( name = "enforce", defaultPhase = LifecyclePhase.VALIDATE, requiresDependencyCollection = ResolutionScope.TEST, threadSafe = true )
+//CHECKSTYLE_ON: LineLength
 public class EnforceMojo
     extends AbstractMojo
     implements Contextualizable
 {
+    /**
+     * This is a static variable used to persist the cached results across plugin invocations.
+     */
+    protected static Hashtable<String, EnforcerRule> cache = new Hashtable<String, EnforcerRule>();
 
     /**
      * Path Translator needed by the ExpressionEvaluator
-     * 
-     * @component role="org.apache.maven.project.path.PathTranslator"
      */
+    @Component( role = PathTranslator.class )
     protected PathTranslator translator;
 
     /**
+     * MojoExecution needed by the ExpressionEvaluator
+     */
+    @Parameter( defaultValue = "${mojoExecution}", readonly = true, required = true )
+    protected MojoExecution mojoExecution;
+
+    /**
      * The MavenSession
-     * 
-     * @parameter expression="${session}"
-     * @readonly
      */
+    @Parameter( defaultValue = "${session}", readonly = true, required = true )
     protected MavenSession session;
 
     /**
      * POM
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     * @required
      */
+    @Parameter( defaultValue = "${project}", readonly = true, required = true )
     protected MavenProject project;
 
     /**
-     * Flag to fail the build if a version check fails.
-     * 
-     * @parameter expression="${enforcer.fail}"
-     *            default-value="true"
+     * Flag to easily skip all checks
      */
-    protected boolean fail = true;
+    @Parameter( property = "enforcer.skip", defaultValue = "false" )
+    protected boolean skip = false;
 
     /**
-     * Flag to easily skip all checks
-     * 
-     * @parameter expression="${enforcer.skip}"
-     *            default-value="false"
+     * Flag to fail the build if a version check fails.
      */
-    protected boolean skip = false;
+    @Parameter( property = "enforcer.fail", defaultValue = "true" )
+    private boolean fail = true;
 
     /**
      * Fail on the first rule that doesn't pass
-     * 
-     * @parameter expression="${enforcer.failFast}"
-     *            default-value="false"
      */
-    protected boolean failFast = false;
+    @Parameter( property = "enforcer.failFast", defaultValue = "false" )
+    private boolean failFast = false;
 
     /**
-     * Array of objects that implement the EnforcerRule
-     * interface to execute.
-     * 
-     * @parameter
-     * @required
+     * Array of objects that implement the EnforcerRule interface to execute.
      */
+    @Parameter( required = true )
     private EnforcerRule[] rules;
-    
-    /**
-     * Use this flag to disable rule result caching. This will cause
-     * all rules to execute on each project even if the rule indicates it can
-     * safely be cached.
-     * @parameter expression="${enforcer.ignoreCache}"
-     *  default-value="false"
-     */
-     protected boolean ignoreCache = false;
-    
+
     /**
-     * This is a static variable used to persist the cached results across plugin invocations.
+     * Use this flag to disable rule result caching. This will cause all rules to execute on each project even if the
+     * rule indicates it can safely be cached.
      */
-     protected static Hashtable cache = new Hashtable();
+    @Parameter( property = "enforcer.ignoreCache", defaultValue = "false" )
+    protected boolean ignoreCache = false;
 
-    
     // set by the contextualize method. Only way to get the
     // plugin's container in 2.0.x
     protected PlexusContainer container;
 
-    public void contextualize ( Context context )
+    public void contextualize( Context context )
         throws ContextException
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
-    
+
+    private boolean havingRules()
+    {
+        return rules != null && rules.length > 0;
+    }
+
     /**
      * Entry point to the mojo
+     * 
+     * @throws MojoExecutionException
      */
-    public void execute ()
+    public void execute()
         throws MojoExecutionException
     {
         Log log = this.getLog();
 
-        EnforcerExpressionEvaluator evaluator = new EnforcerExpressionEvaluator( session, translator, project );
+        EnforcerExpressionEvaluator evaluator =
+            new EnforcerExpressionEvaluator( session, translator, project, mojoExecution );
 
-        // the entire execution can be easily skipped
-        if ( !skip )
+        if ( isSkip() )
         {
-            // list to store exceptions
-            ArrayList list = new ArrayList();
+            log.info( "Skipping Rule Enforcement." );
+            return;
+        }
 
-            // make sure the rules exist
-            if ( rules != null && rules.length > 0 )
-            {
-                String currentRule = "Unknown";
+        if ( !havingRules() )
+        {
+            // CHECKSTYLE_OFF: LineLength
+            throw new MojoExecutionException( "No rules are configured. Use the skip flag if you want to disable execution." );
+            // CHECKSTYLE_ON: LineLength
+        }
 
-                // create my helper
-                EnforcerRuleHelper helper = new DefaultEnforcementRuleHelper( session, evaluator, log, container );
+        // list to store exceptions
+        List<String> list = new ArrayList<String>();
 
-                // if we are only warning, then disable
-                // failFast
-                if ( !fail )
-                {
-                    failFast = false;
-                }
+        String currentRule = "Unknown";
 
-                // go through each rule
-                for ( int i = 0; i < rules.length; i++ )
-                {
+        // create my helper
+        EnforcerRuleHelper helper = new DefaultEnforcementRuleHelper( session, evaluator, log, container );
 
-                    // prevent against empty rules
-                    EnforcerRule rule = rules[i];
-                    if ( rule != null )
+        // if we are only warning, then disable
+        // failFast
+        if ( !fail )
+        {
+            failFast = false;
+        }
+
+        boolean hasErrors = false;
+
+        // go through each rule
+        for ( int i = 0; i < rules.length; i++ )
+        {
+
+            // prevent against empty rules
+            EnforcerRule rule = rules[i];
+            final EnforcerLevel level = getLevel( rule );
+            if ( rule != null )
+            {
+                // store the current rule for
+                // logging purposes
+                currentRule = rule.getClass().getName();
+                log.debug( "Executing rule: " + currentRule );
+                try
+                {
+                    if ( ignoreCache || shouldExecute( rule ) )
                     {
-                        // store the current rule for
-                        // logging purposes
-                        currentRule = rule.getClass().getName();
-                        log.debug( "Executing rule: " + currentRule );
-                        try
-                        {
-                            if ( ignoreCache || shouldExecute( rule ) )
-                            {
-                                // execute the rule
-                                //noinspection SynchronizationOnLocalVariableOrMethodParameter
-                                synchronized ( rule )
-                                {
-                                   rule.execute( helper );
-                                }
-                            }
-                        }
-                        catch ( EnforcerRuleException e )
+                        // execute the rule
+                        // noinspection
+                        // SynchronizationOnLocalVariableOrMethodParameter
+                        synchronized ( rule )
                         {
-                            // i can throw an exception
-                            // because failfast will be
-                            // false if fail is false.
-                            if ( failFast )
-                            {
-                                throw new MojoExecutionException( currentRule + " failed with message:\n"
-                                    + e.getMessage(), e );
-                            }
-                            else
-                            {
-                                list.add( "Rule " + i + ": " + currentRule + " failed with message:\n" + e.getMessage() );
-                                log.debug( "Adding failure due to exception", e );
-                            }
+                            rule.execute( helper );
                         }
                     }
                 }
-
-                // if we found anything
-                if ( !list.isEmpty() )
+                catch ( EnforcerRuleException e )
                 {
-                    Iterator iter = list.iterator();
-                    while ( iter.hasNext() )
+                    // i can throw an exception
+                    // because failfast will be
+                    // false if fail is false.
+                    if ( failFast && level == EnforcerLevel.ERROR )
                     {
-                        String failure = (String) iter.next();
-                        log.warn( failure );
+                        throw new MojoExecutionException( currentRule + " failed with message:\n" + e.getMessage(), e );
                     }
-                    if ( fail )
+                    else
                     {
-                        throw new MojoExecutionException(
-                                                          "Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed." );
+                        if ( level == EnforcerLevel.ERROR )
+                        {
+                            hasErrors = true;
+                            list.add( "Rule " + i + ": " + currentRule + " failed with message:\n" + e.getMessage() );
+                            log.debug( "Adding failure due to exception", e );
+                        }
+                        else
+                        {
+                            list.add( "Rule " + i + ": " + currentRule + " warned with message:\n" + e.getMessage() );
+                            log.debug( "Adding warning due to exception", e );
+                        }
                     }
                 }
             }
-            else
-            {
-                throw new MojoExecutionException(
-                                                  "No rules are configured. Use the skip flag if you want to disable execution." );
-            }
         }
-        else
+
+        // if we found anything
+        // CHECKSTYLE_OFF: LineLength
+        if ( !list.isEmpty() )
         {
-            log.info( "Skipping Rule Enforcement." );
+            for ( String failure : list )
+            {
+                log.warn( failure );
+            }
+            if ( fail && hasErrors )
+            {
+                throw new MojoExecutionException( "Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed." );
+            }
         }
+        // CHECKSTYLE_ON: LineLength
     }
 
     /**
-     * This method determines if a rule should execute based
-     * on the cache
-     * 
-     * @param rule
-     * @return
+     * This method determines if a rule should execute based on the cache
+     *
+     * @param rule the rule to verify
+     * @return {@code true} if rule should be executed, otherwise {@code false}
      */
-    protected boolean shouldExecute ( EnforcerRule rule )
+    protected boolean shouldExecute( EnforcerRule rule )
     {
         if ( rule.isCacheable() )
         {
@@ -257,12 +264,12 @@ public class EnforceMojo
                 log.debug( "Key " + key + " was found in the cache" );
                 if ( rule.isResultValid( (EnforcerRule) cache.get( key ) ) )
                 {
-                    log.debug( "The cached results are still valid. Skipping the rule: "+rule.getClass().getName() );
+                    log.debug( "The cached results are still valid. Skipping the rule: " + rule.getClass().getName() );
                     return false;
                 }
             }
-            
-            //add it to the cache of executed rules
+
+            // add it to the cache of executed rules
             EnforceMojo.cache.put( key, rule );
         }
         return true;
@@ -271,7 +278,7 @@ public class EnforceMojo
     /**
      * @return the fail
      */
-    public boolean isFail ()
+    public boolean isFail()
     {
         return this.fail;
     }
@@ -279,7 +286,7 @@ public class EnforceMojo
     /**
      * @param theFail the fail to set
      */
-    public void setFail ( boolean theFail )
+    public void setFail( boolean theFail )
     {
         this.fail = theFail;
     }
@@ -287,7 +294,7 @@ public class EnforceMojo
     /**
      * @return the rules
      */
-    public EnforcerRule[] getRules ()
+    public EnforcerRule[] getRules()
     {
         return this.rules;
     }
@@ -295,47 +302,75 @@ public class EnforceMojo
     /**
      * @param theRules the rules to set
      */
-    public void setRules ( EnforcerRule[] theRules )
+    public void setRules( EnforcerRule[] theRules )
     {
         this.rules = theRules;
     }
 
     /**
-     * @return the skip
+     * @param theFailFast the failFast to set
      */
-    public boolean isSkip ()
+    public void setFailFast( boolean theFailFast )
     {
-        return this.skip;
+        this.failFast = theFailFast;
+    }
+
+    public boolean isFailFast()
+    {
+        return failFast;
+    }
+
+    protected String createRuleMessage( int i, String currentRule, EnforcerRuleException e )
+    {
+        return "Rule " + i + ": " + currentRule + " failed with message:\n" + e.getMessage();
     }
 
     /**
-     * @param theSkip the skip to set
+     * @param theTranslator the translator to set
      */
-    public void setSkip ( boolean theSkip )
+    public void setTranslator( PathTranslator theTranslator )
     {
-        this.skip = theSkip;
+        this.translator = theTranslator;
     }
 
     /**
-     * @return the failFast
+     * Returns the level of the rule, defaults to {@link EnforcerLevel#ERROR} for backwards compatibility.
+     *
+     * @param rule might be of type {@link EnforcerRule2}.
+     * @return level of the rule.
      */
-    public boolean isFailFast ()
+    private EnforcerLevel getLevel( EnforcerRule rule )
     {
-        return this.failFast;
+        if ( rule instanceof EnforcerRule2 )
+        {
+            return ( (EnforcerRule2) rule ).getLevel();
+        }
+        else
+        {
+            return EnforcerLevel.ERROR;
+        }
     }
 
     /**
-     * @param theFailFast the failFast to set
+     * @return the skip
      */
-    public void setFailFast ( boolean theFailFast )
+    public boolean isSkip()
     {
-        this.failFast = theFailFast;
+        return this.skip;
+    }
+
+    /**
+     * @param theSkip the skip to set
+     */
+    public void setSkip( boolean theSkip )
+    {
+        this.skip = theSkip;
     }
 
     /**
      * @return the project
      */
-    public MavenProject getProject ()
+    public MavenProject getProject()
     {
         return this.project;
     }
@@ -343,7 +378,7 @@ public class EnforceMojo
     /**
      * @param theProject the project to set
      */
-    public void setProject ( MavenProject theProject )
+    public void setProject( MavenProject theProject )
     {
         this.project = theProject;
     }
@@ -351,7 +386,7 @@ public class EnforceMojo
     /**
      * @return the session
      */
-    public MavenSession getSession ()
+    public MavenSession getSession()
     {
         return this.session;
     }
@@ -359,7 +394,7 @@ public class EnforceMojo
     /**
      * @param theSession the session to set
      */
-    public void setSession ( MavenSession theSession )
+    public void setSession( MavenSession theSession )
     {
         this.session = theSession;
     }
@@ -367,16 +402,8 @@ public class EnforceMojo
     /**
      * @return the translator
      */
-    public PathTranslator getTranslator ()
+    public PathTranslator getTranslator()
     {
         return this.translator;
     }
-
-    /**
-     * @param theTranslator the translator to set
-     */
-    public void setTranslator ( PathTranslator theTranslator )
-    {
-        this.translator = theTranslator;
-    }
 }
diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/util/EnforcerUtils.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/util/EnforcerUtils.java
index 463e464..1397415 100644
--- a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/util/EnforcerUtils.java
+++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/util/EnforcerUtils.java
@@ -1,5 +1,23 @@
 package org.apache.maven.plugins.enforcer.util;
 
+/*
+ * 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.
+ */
 
 /**
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
diff --git a/maven-enforcer-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml b/maven-enforcer-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
new file mode 100644
index 0000000..eedcd9c
--- /dev/null
+++ b/maven-enforcer-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+
+<lifecycleMappingMetadata>
+  <pluginExecutions>
+    <pluginExecution>
+      <pluginExecutionFilter>
+        <goals>
+          <goal>enforce</goal>
+        </goals>
+      </pluginExecutionFilter>
+      <action>
+      	<ignore/>
+      </action>
+    </pluginExecution>
+  </pluginExecutions>
+</lifecycleMappingMetadata>
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/site/apt/index.apt b/maven-enforcer-plugin/src/site/apt/index.apt
index 80e3375..5d7fd64 100644
--- a/maven-enforcer-plugin/src/site/apt/index.apt
+++ b/maven-enforcer-plugin/src/site/apt/index.apt
@@ -25,7 +25,8 @@
 
 Maven Enforcer Plugin - The Loving Iron Fist of Maven\x99
 
-  The Enforcer plugin provides goals to control certain environmental constraints such as Maven version, JDK version and OS family along with many more standard rules and user created rules.
+  The Enforcer plugin provides goals to control certain environmental constraints such as Maven version, JDK version and OS family
+  along with many more built-in rules and user created rules.
 
 * Goals Overview
 
@@ -33,15 +34,12 @@ Maven Enforcer Plugin - The Loving Iron Fist of Maven\x99
 
   *{{{./enforce-mojo.html}enforcer:enforce}} executes rules for each project in a multi-project build.
 
-  *{{{./display-info-mojo.html}enforcer:display-info}} display the current information as detected by the standard rules.
+  *{{{./display-info-mojo.html}enforcer:display-info}} display the current information as detected by the built-in rules.
 
 * Usage
 
   General instructions on how to use the Enforcer Plugin can be found on the {{{./usage.html}usage page}}.
-  Last but not least, users occasionally contribute
-  additional examples, tips or errata to the
-  {{{http://docs.codehaus.org/display/MAVENUSER/Enforcer+Plugin}plugin's wiki page}}.
-
+  
   In case you still have questions regarding the plugin's usage, please have a look at the {{{./faq.html}FAQ}} and feel
   free to contact the {{{./mail-lists.html}user mailing list}}. The posts to the mailing list are archived and could
   already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching
@@ -53,4 +51,4 @@ Maven Enforcer Plugin - The Loving Iron Fist of Maven\x99
   entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated.
   Of course, patches are welcome, too. Contributors can check out the project from our
   {{{./source-repository.html}source repository}} and will find supplementary information in the
-  {{{http://maven.apache.org/guides/development/guide-helping.html}guide to helping with Maven}}.
+  {{{/guides/development/guide-helping.html}guide to helping with Maven}}.
diff --git a/maven-enforcer-plugin/src/site/apt/usage.apt.vm b/maven-enforcer-plugin/src/site/apt/usage.apt.vm
index 2c51148..21062e2 100644
--- a/maven-enforcer-plugin/src/site/apt/usage.apt.vm
+++ b/maven-enforcer-plugin/src/site/apt/usage.apt.vm
@@ -39,26 +39,26 @@ Usage
   
   []
 
-* The <<<enforcer:enforce>>> and <<<enforcer:enforce-once>>> mojos
+* The <<<enforcer:enforce>>> mojo
 
-   These goals are meant to be bound to a lifecycle phase and configured in your
+   This goal is meant to be bound to a lifecycle phase and configured in your
    <<<pom.xml>>>. The enforcers execute the configured rules to check for certain constraints. 
-   The available standard rules are described {{{rules/index.html}here}}. Besides the rules to execute, these goals support three options:
+   The available built-in rules are described {{{../enforcer-rules/index.html}here}}. Besides the rules to execute, these goals support three options:
    
-   * {{{enforce-mojo.html#skip}skip}} - a quick way to skip checks via a profile or using <<<-Denforcer.skip=true>>> from the command line.
+   * {{{./enforce-mojo.html#skip}skip}} - a quick way to skip checks via a profile or using <<<-Denforcer.skip=true>>> from the command line.
    
-   * {{{enforce-mojo.html#fail}fail}} - if the goal should fail the build when a rule fails. The default is <<<true>>>. If false, the errors will be logged as warnings.
+   * {{{./enforce-mojo.html#fail}fail}} - if the goal should fail the build when a rule fails. The default is <<<true>>>. If false, the errors will be logged as warnings.
    
-   * {{{enforce-mojo.html#failFast}failFast}} - if the goal should stop checking after the first failure. The default is <<<false>>>.
+   * {{{./enforce-mojo.html#failFast}failFast}} - if the goal should stop checking after the first failure. The default is <<<false>>>.
    
    []
    
    Each rule to be executed should be added to the rules element along with the specific configuration for that rule.
+
+   As of version 1.4, you may add a <<<level>>> element to the rules. Valid values are <<<WARN>>> and <<<ERROR>>>. When
+   <<<level>>> <<<WARN>>> is specified, the rule will only spit out a warning but will not fail the build.
    
-   The <<<enforce>>> goal executes against each project in a multi-project build. The <<<enforce-once>>> goal executes
-   just once per build. This is most effective for the standard rules because the Maven, Java and OS versions will not change between projects in the same build.
-   
-   
+
    Sample Plugin Configuration:
    
 +---+
@@ -78,6 +78,14 @@ Usage
             </goals>
             <configuration>
               <rules>
+                <bannedPlugins>
+                  <!-- will only display a warning but does not fail the build. -->
+                  <level>WARN</level>
+                  <excludes>
+                    <exclude>org.apache.maven.plugins:maven-verifier-plugin</exclude>
+                  </excludes>
+                  <message>Please consider using the maven-invoker-plugin (http://maven.apache.org/plugins/maven-invoker-plugin/)!</message>
+                </bannedPlugins>
                 <requireMavenVersion>
                   <version>2.0.6</version>
                 </requireMavenVersion>
diff --git a/maven-enforcer-plugin/src/site/site.xml b/maven-enforcer-plugin/src/site/site.xml
index 510d7c7..372dd43 100644
--- a/maven-enforcer-plugin/src/site/site.xml
+++ b/maven-enforcer-plugin/src/site/site.xml
@@ -28,13 +28,16 @@ under the License.
       <item name="Goals" href="plugin-info.html"/>
       <item name="Usage" href="usage.html"/>
       <item name="FAQ" href="faq.html"/>
-      <item name="Standard Rules" href="../../enforcer/enforcer-rules/index.html"/>
+      <item name="Built-In Rules" href="../../enforcer/enforcer-rules/index.html"/>
+      <!-- According to https://issues.apache.org/jira/browse/MNGSITE-152 -->
+      <item name="License" href="http://www.apache.org/licenses/"/>
+      <item name="Download" href="../download.html"/>
     </menu>
     <menu name="Custom Rules">
       <item name="Writing a custom rule" href="../../enforcer/enforcer-api/writing-a-custom-rule.html"/>
     </menu>
     <menu name="Resources">
-      <item name="Maven 2.0.x Version Range Syntax" href="http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges" />
+      <item name="Version Ranges" href="https://cwiki.apache.org/confluence/display/MAVENOLD/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges"/>
     </menu>
   </body>
 </project>
diff --git a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java
index 158d619..0fd3a3d 100644
--- a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java
+++ b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java
@@ -1,5 +1,8 @@
 package org.apache.maven.plugins.enforcer;
 
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,10 +24,6 @@ package org.apache.maven.plugins.enforcer;
 
 import junit.framework.TestCase;
 
-import org.apache.maven.execution.RuntimeInformation;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-
 /**
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
  * 
@@ -40,7 +39,6 @@ public class TestDefaultEnforcementRuleHelper
         assertNotNull( helper.getLog() );
         assertNotNull( helper.evaluate( "${session}" ) );
         assertNotNull( helper.evaluate( "${project}" ) );
-        assertNotNull( helper.getComponent( RuntimeInformation.class ) );
 
     }
 }
diff --git a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java
index 862c685..1e2ae42 100644
--- a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java
+++ b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java
@@ -19,25 +19,33 @@ package org.apache.maven.plugins.enforcer;
  * under the License.
  */
 
-import junit.framework.TestCase;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRule;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.runners.MockitoJUnitRunner;
 
 /**
  * Exhaustively check the enforcer mojo.
  * 
  * @author <a href="mailto:brianf at apache.org">Brian Fox</a>
- * 
  */
+ at RunWith( MockitoJUnitRunner.class )
 public class TestEnforceMojo
-    extends TestCase
 {
 
-    public void testEnforceMojo ()
+    @InjectMocks
+    EnforceMojo mojo;
+
+    @Test
+    public void testEnforceMojo()
         throws MojoExecutionException
     {
-        EnforceMojo mojo = new EnforceMojo();
         mojo.setFail( false );
         mojo.setSession( EnforcerTestUtils.getMavenSession() );
         mojo.setProject( new MockProject() );
@@ -89,27 +97,28 @@ public class TestEnforceMojo
 
     }
 
-    public void testCaching () throws MojoExecutionException
+    @Test
+    public void testCaching()
+        throws MojoExecutionException
     {
-        EnforceMojo mojo = new EnforceMojo();
         mojo.setFail( true );
         mojo.setSession( EnforcerTestUtils.getMavenSession() );
         mojo.setProject( new MockProject() );
 
         MockEnforcerRule[] rules = new MockEnforcerRule[10];
-        
-        //check that basic caching works.
+
+        // check that basic caching works.
         rules[0] = new MockEnforcerRule( false, "", true, true );
         rules[1] = new MockEnforcerRule( false, "", true, true );
         mojo.setRules( rules );
 
         EnforceMojo.cache.clear();
         mojo.execute();
-        
-        assertTrue( "Expected this rule to be executed.",rules[0].executed );
-        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
-        
-        //check that skip caching works.
+
+        assertTrue( "Expected this rule to be executed.", rules[0].executed );
+        assertFalse( "Expected this rule not to be executed.", rules[1].executed );
+
+        // check that skip caching works.
         rules[0] = new MockEnforcerRule( false, "", true, true );
         rules[1] = new MockEnforcerRule( false, "", true, true );
         mojo.setRules( rules );
@@ -117,13 +126,13 @@ public class TestEnforceMojo
         EnforceMojo.cache.clear();
         mojo.ignoreCache = true;
         mojo.execute();
-        
-        assertTrue( "Expected this rule to be executed.",rules[0].executed );
-        assertTrue( "Expected this rule to be executed.",rules[1].executed );
-        
+
+        assertTrue( "Expected this rule to be executed.", rules[0].executed );
+        assertTrue( "Expected this rule to be executed.", rules[1].executed );
+
         mojo.ignoreCache = false;
-        
-        //check that different ids are compared.
+
+        // check that different ids are compared.
         rules[0] = new MockEnforcerRule( false, "1", true, true );
         rules[1] = new MockEnforcerRule( false, "2", true, true );
         rules[2] = new MockEnforcerRule( false, "2", true, true );
@@ -131,12 +140,12 @@ public class TestEnforceMojo
 
         EnforceMojo.cache.clear();
         mojo.execute();
-        
-        assertTrue( "Expected this rule to be executed.",rules[0].executed );
-        assertTrue( "Expected this rule to be executed.",rules[1].executed);
-        assertFalse( "Expected this rule not to be executed.",rules[2].executed);
-        
-        //check that future overrides are working
+
+        assertTrue( "Expected this rule to be executed.", rules[0].executed );
+        assertTrue( "Expected this rule to be executed.", rules[1].executed );
+        assertFalse( "Expected this rule not to be executed.", rules[2].executed );
+
+        // check that future overrides are working
         rules[0] = new MockEnforcerRule( false, "1", true, true );
         rules[1] = new MockEnforcerRule( false, "1", false, true );
         rules[2] = null;
@@ -144,11 +153,11 @@ public class TestEnforceMojo
 
         EnforceMojo.cache.clear();
         mojo.execute();
-        
-        assertTrue( "Expected this rule to be executed.",rules[0].executed );
-        assertTrue( "Expected this rule to be executed.",rules[1].executed);
 
-        //check that future isResultValid is used
+        assertTrue( "Expected this rule to be executed.", rules[0].executed );
+        assertTrue( "Expected this rule to be executed.", rules[1].executed );
+
+        // check that future isResultValid is used
         rules[0] = new MockEnforcerRule( false, "1", true, true );
         rules[1] = new MockEnforcerRule( false, "1", true, false );
         rules[2] = null;
@@ -156,59 +165,63 @@ public class TestEnforceMojo
 
         EnforceMojo.cache.clear();
         mojo.execute();
-        
-        assertTrue( "Expected this rule to be executed.",rules[0].executed );
-        assertTrue( "Expected this rule to be executed.",rules[1].executed);
+
+        assertTrue( "Expected this rule to be executed.", rules[0].executed );
+        assertTrue( "Expected this rule to be executed.", rules[1].executed );
 
     }
-    
-    public void testCachePersistence1() throws MojoExecutionException
+
+    @Test
+    public void testCachePersistence1()
+        throws MojoExecutionException
     {
-        EnforceMojo mojo = new EnforceMojo();
         mojo.setFail( true );
         mojo.setSession( EnforcerTestUtils.getMavenSession() );
         mojo.setProject( new MockProject() );
 
         MockEnforcerRule[] rules = new MockEnforcerRule[10];
-        
-        //check that basic caching works.
+
+        // check that basic caching works.
         rules[0] = new MockEnforcerRule( false, "", true, true );
         rules[1] = new MockEnforcerRule( false, "", true, true );
         mojo.setRules( rules );
 
         EnforceMojo.cache.clear();
         mojo.execute();
-        
-        assertTrue( "Expected this rule to be executed.",rules[0].executed );
-        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
-        
+
+        assertTrue( "Expected this rule to be executed.", rules[0].executed );
+        assertFalse( "Expected this rule not to be executed.", rules[1].executed );
+
     }
-    
-    public void testCachePersistence2() throws MojoExecutionException
+
+    @Test
+    public void testCachePersistence2()
+        throws MojoExecutionException
     {
-        EnforceMojo mojo = new EnforceMojo();
         mojo.setFail( true );
         mojo.setSession( EnforcerTestUtils.getMavenSession() );
         mojo.setProject( new MockProject() );
 
         MockEnforcerRule[] rules = new MockEnforcerRule[10];
-        
-        //check that basic caching works.
+
+        // check that basic caching works.
         rules[0] = new MockEnforcerRule( false, "", true, true );
         rules[1] = new MockEnforcerRule( false, "", true, true );
         mojo.setRules( rules );
 
         mojo.execute();
-        
-        assertFalse( "Expected this rule not to be executed.",rules[0].executed);
-        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
-        
+
+        assertFalse( "Expected this rule not to be executed.", rules[0].executed );
+        assertFalse( "Expected this rule not to be executed.", rules[1].executed );
+
     }
-    
-    public void testCachePersistence3() throws MojoExecutionException
+
+    @Test
+    public void testCachePersistence3()
+        throws MojoExecutionException
     {
         System.gc();
-        
+
         try
         {
             Thread.sleep( 1000 );
@@ -216,23 +229,22 @@ public class TestEnforceMojo
         catch ( InterruptedException e )
         {
         }
-        
-        EnforceMojo mojo = new EnforceMojo();
+
         mojo.setFail( true );
         mojo.setSession( EnforcerTestUtils.getMavenSession() );
         mojo.setProject( new MockProject() );
 
         MockEnforcerRule[] rules = new MockEnforcerRule[10];
-        
-        //check that basic caching works.
+
+        // check that basic caching works.
         rules[0] = new MockEnforcerRule( false, "", true, true );
         rules[1] = new MockEnforcerRule( false, "", true, true );
         mojo.setRules( rules );
 
         mojo.execute();
-        
-        assertFalse( "Expected this rule not to be executed.",rules[0].executed);
-        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
-        
+
+        assertFalse( "Expected this rule not to be executed.", rules[0].executed );
+        assertFalse( "Expected this rule not to be executed.", rules[1].executed );
+
     }
 }
diff --git a/pom.xml b/pom.xml
index b063ebe..69690da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,19 +1,19 @@
 <?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
+  ~ or more contributor license agreements. See the NOTICE file
   ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ 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
+  ~ with the License. You may obtain a copy of the License at
   ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~ 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
+  ~ KIND, either express or implied. See the License for the
   ~ specific language governing permissions and limitations
   ~ under the License.
 -->
@@ -23,108 +23,19 @@
   <parent>
     <artifactId>maven-parent</artifactId>
     <groupId>org.apache.maven</groupId>
-    <version>19</version>
+    <version>30</version>
     <relativePath>../pom/maven/pom.xml</relativePath>
   </parent>
   <groupId>org.apache.maven.enforcer</groupId>
   <artifactId>enforcer</artifactId>
-  <version>1.0.1</version>
+  <version>1.4.2</version>
   <packaging>pom</packaging>
 
-  <name>Enforcer</name>
+  <name>Apache Maven Enforcer</name>
   <description>Enforcer is a build rule execution framework.</description>
-  <url>http://maven.apache.org/enforcer</url>
+  <url>http://maven.apache.org/enforcer/</url>
   <inceptionYear>2007</inceptionYear>
 
-  <developers>
-    <developer>
-      <id>brianf</id>
-      <name>Brian Fox</name>
-      <email>brianf at apache.org</email>
-      <roles>
-        <role>Lead Developer</role>
-      </roles>
-      <timezone>5</timezone>
-    </developer>
-  </developers>
-
-  <mailingLists>
-    <mailingList>
-      <name>Maven User List</name>
-      <subscribe>users-subscribe at maven.apache.org</subscribe>
-      <unsubscribe>users-unsubscribe at maven.apache.org</unsubscribe>
-      <post>users at maven.apache.org</post>
-      <archive>http://mail-archives.apache.org/mod_mbox/maven-users</archive>
-      <otherArchives>
-        <otherArchive>http://www.mail-archive.com/users@maven.apache.org/</otherArchive>
-        <otherArchive>http://old.nabble.com/Maven---Users-f178.html</otherArchive>
-        <otherArchive>http://maven.users.markmail.org/</otherArchive>
-      </otherArchives>
-    </mailingList>
-    <mailingList>
-      <name>Maven Developer List</name>
-      <subscribe>dev-subscribe at maven.apache.org</subscribe>
-      <unsubscribe>dev-unsubscribe at maven.apache.org</unsubscribe>
-      <post>dev at maven.apache.org</post>
-      <archive>http://mail-archives.apache.org/mod_mbox/maven-dev</archive>
-      <otherArchives>
-        <otherArchive>http://www.mail-archive.com/dev@maven.apache.org/</otherArchive>
-        <otherArchive>http://old.nabble.com/Maven-Developers-f179.html</otherArchive>
-        <otherArchive>http://maven.dev.markmail.org/</otherArchive>
-      </otherArchives>
-    </mailingList>
-    <mailingList>
-      <name>Maven Issues List</name>
-      <subscribe>issues-subscribe at maven.apache.org</subscribe>
-      <unsubscribe>issues-unsubscribe at maven.apache.org</unsubscribe>
-      <archive>http://mail-archives.apache.org/mod_mbox/maven-issues/</archive>
-      <otherArchives>
-        <otherArchive>http://www.mail-archive.com/issues@maven.apache.org</otherArchive>
-        <otherArchive>http://old.nabble.com/Maven---Issues-f15573.html</otherArchive>
-        <otherArchive>http://maven.issues.markmail.org/</otherArchive>
-      </otherArchives>
-    </mailingList>
-    <mailingList>
-      <name>Maven Commits List</name>
-      <subscribe>commits-subscribe at maven.apache.org</subscribe>
-      <unsubscribe>commits-unsubscribe at maven.apache.org</unsubscribe>
-      <archive>http://mail-archives.apache.org/mod_mbox/maven-dev</archive>
-      <otherArchives>
-        <otherArchive>http://www.mail-archive.com/commits@maven.apache.org</otherArchive>
-        <otherArchive>http://old.nabble.com/Maven---Commits-f15575.html</otherArchive>
-        <otherArchive>http://maven.commits.markmail.org/</otherArchive>
-      </otherArchives>
-    </mailingList>
-    <!-- duplication from parent pom - temporary until they inherit properly (MNG-3124) -->
-    <mailingList>
-      <name>Maven Announcements List</name>
-      <post>announce at maven.apache.org</post>
-      <subscribe>announce-subscribe at maven.apache.org</subscribe>
-      <unsubscribe>announce-unsubscribe at maven.apache.org</unsubscribe>
-      <archive>http://mail-archives.apache.org/mod_mbox/maven-announce/</archive>
-      <otherArchives>
-        <otherArchive>http://www.mail-archive.com/announce@maven.apache.org</otherArchive>
-        <otherArchive>http://old.nabble.com/Maven-Announcements-f15617.html</otherArchive>
-        <otherArchive>http://maven.announce.markmail.org/</otherArchive>
-      </otherArchives>
-    </mailingList>
-    <mailingList>
-      <name>Maven Notifications List</name>
-      <subscribe>notifications-subscribe at maven.apache.org</subscribe>
-      <unsubscribe>notifications-unsubscribe at maven.apache.org</unsubscribe>
-      <archive>http://mail-archives.apache.org/mod_mbox/maven-notifications/</archive>
-      <otherArchives>
-        <otherArchive>http://www.mail-archive.com/notifications@maven.apache.org</otherArchive>
-        <otherArchive>http://old.nabble.com/Maven---Notifications-f15574.html</otherArchive>
-        <otherArchive>http://maven.notifications.markmail.org/</otherArchive>
-      </otherArchives>
-    </mailingList>
-  </mailingLists>
-
-  <prerequisites>
-    <maven>2.0.6</maven>
-  </prerequisites>
-
   <modules>
     <module>enforcer-api</module>
     <module>enforcer-rules</module>
@@ -132,13 +43,13 @@
   </modules>
 
   <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/maven/enforcer/tags/1.0.1</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/enforcer/tags/1.0.1</developerConnection>
-    <url>http://svn.apache.org/viewcvs.cgi/maven/enforcer/tags/1.0.1</url>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/maven/enforcer/tags/enforcer-1.4.2</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/enforcer/tags/enforcer-1.4.2</developerConnection>
+    <url>http://svn.apache.org/viewvc/maven/enforcer/tags/enforcer-1.4.2</url>
   </scm>
   <issueManagement>
     <system>jira</system>
-    <url>http://jira.codehaus.org/browse/MENFORCER</url>
+    <url>https://issues.apache.org/jira/browse/MENFORCER</url>
   </issueManagement>
   <ciManagement>
     <system>Jenkins</system>
@@ -147,13 +58,13 @@
   <distributionManagement>
     <site>
       <id>apache.website</id>
-      <url>scp://people.apache.org/www/maven.apache.org/enforcer/</url>
+      <url>scm:svn:https://svn.apache.org/repos/infra/websites/production/maven/components/${maven.site.path}</url>
     </site>
   </distributionManagement>
   <properties>
-    <maven.version>2.0.9</maven.version>
-    <maven.plugin.plugin.version>2.7</maven.plugin.plugin.version>
-    <site.deploy.url>scp://people.apache.org/www/maven.apache.org</site.deploy.url>
+    <maven.version>3.0</maven.version>
+    <mavenPluginPluginVersion>3.3</mavenPluginPluginVersion>
+    <maven.site.path>enforcer-archives/enforcer-LATEST</maven.site.path>
   </properties>
 
   <dependencyManagement>
@@ -187,74 +98,78 @@
       </dependency>
       <dependency>
         <groupId>org.apache.maven</groupId>
-        <artifactId>maven-project</artifactId>
+        <artifactId>maven-core</artifactId>
         <version>${maven.version}</version>
       </dependency>
       <dependency>
         <groupId>org.apache.maven</groupId>
-        <artifactId>maven-core</artifactId>
+        <artifactId>maven-compat</artifactId>
         <version>${maven.version}</version>
       </dependency>
+
       <dependency>
         <groupId>org.apache.maven.shared</groupId>
         <artifactId>maven-common-artifact-filters</artifactId>
-        <version>1.2</version>
+        <version>3.0.1</version>
       </dependency>
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-utils</artifactId>
-        <version>1.5.8</version>
+        <version>3.0.24</version>
       </dependency>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>3.8.2</version>
-        <scope>test</scope>
+        <version>4.11</version>
       </dependency>
       <dependency>
-        <groupId>easymock</groupId>
-        <artifactId>easymock</artifactId>
-        <version>1.2_Java1.3</version>
+        <groupId>org.mockito</groupId>
+        <artifactId>mockito-core</artifactId>
+        <version>1.9.5</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>commons-lang</groupId>
         <artifactId>commons-lang</artifactId>
-        <version>2.3</version>
+        <version>2.6</version>
       </dependency>
       <dependency>
-        <groupId>org.apache.maven.shared</groupId>
+        <groupId>commons-codec</groupId>
+        <artifactId>commons-codec</artifactId>
+        <version>1.6</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven.plugin-testing</groupId>
         <artifactId>maven-plugin-testing-harness</artifactId>
+        <version>2.1</version>
         <scope>test</scope>
-        <version>1.1</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven.shared</groupId>
+        <artifactId>maven-dependency-tree</artifactId>
+        <version>2.2</version>
+      </dependency>
+      <dependency>
+        <groupId>org.assertj</groupId>
+        <artifactId>assertj-core</artifactId>
+        <version>1.7.1</version>
       </dependency>
     </dependencies>
   </dependencyManagement>
 
+  <contributors>
+    <contributor>
+      <name>Simon Wang</name>
+      <email>wangyf2010 at gmail.com</email>
+      <organization>eBay Inc.</organization>
+    </contributor>
+  </contributors>
   <build>
-    <resources>
-      <!-- Include super-pom defined main/resources
-        Removing this section will break the build.
-        Since we have defined a new build/resources
-        section for the Apache process LICENSE and NOTICE
-        files, this original default section is now
-        required. -->
-      <resource>
-        <directory>${basedir}/src/main/resources</directory>
-      </resource>
-    </resources>
     <pluginManagement>
       <plugins>
         <plugin>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <configuration>
-            <source>1.5</source>
-            <target>1.5</target>
-          </configuration>
-        </plugin>
-        <plugin>
           <artifactId>maven-plugin-plugin</artifactId>
-          <version>${maven.plugin.plugin.version}</version>
+          <version>${mavenPluginPluginVersion}</version>
         </plugin>
         <plugin>
           <artifactId>maven-release-plugin</artifactId>
@@ -262,37 +177,49 @@
             <tagBase>https://svn.apache.org/repos/asf/maven/enforcer/tags</tagBase>
           </configuration>
         </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-site-plugin</artifactId>
+          <configuration>
+            <topSiteURL>scm:svn:https://svn.apache.org/repos/infra/websites/production/maven/components/${maven.site.path}</topSiteURL>
+          </configuration>
+        </plugin>
       </plugins>
     </pluginManagement>
+    <plugins>
+      <plugin> <!-- TODO overriding 1.0-beta-3 from maven-parent-30.pom which fails with https://github.com/mojohaus/extra-enforcer-rules/issues/13 -->
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>extra-enforcer-rules</artifactId>
+            <version>1.0-beta-6</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
   </build>
 
   <reporting>
     <plugins>
       <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>cobertura-maven-plugin</artifactId>
-        <version>2.4</version>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
-        <version>2.7</version>
         <configuration>
-           <tagletArtifacts>
-             <tagletArtifact>
-                <groupId>org.apache.maven.plugin-tools</groupId>
-                <artifactId>maven-plugin-tools-javadoc</artifactId>
-                <version>2.6</version>
-             </tagletArtifact>
-             <tagletArtifact>
-               <groupId>org.codehaus.plexus</groupId>
-               <artifactId>plexus-javadoc</artifactId>
-               <version>1.0</version>
-             </tagletArtifact>
-           </tagletArtifacts>
-          </configuration>
-       </plugin>
+          <linksource>true</linksource>
+          <notimestamp>true</notimestamp>
+        </configuration>
+        <reportSets>
+          <reportSet>
+            <id>aggregate</id>
+            <inherited>false</inherited>
+            <reports>
+              <report>aggregate</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
     </plugins>
   </reporting>
-
 </project>
diff --git a/src/site/resources/download.cgi b/src/site/resources/download.cgi
new file mode 100644
index 0000000..1b178d2
--- /dev/null
+++ b/src/site/resources/download.cgi
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# 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.
+#
+# Just call the standard mirrors.cgi script. It will use download.html
+# as the input template.
+exec /www/www.apache.org/dyn/mirrors/mirrors.cgi $*
\ No newline at end of file
diff --git a/src/site/site.xml b/src/site/site.xml
index dd8c6fb..273dd8e 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -18,18 +18,28 @@ specific language governing permissions and limitations
 under the License.
 -->
 <project>
-  <!-- TODO remove when using Maven Parent 11+ -->
-  <skin>
-    <groupId>org.apache.maven.skins</groupId>
-    <artifactId>maven-stylus-skin</artifactId>
-    <version>1.1</version>
-  </skin>
+  <custom>
+    <fluidoSkin>
+      <sourceLineNumbersEnabled>true</sourceLineNumbersEnabled>
+      <googlePlusOne />
+      <googleSearch>
+        <sitesearch>https://maven.apache.org/enforcer/</sitesearch>
+      </googleSearch>
+    </fluidoSkin>
+  </custom>
+
   <body>
     <breadcrumbs>
-      <!-- TODO: This breadcrumb should be removed when it has been solved in the parent -->
-      <item name="Maven" href="http://maven.apache.org/index.html" />
-      <item name="Enforcer" href="http://maven.apache.org/enforcer/index.html" />
+      <item name="Enforcer" href="https://maven.apache.org/enforcer/index.html" />
     </breadcrumbs>
+
+    <menu name="Overview">
+      <item name="Introduction" href="index.html"/>
+      <!-- According to https://issues.apache.org/jira/browse/MNGSITE-152 -->
+      <item name="License" href="http://www.apache.org/licenses/"/>
+      <item name="Download" href="download.html"/>
+    </menu>
+
     <menu ref="modules" />
   </body>
 </project>
diff --git a/src/site/xdoc/download.xml.vm b/src/site/xdoc/download.xml.vm
new file mode 100644
index 0000000..e883f17
--- /dev/null
+++ b/src/site/xdoc/download.xml.vm
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+
+<!--
+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.
+-->
+
+<document>
+  <properties>
+    <title>Download ${project.name} Source</title>
+  </properties>
+  <body>
+    <section name="Download ${project.name} ${project.version} Source">
+
+      <p>${project.name} ${project.version} is distributed in source format. Use a source archive if you intend to build
+      ${project.name} yourself. Otherwise, simply use the ready-made binary artifacts from central repository.</p>
+
+      <p>You will be prompted for a mirror - if the file is not found on yours, please be patient, as it may take 24
+      hours to reach all mirrors.<p/>
+
+      <p>In order to guard against corrupted downloads/installations, it is highly recommended to
+      <a href="http://www.apache.org/dev/release-signing#verifying-signature">verify the signature</a>
+      of the release bundles against the public <a href="http://www.apache.org/dist/maven/KEYS">KEYS</a> used by the Apache Maven
+      developers.</p>
+
+      <p>${project.name} is distributed under the <a href="http://www.apache.org/licenses/">Apache License, version 2.0</a>.</p>
+
+      <p></p>We <b>strongly</b> encourage our users to configure a Maven repository mirror closer to their location, please read <a href="/guides/mini/guide-mirror-settings.html">How to Use Mirrors for Repositories</a>.</p>
+
+      <a name="mirror"/>
+      <subsection name="Mirror">
+
+        <p>
+          [if-any logo]
+          <a href="[link]">
+            <img align="right" src="[logo]" border="0"
+                 alt="logo"/>
+          </a>
+          [end]
+          The currently selected mirror is
+          <b>[preferred]</b>.
+          If you encounter a problem with this mirror,
+          please select another mirror.
+          If all mirrors are failing, there are
+          <i>backup</i>
+          mirrors
+          (at the end of the mirrors list) that should be available.
+        </p>
+
+        <form action="[location]" method="get" id="SelectMirror">
+          Other mirrors:
+          <select name="Preferred">
+            [if-any http]
+            [for http]
+            <option value="[http]">[http]</option>
+            [end]
+            [end]
+            [if-any ftp]
+            [for ftp]
+            <option value="[ftp]">[ftp]</option>
+            [end]
+            [end]
+            [if-any backup]
+            [for backup]
+            <option value="[backup]">[backup] (backup)</option>
+            [end]
+            [end]
+          </select>
+          <input type="submit" value="Change"/>
+        </form>
+
+        <p>
+          You may also consult the
+          <a href="http://www.apache.org/mirrors/">complete list of
+            mirrors.</a>
+        </p>
+
+      </subsection>
+      
+      <subsection name="${project.name} ${project.version}">
+        
+      <p>This is the current stable version of ${project.name}.</p>
+        
+      <table>
+        <thead>
+          <tr>
+            <th></th>
+            <th>Link</th>
+            <th>Checksum</th>
+            <th>Signature</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>${project.name} ${project.version} (Source zip)</td>
+            <td><a href="[preferred]maven/archetype/${project.artifactId}-${project.version}-source-release.zip">maven/archetype/${project.artifactId}-${project.version}-source-release.zip</a></td>
+            <td><a href="http://www.apache.org/dist/maven/archetype/${project.artifactId}-${project.version}-source-release.zip.md5">maven/archetype/${project.artifactId}-${project.version}-source-release.zip.md5</a></td>
+            <td><a href="http://www.apache.org/dist/maven/archetype/${project.artifactId}-${project.version}-source-release.zip.asc">maven/archetype/${project.artifactId}-${project.version}-source-release.zip.asc</a></td>
+          </tr>
+        </tbody>
+      </table>
+      </subsection>
+
+      <subsection name="Previous Versions">
+        
+      <p>Older non-recommended releases can be found on our <a href="http://archive.apache.org/dist/maven/archetype/">archive site</a>.</p>
+
+      </subsection>
+    </section>
+  </body>
+</document>
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/maven-enforcer.git



More information about the pkg-java-commits mailing list