diff --git a/src/test/java/org/apache/maven/shared/artifact/filter/PatternArtifactFilterTCK.java b/src/test/java/org/apache/maven/shared/artifact/filter/PatternArtifactFilterTCK.java
index 68c0155..13e56e8 100644
--- a/src/test/java/org/apache/maven/shared/artifact/filter/PatternArtifactFilterTCK.java
+++ b/src/test/java/org/apache/maven/shared/artifact/filter/PatternArtifactFilterTCK.java
@@ -40,7 +40,9 @@
 
     protected abstract ArtifactFilter createFilter( List patterns, boolean actTransitively );
 
-    public void testShouldTriggerBothPatternsWithWildcards( final boolean reverse )
+    protected abstract boolean isInclusionExpected();
+
+    public void testShouldTriggerBothPatternsWithWildcards()
     {
         final String groupId1 = "group";
         final String artifactId1 = "artifact";
@@ -59,7 +61,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac1.artifact ) );
             assertFalse( filter.include( mac2.artifact ) );
@@ -73,7 +75,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldTriggerBothPatternsWithNonColonWildcards( final boolean reverse )
+    public void testShouldTriggerBothPatternsWithNonColonWildcards()
     {
         final String groupId1 = "group";
         final String artifactId1 = "artifact";
@@ -92,7 +94,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac1.artifact ) );
             assertFalse( filter.include( mac2.artifact ) );
@@ -106,7 +108,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId( final boolean reverse )
+    public void testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -117,7 +119,7 @@
 
         final ArtifactFilter filter = createFilter( Collections.singletonList( groupId + ":" + artifactId ) );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -129,7 +131,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId( final boolean reverse )
+    public void testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -140,7 +142,7 @@
 
         final ArtifactFilter filter = createFilter( Collections.singletonList( groupId + ":" + artifactId + ":jar" ) );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -152,7 +154,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldNotIncludeWhenGroupIdDiffers( final boolean reverse )
+    public void testShouldNotIncludeWhenGroupIdDiffers()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -167,7 +169,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertTrue( filter.include( mac.artifact ) );
         }
@@ -179,7 +181,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldNotIncludeWhenArtifactIdDiffers( final boolean reverse )
+    public void testShouldNotIncludeWhenArtifactIdDiffers()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -195,7 +197,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertTrue( filter.include( mac.artifact ) );
         }
@@ -207,7 +209,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldNotIncludeWhenBothIdElementsDiffer( final boolean reverse )
+    public void testShouldNotIncludeWhenBothIdElementsDiffer()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -223,7 +225,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertTrue( filter.include( mac.artifact ) );
         }
@@ -235,7 +237,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled( final boolean reverse )
+    public void testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -252,7 +254,7 @@
 
         final ArtifactFilter filter = createFilter( patterns, true );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -264,7 +266,7 @@
         mockManager.verifyAll();
     }
 
-    public void testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard( final boolean reverse )
+    public void testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -281,7 +283,7 @@
 
         final ArtifactFilter filter = createFilter( patterns, true );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -293,7 +295,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldNotIncludeWhenNegativeMatch( final boolean reverse )
+    public void testShouldNotIncludeWhenNegativeMatch()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -308,7 +310,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertTrue( filter.include( mac.artifact ) );
         }
@@ -320,7 +322,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeWhenWildcardMatchesInsideSequence( final boolean reverse )
+    public void testShouldIncludeWhenWildcardMatchesInsideSequence()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -335,7 +337,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -347,7 +349,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeWhenWildcardMatchesOutsideSequence( final boolean reverse )
+    public void testShouldIncludeWhenWildcardMatchesOutsideSequence()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -362,7 +364,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -374,7 +376,7 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId( final boolean reverse )
+    public void testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId()
     {
         final String groupId = "group";
         final String artifactId = "some-artifact-id";
@@ -389,7 +391,7 @@
 
         final ArtifactFilter filter = createFilter( patterns );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertFalse( filter.include( mac.artifact ) );
         }
@@ -401,7 +403,34 @@
         mockManager.verifyAll();
     }
 
