diff --git a/pom.xml b/pom.xml
index 8511433..0b26abd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,6 +53,10 @@
       <url>scm:svn:https://svn.apache.org/repos/asf/maven/website/components/${maven.site.path}</url>
     </site>
   </distributionManagement>
+  
+  <properties>
+    <javaVersion>7</javaVersion>
+  </properties>
 
   <build>
     <plugins>
@@ -83,7 +87,7 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
-        <version>1.15</version>
+        <version>1.18</version>
         <executions>
           <execution>
             <id>sniff</id>
@@ -94,10 +98,13 @@
           </execution>
         </executions>
         <configuration>
+          <ignores>
+            <ignore>java.lang.invoke.MethodHandle</ignore>
+          </ignores>
           <signature>
             <groupId>org.codehaus.mojo.signature</groupId>
-            <artifactId>java16</artifactId>
-            <version>1.1</version>
+            <artifactId>java17</artifactId>
+            <version>1.0</version>
           </signature>
         </configuration>
       </plugin>
@@ -110,7 +117,7 @@
             <configuration>
               <rules>
                 <enforceBytecodeVersion>
-                  <maxJdkVersion>1.6</maxJdkVersion>
+                  <maxJdkVersion>1.${javaVersion}</maxJdkVersion>
                 </enforceBytecodeVersion>
               </rules>
             </configuration>
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java
index 345e85d..c6f2858 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java
@@ -52,11 +52,7 @@
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactDeployer effectiveArtifactDeployer = container.lookup( ArtifactDeployer.class, hint );
-
-            effectiveArtifactDeployer.deploy( request, mavenArtifacts );
+            getMavenArtifactDeployer( request ).deploy( mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -72,11 +68,7 @@
         validateParameters( request, mavenArtifacts );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactDeployer effectiveArtifactDeployer = container.lookup( ArtifactDeployer.class, hint );
-
-            effectiveArtifactDeployer.deploy( request, remoteRepository, mavenArtifacts );
+            getMavenArtifactDeployer( request ).deploy( remoteRepository, mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -133,4 +125,29 @@
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenArtifactDeployer getMavenArtifactDeployer( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, ArtifactDeployerException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
+            
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven31ArtifactDeployer( repositorySystem, session );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+            
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven30ArtifactDeployer( repositorySystem, session );
+        }
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java
index 83cc6a2..0f5908d 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java
@@ -25,13 +25,9 @@
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
 import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven30MetadataBridge;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -43,33 +39,35 @@
 /**
  * 
  */
-@Component( role = ArtifactDeployer.class, hint = "maven3" )
 class Maven30ArtifactDeployer
-    implements ArtifactDeployer
+    implements MavenArtifactDeployer
 {
 
-    @Requirement
-    private RepositorySystem repositorySystem;
-
-    @Override
-    public void deploy( ProjectBuildingRequest buildingRequest,
-                        Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                            throws ArtifactDeployerException
+    private final RepositorySystem repositorySystem;
+    
+    private final RepositorySystemSession session;
+    
+    Maven30ArtifactDeployer( RepositorySystem repositorySystem, RepositorySystemSession session )
     {
-        deploy( buildingRequest, null, mavenArtifacts );
+        this.repositorySystem = repositorySystem;
+        this.session = session;
     }
 
     @Override
-    public void deploy( ProjectBuildingRequest buildingRequest, ArtifactRepository remoteRepository,
+    public void deploy( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+                            throws ArtifactDeployerException
+    {
+        deploy( null, mavenArtifacts );
+    }
+
+    @Override
+    public void deploy( ArtifactRepository remoteRepository,
                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                             throws ArtifactDeployerException
     {
         // prepare request
         DeployRequest request = new DeployRequest();
 
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         RemoteRepository defaultRepository = null;
 
         if ( remoteRepository != null )
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java
index 71594de..1a2b640 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java
@@ -25,13 +25,9 @@
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
 import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven31MetadataBridge;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -43,33 +39,36 @@
 /**
  * 
  */
-@Component( role = ArtifactDeployer.class, hint = "maven31" )
 class Maven31ArtifactDeployer
-    implements ArtifactDeployer
+    implements MavenArtifactDeployer
 {
 
-    @Requirement
-    private RepositorySystem repositorySystem;
-
-    @Override
-    public void deploy( ProjectBuildingRequest buildingRequest,
-                        Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                            throws ArtifactDeployerException
+    private final RepositorySystem repositorySystem;
+    
+    private final RepositorySystemSession session;
+    
+    Maven31ArtifactDeployer( RepositorySystem repositorySystem, RepositorySystemSession session )
     {
-        deploy( buildingRequest, null, mavenArtifacts );
+        super();
+        this.repositorySystem = repositorySystem;
+        this.session = session;
     }
 
-    /** {@inheritDoc} */
-    public void deploy( ProjectBuildingRequest buildingRequest, ArtifactRepository remoteRepository,
+    @Override
+    public void deploy( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+                            throws ArtifactDeployerException
+    {
+        deploy( null, mavenArtifacts );
+    }
+
+    @Override
+    public void deploy( ArtifactRepository remoteRepository,
                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                             throws ArtifactDeployerException
     {
         // prepare request
         DeployRequest request = new DeployRequest();
 
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         RemoteRepository defaultRepository = null;
 
         if ( remoteRepository != null )
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/MavenArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/MavenArtifactDeployer.java
new file mode 100644
index 0000000..c4f0446
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/MavenArtifactDeployer.java
@@ -0,0 +1,42 @@
+package org.apache.maven.shared.transfer.artifact.deploy.internal;
+
+/*
+ * 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.Collection;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenArtifactDeployer
+{
+
+    void deploy( Collection<Artifact> mavenArtifacts )
+        throws ArtifactDeployerException;
+
+    void deploy( ArtifactRepository remoteRepository, Collection<Artifact> mavenArtifacts )
+        throws ArtifactDeployerException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java
index 574d208..f8a56f7 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java
@@ -26,6 +26,7 @@
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
+import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.annotations.Component;
@@ -41,8 +42,9 @@
 class DefaultArtifactInstaller
     implements ArtifactInstaller, Contextualizable
 {
-
     private PlexusContainer container;
+    
+    private RepositoryManager repositoryManager;
 
     @Override
     public void install( ProjectBuildingRequest request, Collection<Artifact> mavenArtifacts )
@@ -51,11 +53,7 @@
         validateParameters( request, mavenArtifacts );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactInstaller effectiveArtifactInstaller = container.lookup( ArtifactInstaller.class, hint );
-
-            effectiveArtifactInstaller.install( request, mavenArtifacts );
+            getMavenArtifactInstaller( request ).install( mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -78,14 +76,13 @@
         }
 
         // TODO: Should we check for exists() ?
+        
+        // update local repo in request 
+        ProjectBuildingRequest newRequest = repositoryManager.setLocalRepositoryBasedir( request, localRepositry );
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactInstaller effectiveArtifactInstaller = container.lookup( ArtifactInstaller.class, hint );
-
-            effectiveArtifactInstaller.install( request, localRepositry, mavenArtifacts );
+            getMavenArtifactInstaller( newRequest ).install( mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -142,4 +139,29 @@
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenArtifactInstaller getMavenArtifactInstaller( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, ArtifactInstallerException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
+            
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            return new Maven31ArtifactInstaller( repositorySystem, session );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+            
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            return new Maven30ArtifactInstaller( repositorySystem, session );
+        }
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java
index 260beec..2a15dfd 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java
@@ -19,20 +19,14 @@
  * under the License.
  */
 
-import java.io.File;
 import java.util.Collection;
 
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven30MetadataBridge;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -43,30 +37,24 @@
 /**
  * 
  */
-@Component( role = ArtifactInstaller.class, hint = "maven3" )
 class Maven30ArtifactInstaller
-    implements ArtifactInstaller
+    implements MavenArtifactInstaller
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
     
-    @Requirement
-    private RepositoryManager repositoryManager; 
+    private final RepositorySystemSession session; 
+    
+    Maven30ArtifactInstaller( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public void install( ProjectBuildingRequest buildingRequest,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                             throws ArtifactInstallerException
+    public void install( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+        throws ArtifactInstallerException
     {
-        install( buildingRequest, null, mavenArtifacts );
-    }
-    
-    @Override
-    public void install( ProjectBuildingRequest buildingRequest, File localRepository,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                             throws ArtifactInstallerException
-    {
-     // prepare installRequest
+        // prepare installRequest
         InstallRequest request = new InstallRequest();
 
         // transform artifacts
@@ -100,14 +88,10 @@
             }
         }
 
-        if ( localRepository != null )
-        {
-            buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepository );
-        }
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
+//        if ( localRepository != null )
+//        {
+//            buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepository );
+//        }
         
         // install
         try
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java
index d922b97..e4eae74 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java
@@ -19,20 +19,14 @@
  * under the License.
  */
 
-import java.io.File;
 import java.util.Collection;
 
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven31MetadataBridge;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -43,27 +37,22 @@
 /**
  * 
  */
-@Component( role = ArtifactInstaller.class, hint = "maven31" )
 class Maven31ArtifactInstaller
-    implements ArtifactInstaller
+    implements MavenArtifactInstaller
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private RepositoryManager repositoryManager;
-
-    @Override
-    public void install( ProjectBuildingRequest buildingRequest,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                             throws ArtifactInstallerException
-    {
-        install( buildingRequest, null, mavenArtifacts );
-    }
+    private final RepositorySystemSession session;
     
+    Maven31ArtifactInstaller( RepositorySystem repositorySystem,
+                                     RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
+
     @Override
-    public void install( ProjectBuildingRequest buildingRequest, File localRepository,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+    public void install( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                              throws ArtifactInstallerException
     {
         // prepare installRequest
@@ -100,14 +89,6 @@
             }
         }
         
-        if ( localRepository != null )
-        {
-            buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepository );
-        }
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         // install
         try
         {
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/MavenArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/MavenArtifactInstaller.java
new file mode 100644
index 0000000..7670d57
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/MavenArtifactInstaller.java
@@ -0,0 +1,36 @@
+package org.apache.maven.shared.transfer.artifact.install.internal;
+
+/*
+ * 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.Collection;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenArtifactInstaller
+{
+    void install( Collection<Artifact> mavenArtifacts )
+        throws ArtifactInstallerException;
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java
index ae709a5..9f1826b 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java
@@ -19,6 +19,9 @@
  * under the License.
  */
 
+import java.util.List;
+
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
@@ -33,6 +36,7 @@
 import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
+
 /**
  * 
  */
@@ -49,11 +53,7 @@
         validateParameters( buildingRequest, mavenArtifact );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveArtifact( buildingRequest, mavenArtifact );
+            return getMavenArtifactResolver( buildingRequest ).resolveArtifact( mavenArtifact );
         }
         catch ( ComponentLookupException e )
         {
@@ -68,11 +68,7 @@
         validateParameters( buildingRequest, coordinate );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveArtifact( buildingRequest, coordinate );
+            return getMavenArtifactResolver( buildingRequest ).resolveArtifact( coordinate );
         }
         catch ( ComponentLookupException e )
         {
@@ -137,4 +133,44 @@
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenArtifactResolver getMavenArtifactResolver( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, ArtifactResolverException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
+            
+            @SuppressWarnings( "unchecked" )
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
+                                                                           List.class,
+                                                                           buildingRequest.getRemoteRepositories() );
+
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven31ArtifactResolver( repositorySystem, aetherRepositories, session );
+            
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+            
+            @SuppressWarnings( "unchecked" )
+            List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
+                                                                            "toRepos", List.class,
+                                                                            buildingRequest.getRemoteRepositories() );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven30ArtifactResolver( repositorySystem, aetherRepositories, session );
+        }
+
+
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java
index f81b243..e5f820c 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java
@@ -22,13 +22,8 @@
 import java.util.List;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -43,33 +38,38 @@
 /**
  * 
  */
-@Component( role = ArtifactResolver.class, hint = "maven3" )
 class Maven30ArtifactResolver
-    implements ArtifactResolver
+    implements MavenArtifactResolver
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final List<RemoteRepository> aetherRepositories;
+    
+    private final RepositorySystemSession session;
+
+    Maven30ArtifactResolver( RepositorySystem repositorySystem, List<RemoteRepository> aetherRepositories,
+                                    RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.aetherRepositories = aetherRepositories;
+        this.session = session;
+    }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    org.apache.maven.artifact.Artifact mavenArtifact )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
         Artifact aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                              org.apache.maven.artifact.Artifact.class, mavenArtifact );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    ArtifactCoordinate coordinate )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ArtifactCoordinate coordinate )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
@@ -77,23 +77,14 @@
             new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(),
                                  coordinate.getExtension(), coordinate.getVersion() );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                     Artifact aetherArtifact )
+    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( Artifact aetherArtifact )
                                                                                          throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         try
         {
             // use descriptor to respect relocation
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java
index 56e4519..888a683 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java
@@ -22,13 +22,8 @@
 import java.util.List;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -43,33 +38,38 @@
 /**
  * 
  */
-@Component( role = ArtifactResolver.class, hint = "maven31" )
 class Maven31ArtifactResolver
-    implements ArtifactResolver
+    implements MavenArtifactResolver
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    private final RepositorySystemSession session;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    Maven31ArtifactResolver( RepositorySystem repositorySystem, List<RemoteRepository> aetherRepositories,
+                                    RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.aetherRepositories = aetherRepositories;
+        this.session = session;
+    }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    org.apache.maven.artifact.Artifact mavenArtifact )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
         Artifact aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                              org.apache.maven.artifact.Artifact.class, mavenArtifact );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    ArtifactCoordinate coordinate )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ArtifactCoordinate coordinate )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
@@ -77,23 +77,14 @@
             new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(),
                                  coordinate.getExtension(), coordinate.getVersion() );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                     Artifact aetherArtifact )
+    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( Artifact aetherArtifact )
                                                                                          throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         try
         {
             // use descriptor to respect relocation
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/MavenArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/MavenArtifactResolver.java
new file mode 100644
index 0000000..2e9fb74
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/MavenArtifactResolver.java
@@ -0,0 +1,38 @@
+package org.apache.maven.shared.transfer.artifact.resolve.internal;
+
+/*
+ * 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.shared.transfer.artifact.ArtifactCoordinate;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenArtifactResolver
+{
+    ArtifactResult resolveArtifact( Artifact mavenArtifact ) throws ArtifactResolverException;
+
+    ArtifactResult resolveArtifact( ArtifactCoordinate coordinate ) throws ArtifactResolverException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
index 863c326..9904731 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
@@ -19,6 +19,10 @@
  * under the License.
  */
 
+import java.util.List;
+
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -72,11 +76,7 @@
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
-
-            return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
+            return getMavenDependencyCollector( buildingRequest ).collectDependencies( root );
         }
         catch ( ComponentLookupException e )
         {
@@ -172,5 +172,49 @@
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenDependencyCollector getMavenDependencyCollector( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, DependencyCollectorException
+    {
+        ArtifactHandlerManager artifactHandlerManager = container.lookup( ArtifactHandlerManager.class );
+        
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem m31RepositorySystem =
+                container.lookup( org.eclipse.aether.RepositorySystem.class );
+
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            @SuppressWarnings( "unchecked" )
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
+                                                                           List.class,
+                                                                           buildingRequest.getRemoteRepositories() );
+
+            return new Maven31DependencyCollector( m31RepositorySystem, artifactHandlerManager, session,
+                                                   aetherRepositories );
+            
+        }
+        else
+        {
+
+            org.sonatype.aether.RepositorySystem m30RepositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            @SuppressWarnings( "unchecked" )
+            List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
+                                                                            "toRepos", List.class,
+                                                                            buildingRequest.getRemoteRepositories() );
+
+            return new Maven30DependencyCollector( m30RepositorySystem, artifactHandlerManager, session,
+                                                   aetherRepositories );
+        }
+
+    }
 
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
index a1abb8c..4b4eaf2 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
@@ -26,13 +26,11 @@
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
+
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -49,19 +47,29 @@
  * @author Robert Scholte
  *
  */
-@Component( role = DependencyCollector.class, hint = "maven3" )
 class Maven30DependencyCollector
-    implements DependencyCollector
+    implements MavenDependencyCollector
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactHandlerManager artifactHandlerManager;
+
+    private final RepositorySystemSession session;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    Maven30DependencyCollector( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
 
     @Override
-    public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest,
-                                                org.apache.maven.model.Dependency root )
+    public CollectorResult collectDependencies( org.apache.maven.model.Dependency root )
         throws DependencyCollectorException
     {
         ArtifactTypeRegistry typeRegistry =
@@ -71,11 +79,11 @@
         CollectRequest request = new CollectRequest();
         request.setRoot( toDependency( root, typeRegistry ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
+    public CollectorResult collectDependencies( DependableCoordinate root )
         throws DependencyCollectorException
     {
         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
@@ -88,11 +96,11 @@
         CollectRequest request = new CollectRequest();
         request.setRoot( new Dependency( aetherArtifact, null ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
     
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Model root )
+    public CollectorResult collectDependencies( Model root )
         throws DependencyCollectorException
     {
         // Are there examples where packaging and type are NOT in sync
@@ -130,19 +138,12 @@
             request.setManagedDependencies( aetherManagerDependencies );
         }
         
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
-    private CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, CollectRequest request )
+    private CollectorResult collectDependencies( CollectRequest request )
         throws DependencyCollectorException
     {
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
         request.setRepositories( aetherRepositories );
 
         try
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
index cc4430d..0ee0385 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
@@ -26,13 +26,10 @@
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -49,19 +46,29 @@
  * @author Robert Scholte
  *
  */
-@Component( role = DependencyCollector.class, hint = "maven31" )
 class Maven31DependencyCollector
-    implements DependencyCollector
+    implements MavenDependencyCollector
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactHandlerManager artifactHandlerManager;
+    
+    private final RepositorySystemSession session;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    Maven31DependencyCollector( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
 
     @Override
-    public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest,
-                                                org.apache.maven.model.Dependency root )
+    public CollectorResult collectDependencies( org.apache.maven.model.Dependency root )
         throws DependencyCollectorException
     {
         ArtifactTypeRegistry typeRegistry =
@@ -71,11 +78,11 @@
         CollectRequest request = new CollectRequest();
         request.setRoot( toDependency( root, typeRegistry ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
+    public CollectorResult collectDependencies( DependableCoordinate root )
         throws DependencyCollectorException
     {
         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
@@ -88,11 +95,11 @@
         CollectRequest request = new CollectRequest();
         request.setRoot( new Dependency( aetherArtifact, null ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
     
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Model root )
+    public CollectorResult collectDependencies( Model root )
         throws DependencyCollectorException
     {
         // Are there examples where packaging and type are NOT in sync
@@ -130,19 +137,12 @@
             request.setManagedDependencies( aetherManagerDependencies );
         }
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
-    private CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, CollectRequest request )
+    private CollectorResult collectDependencies( CollectRequest request )
         throws DependencyCollectorException
     {
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
         request.setRepositories( aetherRepositories );
 
         try
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
new file mode 100644
index 0000000..53823f8
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
@@ -0,0 +1,44 @@
+package org.apache.maven.shared.transfer.dependencies.collect.internal;
+
+/*
+ * 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.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
+import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
+import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
+
+/**
+ * 
+ * @author Robert Scholte
+ */
+public interface MavenDependencyCollector
+{
+
+    CollectorResult collectDependencies( Dependency root )
+        throws DependencyCollectorException;
+
+    CollectorResult collectDependencies( DependableCoordinate root )
+        throws DependencyCollectorException;
+
+    CollectorResult collectDependencies( Model root )
+        throws DependencyCollectorException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java
index 2c1d7ea..f3a6866 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java
@@ -20,7 +20,10 @@
  */
 
 import java.util.Collection;
+import java.util.List;
 
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -57,12 +60,8 @@
         
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinates, managedDependencies,
-                                                                  filter );
+            return getMavenDependencyResolver( buildingRequest ).resolveDependencies( coordinates, managedDependencies,
+                                                                                      filter );
         }
         catch ( ComponentLookupException e )
         {
@@ -78,11 +77,7 @@
         validateParameters( buildingRequest, coordinate, filter );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinate, filter );
+            return getMavenDependencyResolver( buildingRequest ).resolveDependencies( coordinate, filter );
         }
         catch ( ComponentLookupException e )
         {
@@ -98,11 +93,7 @@
         validateParameters( buildingRequest, model, filter );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveDependencies( buildingRequest, model, filter );
+            return getMavenDependencyResolver( buildingRequest ).resolveDependencies( model, filter );
         }
         catch ( ComponentLookupException e )
         {
@@ -164,6 +155,48 @@
         }
 
     }
+    
+    private MavenDependencyResolver getMavenDependencyResolver( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, DependencyResolverException
+    {
+        ArtifactHandlerManager artifactHandlerManager = container.lookup( ArtifactHandlerManager.class );
+        
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem m31RepositorySystem =
+                container.lookup( org.eclipse.aether.RepositorySystem.class );
+
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, 
+                                                                           "toRepos",
+                                                                           List.class,
+                                                                           buildingRequest.getRemoteRepositories() );
+
+            return new Maven31DependencyResolver( m31RepositorySystem, artifactHandlerManager, session,
+                                                  aetherRepositories );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem m30RepositorySystem =
+                container.lookup( org.sonatype.aether.RepositorySystem.class );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
+                                                                            "toRepos", 
+                                                                            List.class,
+                                                                            buildingRequest.getRemoteRepositories() );
+
+            return new Maven30DependencyResolver( m30RepositorySystem, artifactHandlerManager, session,
+                                                  aetherRepositories );
+
+        }
+    }
 
     private void validateBuildingRequest( ProjectBuildingRequest buildingRequest )
     {
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java
index 9182330..806d415 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java
@@ -29,14 +29,10 @@
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
 import org.apache.maven.shared.artifact.filter.resolve.transform.SonatypeAetherFilterTransformer;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
-import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver;
 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
@@ -56,20 +52,30 @@
 /**
  * 
  */
-@Component( role = DependencyResolver.class, hint = "maven3" )
 class Maven30DependencyResolver
-    implements DependencyResolver
+    implements MavenDependencyResolver
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactHandlerManager artifactHandlerManager;
+    
+    private final RepositorySystemSession session;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    Maven30DependencyResolver( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                      RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  DependableCoordinate coordinate,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
                                                                                                   TransformableFilter dependencyFilter )
     // CHECKSTYLE_ON: LineLength
         throws DependencyResolverException
@@ -80,20 +86,14 @@
 
         Dependency aetherRoot = toDependency( coordinate, typeRegistry );
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
     
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Model model,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Model model,
                                                                                                   TransformableFilter dependencyFilter )
     // CHECKSTYLE_ON: LineLength
         throws DependencyResolverException
@@ -108,11 +108,6 @@
         
         Dependency aetherRoot = new Dependency( aetherArtifact, null );
         
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
         
         ArtifactTypeRegistry typeRegistry =
@@ -140,13 +135,12 @@
             request.setManagedDependencies( aetherManagerDependencies );
         }
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Collection<org.apache.maven.model.Dependency> mavenDependencies,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Collection<org.apache.maven.model.Dependency> mavenDependencies,
                                                                                                   Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
                                                                                                   TransformableFilter filter )
     // CHECKSTYLE_ON: LineLength
@@ -193,20 +187,14 @@
             }
         }
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request =
             new CollectRequest( aetherDependencies, aetherManagedDependencies, aetherRepositories );
 
-        return resolveDependencies( buildingRequest, aetherRepositories, filter, request );
+        return resolveDependencies( aetherRepositories, filter, request );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                   List<RemoteRepository> aetherRepositories,
+    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( List<RemoteRepository> aetherRepositories,
                                                                                                    TransformableFilter dependencyFilter,
                                                                                                    CollectRequest request )
                                                                                                        throws DependencyResolverException
@@ -220,9 +208,6 @@
                 depFilter = dependencyFilter.transform( new SonatypeAetherFilterTransformer() );
             }
 
-            RepositorySystemSession session =
-                (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
             final List<ArtifactResult> dependencyResults =
                 repositorySystem.resolveDependencies( session, request, depFilter );
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java
index c4f53cf..7bbd6fc 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java
@@ -29,14 +29,10 @@
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
 import org.apache.maven.shared.artifact.filter.resolve.transform.EclipseAetherFilterTransformer;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
-import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver;
 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -56,20 +52,30 @@
 /**
  * 
  */
-@Component( role = DependencyResolver.class, hint = "maven31" )
 class Maven31DependencyResolver
-    implements DependencyResolver
+    implements MavenDependencyResolver
 {
-    @Requirement
     private RepositorySystem repositorySystem;
 
-    @Requirement
     private ArtifactHandlerManager artifactHandlerManager;
 
+    private final RepositorySystemSession session;
+
+    private final List<RemoteRepository> aetherRepositories;
+
+    Maven31DependencyResolver( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                      RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
+
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  DependableCoordinate coordinate,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
                                                                                                   TransformableFilter dependencyFilter )
                                                                                                       throws DependencyResolverException
     // CHECKSTYLE_ON: LineLength
@@ -80,20 +86,14 @@
 
         Dependency aetherRoot = toDependency( coordinate, typeRegistry );
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
     
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Model model,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Model model,
                                                                                                   TransformableFilter dependencyFilter )
     // CHECKSTYLE_ON: LineLength
         throws DependencyResolverException
@@ -108,11 +108,6 @@
         
         Dependency aetherRoot = new Dependency( aetherArtifact, null );
         
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
         
         ArtifactTypeRegistry typeRegistry =
@@ -140,13 +135,12 @@
             request.setManagedDependencies( aetherManagerDependencies );
         }
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Collection<org.apache.maven.model.Dependency> mavenDependencies,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Collection<org.apache.maven.model.Dependency> mavenDependencies,
                                                                                                   Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
                                                                                                   TransformableFilter filter )
                                                                                                       throws DependencyResolverException
@@ -193,19 +187,13 @@
             }
         }
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepos =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
+        CollectRequest request = new CollectRequest( aetherDeps, aetherManagedDependencies, aetherRepositories );
 
-        CollectRequest request = new CollectRequest( aetherDeps, aetherManagedDependencies, aetherRepos );
-
-        return resolveDependencies( buildingRequest, aetherRepos, filter, request );
+        return resolveDependencies( aetherRepositories, filter, request );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                   List<RemoteRepository> aetherRepositories,
+    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( List<RemoteRepository> aetherRepositories,
                                                                                                    TransformableFilter dependencyFilter,
                                                                                                    CollectRequest request )
                                                                                                        throws DependencyResolverException
@@ -221,9 +209,6 @@
 
             DependencyRequest depRequest = new DependencyRequest( request, depFilter );
 
-            RepositorySystemSession session =
-                (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
             final DependencyResult dependencyResults = repositorySystem.resolveDependencies( session, depRequest );
 
             // Keep it lazy! Often artifactsResults aren't used, so transforming up front is too expensive
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/MavenDependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/MavenDependencyResolver.java
new file mode 100644
index 0000000..da0222d
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/MavenDependencyResolver.java
@@ -0,0 +1,51 @@
+package org.apache.maven.shared.transfer.dependencies.resolve.internal;
+
+/*
+ * 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.Collection;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
+import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
+import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenDependencyResolver
+{
+
+    Iterable<ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
+                                                  TransformableFilter dependencyFilter )
+        throws DependencyResolverException;
+
+    Iterable<ArtifactResult> resolveDependencies( Model model, TransformableFilter dependencyFilter )
+        throws DependencyResolverException;
+
+    Iterable<ArtifactResult> resolveDependencies( Collection<Dependency> mavenDependencies,
+                                                  Collection<Dependency> managedMavenDependencies,
+                                                  TransformableFilter filter )
+        throws DependencyResolverException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java
index b14ae41..a38dce6 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java
@@ -28,6 +28,7 @@
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
 import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate;
 import org.apache.maven.shared.transfer.repository.RepositoryManager;
+import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.annotations.Component;
@@ -41,22 +42,18 @@
  */
 @Component( role = RepositoryManager.class )
 class DefaultRepositoryManager
-    implements RepositoryManager, Contextualizable
+    implements RepositoryManager, Contextualizable 
 {
     private PlexusContainer container;
-
+    
     @Override
     public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest, Artifact artifact )
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.getPathForLocalArtifact( buildingRequest, artifact );
+            return getMavenRepositoryManager( buildingRequest ).getPathForLocalArtifact( artifact );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
@@ -67,13 +64,9 @@
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.getPathForLocalArtifact( buildingRequest, coor );
+            return getMavenRepositoryManager( buildingRequest ).getPathForLocalArtifact( coor );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
@@ -91,51 +84,38 @@
             pomCoordinate.setExtension( "pom" );
             return getPathForLocalArtifact( buildingRequest, pomCoordinate );
         }
-        
+
         try
         {
-            
-            String hint = isMaven31() ? "maven31" : "maven3";
-            
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-            
-            return effectiveRepositoryManager.getPathForLocalMetadata( buildingRequest, metadata );
+            return getMavenRepositoryManager( buildingRequest ).getPathForLocalMetadata( metadata );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
     }
 
     @Override
-    public ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest request, File basedir )
+    public ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest, File basedir )
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : isMaven302() ? "maven302" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.setLocalRepositoryBasedir( request, basedir );
+            return getMavenRepositoryManager( buildingRequest ).setLocalRepositoryBasedir( buildingRequest, basedir );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
     }
 
     @Override
