diff --git a/pom.xml b/pom.xml
index 4922ce8..d0dfb36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,6 +83,19 @@
     </dependency>
 
     <dependency>
+      <groupId>org.sonatype.aether</groupId>
+      <artifactId>aether-util</artifactId>
+      <version>1.7</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-util</artifactId>
+      <version>0.9.0.M2</version>
+      <scope>provided</scope>
+    </dependency>
+    
+    <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-container-default</artifactId>
       <version>1.5.5</version>
diff --git a/src/main/java/org/apache/maven/shared/artifact/filter/resolve/ScopeFilter.java b/src/main/java/org/apache/maven/shared/artifact/filter/resolve/ScopeFilter.java
index 50450b9..67ac41b 100644
--- a/src/main/java/org/apache/maven/shared/artifact/filter/resolve/ScopeFilter.java
+++ b/src/main/java/org/apache/maven/shared/artifact/filter/resolve/ScopeFilter.java
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -60,6 +61,17 @@
     }
 
     /**
+     * Construct a ScopeFilter based on included scopes  
+     * 
+     * @param included the scopes to include, must not be {@code null}
+     * @return the filter, never {@code null}
+     */
+    public static ScopeFilter including( String... included ) 
+    {
+        return new ScopeFilter( Arrays.asList( included ), null );
+    }
+
+    /**
      * Construct a ScopeFilter based on excluded scopes
      * 
      * @param excluded the scopes to exclude, may be {@code null}
@@ -71,6 +83,17 @@
     }
 
     /**
+     * Construct a ScopeFilter based on excluded scopes
+     * 
+     * @param excluded the scopes to exclude, must not be {@code null}
+     * @return the filter, never {@code null}
+     */
+    public static ScopeFilter excluding( String... excluded ) 
+    {
+        return new ScopeFilter( null, Arrays.asList( excluded ) );
+    }
+
+    /**
      * Get the excluded scopes
      * 
      * @return the scopes to exclude, may be {@code null}
diff --git a/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformer.java b/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformer.java
index bf329ae..1713002 100644
--- a/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformer.java
+++ b/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformer.java
@@ -33,6 +33,7 @@
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.util.filter.AndDependencyFilter;
 import org.eclipse.aether.util.filter.ExclusionsDependencyFilter;
+import org.eclipse.aether.util.filter.OrDependencyFilter;
 import org.eclipse.aether.util.filter.PatternExclusionsDependencyFilter;
 import org.eclipse.aether.util.filter.PatternInclusionsDependencyFilter;
 import org.eclipse.aether.util.filter.ScopeDependencyFilter;
@@ -64,14 +65,14 @@
     }
 
     @Override
-    public AndDependencyFilter transform( OrFilter orFilter )
+    public OrDependencyFilter transform( OrFilter orFilter )
     {
         Collection<DependencyFilter> filters = new ArrayList<DependencyFilter>();
         for ( TransformableFilter filter : orFilter.getFilters() )
         {
             filters.add( filter.transform( this ) );
         }
-        return new AndDependencyFilter( filters );
+        return new OrDependencyFilter( filters );
     }
 
     @Override
diff --git a/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformerTest.java b/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformerTest.java
new file mode 100644
index 0000000..37b0431
--- /dev/null
+++ b/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/EclipseAetherFilterTransformerTest.java
@@ -0,0 +1,100 @@
+package org.apache.maven.shared.artifact.filter.resolve.transform;
+
+/*
+ * 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.Arrays;
+import java.util.Collections;
+
+import org.apache.maven.shared.artifact.filter.resolve.AndFilter;
+import org.apache.maven.shared.artifact.filter.resolve.ExclusionsFilter;
+import org.apache.maven.shared.artifact.filter.resolve.OrFilter;
+import org.apache.maven.shared.artifact.filter.resolve.PatternExclusionsFilter;
+import org.apache.maven.shared.artifact.filter.resolve.PatternInclusionsFilter;
+import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.eclipse.aether.util.filter.AndDependencyFilter;
+import org.eclipse.aether.util.filter.ExclusionsDependencyFilter;
+import org.eclipse.aether.util.filter.OrDependencyFilter;
+import org.eclipse.aether.util.filter.PatternExclusionsDependencyFilter;
+import org.eclipse.aether.util.filter.PatternInclusionsDependencyFilter;
+import org.eclipse.aether.util.filter.ScopeDependencyFilter;
+import org.junit.Test;
+
+public class EclipseAetherFilterTransformerTest
+{
+
+    private EclipseAetherFilterTransformer transformer = new EclipseAetherFilterTransformer();
+
+    @Test
+    public void testTransformAndFilter()
+    {
+        AndFilter filter = new AndFilter( Arrays.<TransformableFilter>asList( ScopeFilter.including( "compile" ), 
+                                                                              ScopeFilter.including( "test" ) ) );
+
+        AndDependencyFilter dependencyFilter = (AndDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformExclusionsFilter()
+    {
+        ExclusionsFilter filter = new ExclusionsFilter( Collections.singletonList( "runtime" ) );
+
+        ExclusionsDependencyFilter dependencyFilter = (ExclusionsDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformOrFilter()
+    {
+        OrFilter filter = new OrFilter( Arrays.<TransformableFilter>asList( ScopeFilter.including( "compile" ), 
+                                                                            ScopeFilter.including( "test" ) ) );
+
+        OrDependencyFilter dependencyFilter = (OrDependencyFilter) filter.transform( transformer );
+
+    }
+
+    @Test
+    public void testTransformScopeFilter()
+    {
+        ScopeFilter filter = ScopeFilter.including( Collections.singletonList( "runtime" ) );
+
+        ScopeDependencyFilter dependencyFilter = (ScopeDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformPatternExclusionsFilter()
+    {
+        PatternExclusionsFilter filter =
+            new PatternExclusionsFilter( Collections.singletonList( "org.apache.maven:*" ) );
+
+        PatternExclusionsDependencyFilter dependencyFilter =
+            (PatternExclusionsDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformPatternInclusionsFilter()
+    {
+        PatternInclusionsFilter filter =
+            new PatternInclusionsFilter( Collections.singletonList( "org.apache.maven:*" ) );
+
+        PatternInclusionsDependencyFilter dependencyFilter =
+            (PatternInclusionsDependencyFilter) filter.transform( transformer );
+    }
+
+}
diff --git a/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/SonatypeAetherFilterTransformerTest.java b/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/SonatypeAetherFilterTransformerTest.java
new file mode 100644
index 0000000..f60e4c2
--- /dev/null
+++ b/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/SonatypeAetherFilterTransformerTest.java
@@ -0,0 +1,100 @@
+package org.apache.maven.shared.artifact.filter.resolve.transform;
+
+/*
+ * 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.Arrays;
+import java.util.Collections;
+
+import org.apache.maven.shared.artifact.filter.resolve.AndFilter;
+import org.apache.maven.shared.artifact.filter.resolve.ExclusionsFilter;
+import org.apache.maven.shared.artifact.filter.resolve.OrFilter;
+import org.apache.maven.shared.artifact.filter.resolve.PatternExclusionsFilter;
+import org.apache.maven.shared.artifact.filter.resolve.PatternInclusionsFilter;
+import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.sonatype.aether.util.filter.AndDependencyFilter;
+import org.sonatype.aether.util.filter.ExclusionsDependencyFilter;
+import org.sonatype.aether.util.filter.OrDependencyFilter;
+import org.sonatype.aether.util.filter.PatternExclusionsDependencyFilter;
+import org.sonatype.aether.util.filter.PatternInclusionsDependencyFilter;
+import org.sonatype.aether.util.filter.ScopeDependencyFilter;
+import org.junit.Test;
+
+public class SonatypeAetherFilterTransformerTest
+{
+
+    private SonatypeAetherFilterTransformer transformer = new SonatypeAetherFilterTransformer();
+
+    @Test
+    public void testTransformAndFilter()
+    {
+        AndFilter filter = new AndFilter( Arrays.<TransformableFilter>asList( ScopeFilter.including( "compile" ), 
+                                                                              ScopeFilter.including( "test" ) ) );
+
+        AndDependencyFilter dependencyFilter = (AndDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformExclusionsFilter()
+    {
+        ExclusionsFilter filter = new ExclusionsFilter( Collections.singletonList( "runtime" ) );
+
+        ExclusionsDependencyFilter dependencyFilter = (ExclusionsDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformOrFilter()
+    {
+        OrFilter filter = new OrFilter( Arrays.<TransformableFilter>asList( ScopeFilter.including( "compile" ), 
+                                                                            ScopeFilter.including( "test" ) ) );
+
+        OrDependencyFilter dependencyFilter = (OrDependencyFilter) filter.transform( transformer );
+
+    }
+
+    @Test
+    public void testTransformScopeFilter()
+    {
+        ScopeFilter filter = ScopeFilter.including( Collections.singletonList( "runtime" ) );
+
+        ScopeDependencyFilter dependencyFilter = (ScopeDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformPatternExclusionsFilter()
+    {
+        PatternExclusionsFilter filter =
+            new PatternExclusionsFilter( Collections.singletonList( "org.apache.maven:*" ) );
+
+        PatternExclusionsDependencyFilter dependencyFilter =
+            (PatternExclusionsDependencyFilter) filter.transform( transformer );
+    }
+
+    @Test
+    public void testTransformPatternInclusionsFilter()
+    {
+        PatternInclusionsFilter filter =
+            new PatternInclusionsFilter( Collections.singletonList( "org.apache.maven:*" ) );
+
+        PatternInclusionsDependencyFilter dependencyFilter =
+            (PatternInclusionsDependencyFilter) filter.transform( transformer );
+    }
+
+}
