diff --git a/.gitignore b/.gitignore
index 1f42d27..6e0a5c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 .classpath
 .settings
 .idea/
+.svn
 *.iml
 .settings
 .classpath
diff --git a/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm b/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm
index 17d43a3..4b9a1df 100644
--- a/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm
+++ b/enforcer-rules/src/site/apt/banDistributionManagement.apt.vm
@@ -75,7 +75,7 @@
 +---+
 
   The above configuration will prevent any declaration of distributionManagement
-  in your pom files at all whereas the parent is simply ignored.
+  in your pom files except in the parent.
   
   Let use take a look at the following project which is a typical multi-module project.
  
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
index a7bf182..ca18152 100644
--- 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
@@ -223,26 +223,18 @@
                                                                                     Site site )
         throws ExpressionEvaluationException
     {
-        project = mock( MavenProject.class );
-        when( project.getPackaging() ).thenReturn( "jar" );
-        when( project.getDistributionManagement() ).thenReturn( null );
-
-        MavenProject parentProject = mock( MavenProject.class );
+        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 );
         when( parentProject.getDistributionManagement() ).thenReturn( dmParent );
-
         when( project.getParent() ).thenReturn( parentProject );
 
-        helper = mock( EnforcerRuleHelper.class );
-        when( helper.evaluate( "${project}" ) ).thenReturn( project );
-        BanDistributionManagement rule = new BanDistributionManagement();
-
-        when( helper.getLog() ).thenReturn( mock( Log.class ) );
+        BanDistributionManagement rule = setupEnforcerRule();
 
         return rule;
     }
@@ -250,15 +242,9 @@
     private BanDistributionManagement setupProjectWithoutDistributionManagement()
         throws ExpressionEvaluationException
     {
-        project = mock( MavenProject.class );
-        when( project.getPackaging() ).thenReturn( "jar" );
-        when( project.getDistributionManagement() ).thenReturn( null );
+        project = setupProject( null );
 
-        helper = mock( EnforcerRuleHelper.class );
-        when( helper.evaluate( "${project}" ) ).thenReturn( project );
-        BanDistributionManagement rule = new BanDistributionManagement();
-
-        when( helper.getLog() ).thenReturn( mock( Log.class ) );
+        BanDistributionManagement rule = setupEnforcerRule();
 
         return rule;
     }
@@ -268,21 +254,35 @@
                                                                               Site site )
         throws ExpressionEvaluationException
     {
-        project = mock( MavenProject.class );
-        when( project.getPackaging() ).thenReturn( "jar" );
         DistributionManagement dm = mock( DistributionManagement.class );
         when( dm.getRepository() ).thenReturn( repository );
         when( dm.getSnapshotRepository() ).thenReturn( snapshotRepository );
         when( dm.getSite() ).thenReturn( site );
 
-        when( project.getDistributionManagement() ).thenReturn( dm );
+        project = setupProject( dm );
 
+        BanDistributionManagement rule = setupEnforcerRule();
+
+        return rule;
+    }
+
+    private MavenProject setupProject( DistributionManagement distributionManagement )
+    {
+        MavenProject project = mock( MavenProject.class );
+        when( project.getPackaging() ).thenReturn( "jar" );
+        when( project.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;
     }
+
 }