-    public File getLocalRepositoryBasedir( ProjectBuildingRequest request )
+    public File getLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest )
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : isMaven302() ? "maven302" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.getLocalRepositoryBasedir( request );
+            return getMavenRepositoryManager( buildingRequest ).getLocalRepositoryBasedir();
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
@@ -170,15 +150,41 @@
             return false;
         }
     }
+    
+    private MavenRepositoryManager getMavenRepositoryManager( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, RepositoryManagerException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem m31RepositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
 
-    /**
-     * Injects the Plexus content.
-     *
-     * @param context Plexus context to inject.
-     * @throws ContextException if the PlexusContainer could not be located.
-     */
-    public void contextualize( Context context )
-        throws ContextException
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            return new Maven31RepositoryManager( m31RepositorySystem, session );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem m30RepositorySystem =
+                container.lookup( org.sonatype.aether.RepositorySystem.class );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            if ( isMaven302() )
+            {
+                return new Maven302RepositoryManager( m30RepositorySystem, session );
+                
+            }
+            else
+            {
+                return new Maven30RepositoryManager( m30RepositorySystem, session );
+            }
+        }
+    }
+    
+    public void contextualize( Context context ) throws ContextException
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java
index 0bd1bab..29178f4 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java
@@ -19,17 +19,20 @@
  * under the License.
  */
 
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.codehaus.plexus.component.annotations.Component;
+import org.sonatype.aether.RepositorySystem;
+import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.repository.LocalRepository;
 
 /**
  * 
  */