-    public void testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent( final boolean reverse )
+    public void testShouldIncludeWhenWildcardCoversPartOfGroupIdAndEverythingElse()
+    {
+        final String groupId = "some.group.id";
+        final String artifactId = "some-artifact-id";
+
+        final ArtifactMockAndControl mac = new ArtifactMockAndControl( groupId, artifactId );
+
+        mockManager.replayAll();
+
+        final List patterns = new ArrayList();
+
+        patterns.add( "some.group*" );
+
+        final ArtifactFilter filter = createFilter( patterns );
+
+        if ( !isInclusionExpected() )
+        {
+            assertFalse( filter.include( mac.artifact ) );
+        }
+        else
+        {
+            assertTrue( filter.include( mac.artifact ) );
+        }
+
+        mockManager.verifyAll();
+    }
+
+    public void testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent()
     {
         final String groupId = "group";
         final String artifactId = "artifact";
@@ -422,7 +451,7 @@
 
         final ArtifactFilter filter = createFilter( patterns, true );
 
-        if ( reverse )
+        if ( !isInclusionExpected() )
         {
             assertTrue( filter.include( otherMac.artifact ) );
             assertFalse( filter.include( mac.artifact ) );
@@ -458,7 +487,7 @@
     //
     // ArtifactFilter filter = createFilter( patterns, true );
     //
-    // if ( reverse )
+    // if ( isInclusionExpected() )
     // {
     // assertTrue( filter.include( otherMac.artifact ) );
     // assertFalse( filter.include( mac.artifact ) );
diff --git a/src/test/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilterTest.java b/src/test/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilterTest.java
index 1b6db12..37ed345 100644
--- a/src/test/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilterTest.java
@@ -31,91 +31,144 @@
     private final PatternArtifactFilterTCK tck = new PatternArtifactFilterTCK()
     {
 
+        @Override
         protected ArtifactFilter createFilter( final List patterns )
         {
             return new PatternExcludesArtifactFilter( patterns );
         }
 
+        @Override
         protected ArtifactFilter createFilter( final List patterns, final boolean actTransitively )
         {
             return new PatternExcludesArtifactFilter( patterns, actTransitively );
         }
 
+        @Override
+        protected boolean isInclusionExpected()
+        {
+            return false;
+        }
+
     };
 
     public void testShouldTriggerBothPatternsWithNonColonWildcards()
     {
-        tck.testShouldTriggerBothPatternsWithNonColonWildcards( true );
+        tck.testShouldTriggerBothPatternsWithNonColonWildcards();
     }
 
     public void testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard()
     {
-        tck.testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard( true );
+        tck.testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard();
     }
 
     public void testShouldTriggerBothPatternsWithWildcards()
     {
-        tck.testShouldTriggerBothPatternsWithWildcards( true );
+        tck.testShouldTriggerBothPatternsWithWildcards();
     }
 
     public void testShouldNotIncludeDirectlyMatchedArtifactByDependencyConflictId()
     {
-        tck.testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId( true );
+        tck.testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId();
     }
 
     public void testShouldNotIncludeDirectlyMatchedArtifactByGroupIdArtifactId()
     {
-        tck.testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId( true );
+        tck.testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId();
     }
 
     public void testShouldNotIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled()
     {
-        tck.testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled( true );
+        tck.testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled();
     }
 
     public void testShouldIncludeWhenArtifactIdDiffers()
     {
-        tck.testShouldNotIncludeWhenArtifactIdDiffers( true );
+        tck.testShouldNotIncludeWhenArtifactIdDiffers();
     }
 
     public void testShouldIncludeWhenBothIdElementsDiffer()
     {
-        tck.testShouldNotIncludeWhenBothIdElementsDiffer( true );
+        tck.testShouldNotIncludeWhenBothIdElementsDiffer();
     }
 
     public void testShouldIncludeWhenGroupIdDiffers()
     {
-        tck.testShouldNotIncludeWhenGroupIdDiffers( true );
+        tck.testShouldNotIncludeWhenGroupIdDiffers();
     }
 
     public void testShouldIncludeWhenNegativeMatch()
     {
-        tck.testShouldNotIncludeWhenNegativeMatch( true );
+        tck.testShouldNotIncludeWhenNegativeMatch();
     }
 
     public void testShouldNotIncludeWhenWildcardMatchesInsideSequence()
     {
-        tck.testShouldIncludeWhenWildcardMatchesInsideSequence( true );
+        tck.testShouldIncludeWhenWildcardMatchesInsideSequence();
     }
 
     public void testShouldIncludeWhenWildcardMatchesOutsideSequence()
     {
-        tck.testShouldIncludeWhenWildcardMatchesOutsideSequence( true );
+        tck.testShouldIncludeWhenWildcardMatchesOutsideSequence();
     }
 
     public void testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent()
     {
-        tck.testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent( true );
+        tck.testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent();
     }
 
     public void testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId()
     {
-        tck.testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId( true );
+        tck.testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId();
+    }
+
+    public void testShouldIncludeWhenWildcardCoversPartOfGroupIdAndEverythingElse()
+    {
+        tck.testShouldIncludeWhenWildcardCoversPartOfGroupIdAndEverythingElse();
+    }
+
+    public void testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId()
+    {
+        tck.testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId();
+    }
+
+    public void testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId()
+    {
+        tck.testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId();
+    }
+
+    public void testShouldNotIncludeWhenGroupIdDiffers()
+    {
+        tck.testShouldNotIncludeWhenGroupIdDiffers();
+    }
+
+    public void testShouldNotIncludeWhenArtifactIdDiffers()
+    {
+        tck.testShouldNotIncludeWhenArtifactIdDiffers();
+    }
+
+    public void testShouldNotIncludeWhenBothIdElementsDiffer()
+    {
+        tck.testShouldNotIncludeWhenBothIdElementsDiffer();
+    }
+
+    public void testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled()
+    {
+        tck.testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled();
+    }
+
+    public void testShouldNotIncludeWhenNegativeMatch()
+    {
+        tck.testShouldNotIncludeWhenNegativeMatch();
+    }
+
+    public void testShouldIncludeWhenWildcardMatchesInsideSequence()
+    {
+        tck.testShouldIncludeWhenWildcardMatchesInsideSequence();
     }
 
     // See comment in TCK.
     // public void testShouldIncludeDirectDependencyWhenInvertedWildcardMatchesButDoesntMatchTransitiveChild()
     // {
-    // tck.testShouldIncludeDirectDependencyWhenInvertedWildcardMatchesButDoesntMatchTransitiveChild( true );
+    // tck.testShouldIncludeDirectDependencyWhenInvertedWildcardMatchesButDoesntMatchTransitiveChild();
     // }
 }
diff --git a/src/test/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilterTest.java b/src/test/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilterTest.java
index d6178b3..cbd97db 100644
--- a/src/test/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilterTest.java
+++ b/src/test/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilterTest.java
@@ -30,91 +30,104 @@
     private final PatternArtifactFilterTCK tck = new PatternArtifactFilterTCK()
     {
 
+        @Override
         protected ArtifactFilter createFilter( final List patterns )
         {
             return new PatternIncludesArtifactFilter( patterns );
         }
 
+        @Override
         protected ArtifactFilter createFilter( final List patterns, final boolean actTransitively )
         {
             return new PatternIncludesArtifactFilter( patterns, actTransitively );
         }
 
+        @Override
+        protected boolean isInclusionExpected()
+        {
+            return true;
+        }
+
     };
 
     public void testShouldTriggerBothPatternsWithNonColonWildcards()
     {
-        tck.testShouldTriggerBothPatternsWithNonColonWildcards( false );
+        tck.testShouldTriggerBothPatternsWithNonColonWildcards();
     }
 
     public void testShouldTriggerBothPatternsWithWildcards()
     {
-        tck.testShouldTriggerBothPatternsWithWildcards( false );
+        tck.testShouldTriggerBothPatternsWithWildcards();
     }
 
     public void testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId()
     {
-        tck.testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId( false );
+        tck.testShouldIncludeDirectlyMatchedArtifactByDependencyConflictId();
     }
 
     public void testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId()
     {
-        tck.testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId( false );
+        tck.testShouldIncludeDirectlyMatchedArtifactByGroupIdArtifactId();
     }
 
     public void testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled()
     {
-        tck.testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled( false );
+        tck.testShouldIncludeWhenPatternMatchesDependencyTrailAndTransitivityIsEnabled();
     }
 
     public void testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard()
     {
-        tck.testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard( false );
+        tck.testIncludeWhenPatternMatchesDepTrailWithTransitivityUsingNonColonWildcard();
     }
 
     public void testShouldNotIncludeWhenArtifactIdDiffers()
     {
-        tck.testShouldNotIncludeWhenArtifactIdDiffers( false );
+        tck.testShouldNotIncludeWhenArtifactIdDiffers();
     }
 
     public void testShouldNotIncludeWhenBothIdElementsDiffer()
     {
-        tck.testShouldNotIncludeWhenBothIdElementsDiffer( false );
+        tck.testShouldNotIncludeWhenBothIdElementsDiffer();
     }
 
     public void testShouldNotIncludeWhenGroupIdDiffers()
     {
-        tck.testShouldNotIncludeWhenGroupIdDiffers( false );
+        tck.testShouldNotIncludeWhenGroupIdDiffers();
     }
 
     public void testShouldNotIncludeWhenNegativeMatch()
     {
-        tck.testShouldNotIncludeWhenNegativeMatch( false );
+        tck.testShouldNotIncludeWhenNegativeMatch();
     }
 
     public void testShouldIncludeWhenWildcardMatchesInsideSequence()
     {
-        tck.testShouldIncludeWhenWildcardMatchesInsideSequence( false );
+        tck.testShouldIncludeWhenWildcardMatchesInsideSequence();
     }
 
     public void testShouldIncludeWhenWildcardMatchesOutsideSequence()
     {
-        tck.testShouldIncludeWhenWildcardMatchesOutsideSequence( false );
+        tck.testShouldIncludeWhenWildcardMatchesOutsideSequence();
     }
 
     public void testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent()
     {
-        tck.testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent( false );
+        tck.testShouldIncludeTransitiveDependencyWhenWildcardMatchesButDoesntMatchParent();
     }
 
     public void testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId()
     {
-        tck.testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId( false );
+        tck.testShouldIncludeWhenWildcardMatchesMiddleOfArtifactId();
+    }
+
+    public void testShouldIncludeWhenWildcardCoversPartOfGroupIdAndEverythingElse()
+    {
+        tck.testShouldIncludeWhenWildcardCoversPartOfGroupIdAndEverythingElse();
     }
 
     // See comment in TCK.
     // public void testShouldIncludeDirectDependencyWhenInvertedWildcardMatchesButDoesntMatchTransitiveChild()
     // {
-    // tck.testShouldIncludeDirectDependencyWhenInvertedWildcardMatchesButDoesntMatchTransitiveChild( false );
+    // tck.testShouldIncludeDirectDependencyWhenInvertedWildcardMatchesButDoesntMatchTransitiveChild();
     // }
 }