-@Component( role = RepositoryManager.class, hint = "maven302" )
 class Maven302RepositoryManager
     extends Maven30RepositoryManager
 {
+    Maven302RepositoryManager( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        super( repositorySystem, session );
+    }
 
     /**
      * Aether-1.9+ (i.e. M3.0.2+) expects "default", not "enhanced" as repositoryType
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java
index 9fbaea9..936ea12 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java
@@ -22,15 +22,11 @@
 import java.io.File;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -46,32 +42,29 @@
 /**
  * 
  */
-@Component( role = RepositoryManager.class, hint = "maven3" )
 class Maven30RepositoryManager
-    implements RepositoryManager
+    implements MavenRepositoryManager
 {
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private RepositorySystem repositorySystem;
-
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final RepositorySystemSession session;
+    
+    Maven30RepositoryManager( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest,
-                                           org.apache.maven.artifact.Artifact mavenArtifact )
+    public String getPathForLocalArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
     {
         Artifact aetherArtifact;
 
-        RepositorySystemSession session;
-
         // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
         try
         {
             aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                         org.apache.maven.artifact.Artifact.class, mavenArtifact );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
         }
         catch ( RepositoryManagerException e )
         {
@@ -82,29 +75,17 @@
     }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest, ArtifactCoordinate coordinate )
+    public String getPathForLocalArtifact( ArtifactCoordinate coordinate )
     {
-        Artifact aetherArtifact;
-
-        RepositorySystemSession session;
+        Artifact aetherArtifact = toArtifact( coordinate );
 
         // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
-        try
-        {
-            aetherArtifact = toArtifact( coordinate );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
 
         return session.getLocalRepositoryManager().getPathForLocalArtifact( aetherArtifact );
     }
 
     @Override
-    public String getPathForLocalMetadata( ProjectBuildingRequest buildingRequest, ArtifactMetadata metadata )
+    public String getPathForLocalMetadata( ArtifactMetadata metadata )
     {
         Metadata aetherMetadata =
             new DefaultMetadata( metadata.getGroupId(),
@@ -112,15 +93,6 @@
                                  metadata.storedInArtifactVersionDirectory() ? metadata.getBaseVersion() : null,
                                  "maven-metadata.xml", Nature.RELEASE_OR_SNAPSHOT );
 
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
         return session.getLocalRepositoryManager().getPathForLocalMetadata( aetherMetadata );
     }
     
@@ -166,17 +138,8 @@
     }
 
     @Override
-    public File getLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest )
+    public File getLocalRepositoryBasedir()
     {
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
         return session.getLocalRepository().getBasedir();
     }
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java
index d7f4d6e..86ae613 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java
@@ -22,15 +22,11 @@
 import java.io.File;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.DefaultRepositoryCache;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
@@ -46,30 +42,30 @@
 /**
  * 
  */
-@Component( role = RepositoryManager.class, hint = "maven31" )
 class Maven31RepositoryManager
-    implements RepositoryManager
+    implements MavenRepositoryManager
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final RepositorySystemSession session;
+
+    Maven31RepositoryManager( RepositorySystem repositorySystem, 
+                              RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest,
-                                           org.apache.maven.artifact.Artifact mavenArtifact )
+    public String getPathForLocalArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
     {
         Artifact aetherArtifact;
-        RepositorySystemSession session;
 
         // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
         try
         {
             aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                         org.apache.maven.artifact.Artifact.class, mavenArtifact );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
         }
         catch ( RepositoryManagerException e )
         {
@@ -80,29 +76,15 @@
     }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest, ArtifactCoordinate coordinate )
+    public String getPathForLocalArtifact( ArtifactCoordinate coordinate )
     {
-        Artifact aetherArtifact;
-
-        RepositorySystemSession session;
-
-        // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
-        try
-        {
-            aetherArtifact = toArtifact( coordinate );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
+        Artifact aetherArtifact = toArtifact( coordinate );
 
         return session.getLocalRepositoryManager().getPathForLocalArtifact( aetherArtifact );
     }
     
     @Override
-    public String getPathForLocalMetadata( ProjectBuildingRequest buildingRequest, ArtifactMetadata metadata )
+    public String getPathForLocalMetadata( ArtifactMetadata metadata )
     {
         Metadata aetherMetadata =
             new DefaultMetadata( metadata.getGroupId(),
@@ -110,15 +92,6 @@
                                  metadata.storedInArtifactVersionDirectory() ? metadata.getBaseVersion() : null,
                                  "maven-metadata.xml", Nature.RELEASE_OR_SNAPSHOT );
 
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
         return session.getLocalRepositoryManager().getPathForLocalMetadata( aetherMetadata );
     }
 
@@ -164,18 +137,8 @@
     }
 
     @Override
-    public File getLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest )
+    public File getLocalRepositoryBasedir()
     {
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
-
         return session.getLocalRepository().getBasedir();
     }
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/MavenRepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/MavenRepositoryManager.java
new file mode 100644
index 0000000..e494b15
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/MavenRepositoryManager.java
@@ -0,0 +1,67 @@
+package org.apache.maven.shared.transfer.repository.internal;
+
+/*
+ * 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 org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
+
+/**
+ * 
+ * @author Robert Scholte
+ */
+interface MavenRepositoryManager
+{
+    /**
+     * @param artifact {@link Artifact}
+     * @return the path of the local artifact.
+     */
+    String getPathForLocalArtifact( Artifact artifact );
+
+    /**
+     * @param coordinate {@link ArtifactCoordinate}
+     * @return the path for the local artifact.
+     */
+    String getPathForLocalArtifact( ArtifactCoordinate coordinate );
+    
+    /**
+     * @param metadata {@link ArtifactMetadata}
+     * @return the path of the local metadata.
+     */
+    String getPathForLocalMetadata( ArtifactMetadata metadata );
+
+    /**
+     * Create a new {@code ProjectBuildingRequest} with an adjusted repository session.
+     * 
+     * @param basedir the base directory of the local repository
+     * @return a new project building request
+     */
+    ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest request, File basedir );
+
+    /**
+     * Get the localRepositryBasedir as specified in the repository session of the request
+     * 
+     * @return the local repository base directory
+     */
+    File getLocalRepositoryBasedir();
+}
diff --git a/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java b/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java
index b5693f1..19d1939 100644
--- a/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java
+++ b/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java
@@ -28,22 +28,22 @@
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.repository.internal.MavenRepositorySystemSession;
-import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.internal.Maven30ArtifactInstaller;
 import org.codehaus.plexus.PlexusTestCase;
+import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
 
 public class Maven30ArtifactInstallerTest extends PlexusTestCase
 {
     private final File localRepo = new File( "target/tests/local-repo" );
     
-    private Maven30ArtifactInstaller installer;
+    private RepositorySystem repositorySystem;
 
     @Override
     public void setUp() throws Exception
     {
         super.setUp();
-        installer = (Maven30ArtifactInstaller) super.lookup( ArtifactInstaller.class, "maven3" );
+        repositorySystem = lookup( RepositorySystem.class );
     }
 
     public void testInstall() throws Exception
@@ -67,7 +67,8 @@
         
         Collection<Artifact> mavenArtifacts = Arrays.<Artifact>asList( artifact, artifactWithClassifier );
         
-        installer.install( buildingRequest, mavenArtifacts );
+        MavenArtifactInstaller installer = new Maven30ArtifactInstaller( repositorySystem, repositorySession );
+        installer.install( mavenArtifacts );
         
         assertTrue( new File( localRepo, "GROUPID/ARTIFACTID/VERSION/ARTIFACTID-VERSION.EXTENSION" ).exists() );
         assertTrue( new File( localRepo, "GROUPID/ARTIFACTID/VERSION/ARTIFACTID-VERSION-CLASSIFIER.EXTENSION" ).exists() );
diff --git a/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java b/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java
index faa9e1a..b426316 100644
--- a/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java
+++ b/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java
@@ -24,9 +24,9 @@
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.repository.internal.MavenRepositorySystemSession;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.apache.maven.shared.transfer.repository.internal.Maven30RepositoryManager;
 import org.codehaus.plexus.PlexusTestCase;
+import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.impl.internal.EnhancedLocalRepositoryManager;
 import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
 
@@ -35,13 +35,13 @@
 
     private final File localRepo = new File( "target/tests/local-repo" );
     
-    private Maven30RepositoryManager repositoryManager;
+    private RepositorySystem repositorySystem;
 
     @Override
     public void setUp() throws Exception
     {
         super.setUp();
-        repositoryManager = (Maven30RepositoryManager) super.lookup( RepositoryManager.class, "maven3" );
+        repositorySystem = lookup( RepositorySystem.class );
     }
     
     public void testSetLocalRepositoryBasedirSimple() throws Exception
@@ -53,6 +53,9 @@
 
         File basedir = new File( "NEW/LOCAL/REPO" );
         
+        Maven30RepositoryManager repositoryManager =
+            new Maven30RepositoryManager( repositorySystem, buildingRequest.getRepositorySession() );
+        
         ProjectBuildingRequest newBuildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, basedir );
         
         assertEquals( basedir.getAbsoluteFile(), newBuildingRequest.getRepositorySession().getLocalRepository().getBasedir() );
@@ -68,6 +71,9 @@
 
         File basedir = new File( "NEW/LOCAL/REPO" );
         
+        Maven30RepositoryManager repositoryManager =
+            new Maven30RepositoryManager( repositorySystem, buildingRequest.getRepositorySession() );
+        
         ProjectBuildingRequest newBuildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, basedir );
         
         assertEquals( basedir.getAbsoluteFile(), newBuildingRequest.getRepositorySession().getLocalRepository().getBasedir() );
