You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2019/02/10 11:53:37 UTC

[archiva] 02/02: Fixing unit tests after refactoring

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git

commit 7a0e81d5156822c0e1b1a5b954be8f7f0199b2a3
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Sun Feb 10 12:53:02 2019 +0100

    Fixing unit tests after refactoring
---
 .../src/test/resources/spring-context.xml          |  16 +-
 .../archiva-base/archiva-proxy-maven/pom.xml       |  20 +-
 .../proxy/maven/MavenRepositoryProxyHandler.java   | 294 +++++++++------------
 .../src/main/resources/META-INF/spring-context.xml |   2 +-
 .../archiva/proxy/AbstractProxyTestCase.java       |   1 +
 .../archiva/proxy/HttpProxyTransferTest.java       |  14 +-
 .../mock/ManagedRepositoryContentMock.java         | 235 +++++++++++++++-
 .../mock/RemoteRepositoryContentMock.java          |  22 +-
 .../mock/RepositoryContentProviderMock.java        |   4 +-
 .../src/test/resources/META-INF/spring-context.xml |  41 ++-
 .../apache/archiva/proxy/ArchivaProxyRegistry.java |   5 +
 .../proxy/DefaultRepositoryProxyHandler.java       |  27 +-
 .../org/apache/archiva/proxy/ProxyRegistry.java    |   8 +
 .../src/test/resources/spring-context.xml          | 123 ---------
 .../archiva/repository/metadata/MetadataTools.java |   3 +
 .../rest/services/DefaultBrowseService.java        |  13 +-
 archiva-modules/archiva-web/archiva-webdav/pom.xml |   4 +
 .../archiva/webdav/ArchivaDavResourceFactory.java  |  29 +-
 .../webdav/AbstractRepositoryServletTestCase.java  |   9 +-
 .../webdav/ArchivaDavResourceFactoryTest.java      |  33 +--
 .../webdav/OverridingRepositoryProxyHandler.java   |  55 ++++
 archiva-modules/plugins/maven2-repository/pom.xml  |   5 +
 .../storage/maven2/Maven2RepositoryStorage.java    |  17 +-
 .../MockRepositoryArchivaTaskScheduler.java        |  58 ++++
 ...sitoryMetadataResolverMRM1411RepoGroupTest.java |   4 +-
 ...aven2RepositoryMetadataResolverMRM1411Test.java |  12 +-
 .../metadata/Maven2RepositoryStorageTest.java      |   2 +-
 .../src/test/resources/META-INF/spring-context.xml |   1 +
 ...ring-context.xml => spring-context-storage.xml} |  27 +-
 .../src/test/resources/spring-context.xml          |  28 +-
 src/ci/scripts/prepareWorkspace.sh                 |   2 +-
 31 files changed, 725 insertions(+), 389 deletions(-)

diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml
index 908c9b5..d50eea7 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml
@@ -32,7 +32,7 @@
   <mockito:mock id="mockManagedRepositoryAdmin" class="org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin" />
   <mockito:mock id="mockRemoteRepositoryAdmin" class="org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin" />
 
-  <context:component-scan base-package="org.apache.archiva.repository.mock,org.apache.archiva.repository.content.maven2"/>
+  <context:component-scan base-package="org.apache.archiva.scheduler.repository,org.apache.archiva.repository.mock,org.apache.archiva.repository.content.maven2"/>
 
   <alias name="mockRepositoryProvider" alias="mavenRepositoryProvider" />
 
@@ -40,4 +40,18 @@
 
   <bean name="proxyConnectorAdmin#mock" class="org.apache.archiva.mock.MockProxyConnectorAdmin"/>
   <bean name="networkProxyAdmin#mock" class="org.apache.archiva.mock.MockNetworkProxyAdmin"/>
+
+
+  <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler">
+    <property name="properties">
+      <props>
+        <prop key="org.quartz.scheduler.instanceName">scheduler1</prop>
+        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
+        <prop key="org.quartz.threadPool.threadCount">1</prop>
+        <prop key="org.quartz.threadPool.threadPriority">4</prop>
+        <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
+      </props>
+    </property>
+  </bean>
+
 </beans>
\ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml b/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml
index a6d77c3..8feac8d 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml
@@ -17,7 +17,8 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <artifactId>archiva-base</artifactId>
@@ -161,4 +162,21 @@
 
   </dependencies>
 
+  <build>
+
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <configuration>
+            <excludes>
+              <exclude>src/test/repositories/**</exclude>
+            </excludes>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
 </project>
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java
index 2ab7243..b59d998 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java
@@ -58,6 +58,7 @@ import java.util.concurrent.ConcurrentMap;
 public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
 
     private static final List<RepositoryType> REPOSITORY_TYPES = new ArrayList<>();
+
     static {
         REPOSITORY_TYPES.add(RepositoryType.MAVEN);
     }
@@ -75,20 +76,19 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
     private void updateWagonProxyInfo(Map<String, NetworkProxy> proxyList) {
         this.networkProxyMap.clear();
         List<NetworkProxyConfiguration> networkProxies = getArchivaConfiguration().getConfiguration().getNetworkProxies();
-        for ( Map.Entry<String, NetworkProxy> proxyEntry: proxyList.entrySet() )
-        {
+        for (Map.Entry<String, NetworkProxy> proxyEntry : proxyList.entrySet()) {
             String key = proxyEntry.getKey();
             NetworkProxy networkProxyDef = proxyEntry.getValue();
 
             ProxyInfo proxy = new ProxyInfo();
 
-            proxy.setType( networkProxyDef.getProtocol() );
-            proxy.setHost( networkProxyDef.getHost() );
-            proxy.setPort( networkProxyDef.getPort() );
-            proxy.setUserName( networkProxyDef.getUsername() );
-            proxy.setPassword( networkProxyDef.getPassword() );
+            proxy.setType(networkProxyDef.getProtocol());
+            proxy.setHost(networkProxyDef.getHost());
+            proxy.setPort(networkProxyDef.getPort());
+            proxy.setUserName(networkProxyDef.getUsername());
+            proxy.setPassword(networkProxyDef.getPassword());
 
-            this.networkProxyMap.put( key, proxy );
+            this.networkProxyMap.put(key, proxy);
         }
     }
 
@@ -111,98 +111,79 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
      * @param repository
      * @throws ProxyException
      * @throws NotModifiedException
-     *
      */
-    protected void transferResources( ProxyConnector connector, RemoteRepositoryContent remoteRepository, Path tmpMd5,
-                                      Path tmpSha1, Path tmpResource, String url, String remotePath, Path resource,
-                                      Path workingDirectory, ManagedRepositoryContent repository )
-        throws ProxyException, NotModifiedException
-    {
+    protected void transferResources(ProxyConnector connector, RemoteRepositoryContent remoteRepository, Path tmpMd5,
+                                     Path tmpSha1, Path tmpResource, String url, String remotePath, Path resource,
+                                     Path workingDirectory, ManagedRepositoryContent repository)
+            throws ProxyException, NotModifiedException {
         Wagon wagon = null;
-        try
-        {
+        try {
             RepositoryURL repoUrl = remoteRepository.getURL();
             String protocol = repoUrl.getProtocol();
             NetworkProxy networkProxy = null;
             String proxyId = connector.getProxyId();
-            if ( StringUtils.isNotBlank( proxyId ) )
-            {
+            if (StringUtils.isNotBlank(proxyId)) {
 
-                    networkProxy = getNetworkProxy( proxyId );
+                networkProxy = getNetworkProxy(proxyId);
             }
-            if (networkProxy==null) {
-                throw new ProxyException("No network proxy configurations found for id "+proxyId);
+            WagonFactoryRequest wagonFactoryRequest = new WagonFactoryRequest("wagon#" + protocol,
+                    remoteRepository.getRepository().getExtraHeaders());
+            if (networkProxy == null) {
+
+                log.warn("No network proxy with id {} found for connector {}->{}", proxyId,
+                        connector.getSourceRepository().getId(), connector.getTargetRepository().getId());
+            } else {
+                wagonFactoryRequest = wagonFactoryRequest.networkProxy(networkProxy);
             }
-            WagonFactoryRequest wagonFactoryRequest = new WagonFactoryRequest( "wagon#" + protocol,
-                                                                               remoteRepository.getRepository().getExtraHeaders() ).networkProxy(
-                networkProxy );
-            wagon = wagonFactory.getWagon( wagonFactoryRequest );
-            if ( wagon == null )
-            {
-                throw new ProxyException( "Unsupported target repository protocol: " + protocol );
+            wagon = wagonFactory.getWagon(wagonFactoryRequest);
+            if (wagon == null) {
+                throw new ProxyException("Unsupported target repository protocol: " + protocol);
             }
 
-            if ( wagon == null )
-            {
-                throw new ProxyException( "Unsupported target repository protocol: " + protocol );
+            if (wagon == null) {
+                throw new ProxyException("Unsupported target repository protocol: " + protocol);
             }
 
-            boolean connected = connectToRepository( connector, wagon, remoteRepository );
-            if ( connected )
-            {
-                transferArtifact( wagon, remoteRepository, remotePath, repository, resource, workingDirectory,
-                                  tmpResource );
+            boolean connected = connectToRepository(connector, wagon, remoteRepository);
+            if (connected) {
+                transferArtifact(wagon, remoteRepository, remotePath, repository, resource, workingDirectory,
+                        tmpResource);
 
                 // TODO: these should be used to validate the download based on the policies, not always downloaded
                 // to
                 // save on connections since md5 is rarely used
-                transferChecksum( wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".sha1",
-                                  tmpSha1 );
-                transferChecksum( wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".md5",
-                                  tmpMd5 );
+                transferChecksum(wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".sha1",
+                        tmpSha1);
+                transferChecksum(wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".md5",
+                        tmpMd5);
             }
-        }
-        catch ( NotFoundException e )
-        {
-            urlFailureCache.cacheFailure( url );
+        } catch (NotFoundException e) {
+            urlFailureCache.cacheFailure(url);
             throw e;
-        }
-        catch ( NotModifiedException e )
-        {
+        } catch (NotModifiedException e) {
             // Do not cache url here.
             throw e;
-        }
-        catch ( ProxyException e )
-        {
-            urlFailureCache.cacheFailure( url );
+        } catch (ProxyException e) {
+            urlFailureCache.cacheFailure(url);
             throw e;
-        }
-        catch ( WagonFactoryException e )
-        {
-            throw new ProxyException( e.getMessage(), e );
-        }
-        finally
-        {
-            if ( wagon != null )
-            {
-                try
-                {
+        } catch (WagonFactoryException e) {
+            throw new ProxyException(e.getMessage(), e);
+        } finally {
+            if (wagon != null) {
+                try {
                     wagon.disconnect();
-                }
-                catch ( ConnectionException e )
-                {
-                    log.warn( "Unable to disconnect wagon.", e );
+                } catch (ConnectionException e) {
+                    log.warn("Unable to disconnect wagon.", e);
                 }
             }
         }
     }
 
-    protected void transferArtifact( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
-                                   ManagedRepositoryContent repository, Path resource, Path tmpDirectory,
-                                   Path destFile )
-        throws ProxyException
-    {
-        transferSimpleFile( wagon, remoteRepository, remotePath, repository, resource, destFile );
+    protected void transferArtifact(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
+                                    ManagedRepositoryContent repository, Path resource, Path tmpDirectory,
+                                    Path destFile)
+            throws ProxyException {
+        transferSimpleFile(wagon, remoteRepository, remotePath, repository, resource, destFile);
     }
 
     /**
@@ -219,39 +200,30 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
      * @param ext              the type of checksum to transfer (example: ".md5" or ".sha1")
      * @throws ProxyException if copying the downloaded file into place did not succeed.
      */
-    protected void transferChecksum( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
-                                   ManagedRepositoryContent repository, Path resource, Path tmpDirectory, String ext,
-                                   Path destFile )
-        throws ProxyException
-    {
+    protected void transferChecksum(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
+                                    ManagedRepositoryContent repository, Path resource, Path tmpDirectory, String ext,
+                                    Path destFile)
+            throws ProxyException {
         String url = remoteRepository.getURL().getUrl() + remotePath + ext;
 
         // Transfer checksum does not use the policy.
-        if ( urlFailureCache.hasFailedBefore( url ) )
-        {
+        if (urlFailureCache.hasFailedBefore(url)) {
             return;
         }
 
-        try
-        {
-            transferSimpleFile( wagon, remoteRepository, remotePath + ext, repository, resource, destFile );
-            log.debug( "Checksum {} Downloaded: {} to move to {}", url, destFile, resource );
-        }
-        catch ( NotFoundException e )
-        {
-            urlFailureCache.cacheFailure( url );
-            log.debug( "Transfer failed, checksum not found: {}", url );
+        try {
+            transferSimpleFile(wagon, remoteRepository, remotePath + ext, repository, resource, destFile);
+            log.debug("Checksum {} Downloaded: {} to move to {}", url, destFile, resource);
+        } catch (NotFoundException e) {
+            urlFailureCache.cacheFailure(url);
+            log.debug("Transfer failed, checksum not found: {}", url);
             // Consume it, do not pass this on.
-        }
-        catch ( NotModifiedException e )
-        {
-            log.debug( "Transfer skipped, checksum not modified: {}", url );
+        } catch (NotModifiedException e) {
+            log.debug("Transfer skipped, checksum not modified: {}", url);
             // Consume it, do not pass this on.
-        }
-        catch ( ProxyException e )
-        {
-            urlFailureCache.cacheFailure( url );
-            log.warn( "Transfer failed on checksum: {} : {}", url, e.getMessage(), e );
+        } catch (ProxyException e) {
+            urlFailureCache.cacheFailure(url);
+            log.warn("Transfer failed on checksum: {} : {}", url, e.getMessage(), e);
             // Critical issue, pass it on.
             throw e;
         }
@@ -267,67 +239,52 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
      * @param origFile         the local file to save to
      * @throws ProxyException if there was a problem moving the downloaded file into place.
      */
-    protected void transferSimpleFile( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
-                                     ManagedRepositoryContent repository, Path origFile, Path destFile )
-        throws ProxyException
-    {
-        assert ( remotePath != null );
+    protected void transferSimpleFile(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
+                                      ManagedRepositoryContent repository, Path origFile, Path destFile)
+            throws ProxyException {
+        assert (remotePath != null);
 
         // Transfer the file.
-        try
-        {
+        try {
             boolean success = false;
 
-            if ( !Files.exists(origFile))
-            {
-                log.debug( "Retrieving {} from {}", remotePath, remoteRepository.getRepository().getName() );
-                wagon.get( addParameters( remotePath, remoteRepository.getRepository() ), destFile.toFile() );
+            if (!Files.exists(origFile)) {
+                log.debug("Retrieving {} from {}", remotePath, remoteRepository.getRepository().getName());
+                wagon.get(addParameters(remotePath, remoteRepository.getRepository()), destFile.toFile());
                 success = true;
 
                 // You wouldn't get here on failure, a WagonException would have been thrown.
-                log.debug( "Downloaded successfully." );
-            }
-            else
-            {
-                log.debug( "Retrieving {} from {} if updated", remotePath, remoteRepository.getRepository().getName() );
-                try
-                {
-                    success = wagon.getIfNewer( addParameters( remotePath, remoteRepository.getRepository() ), destFile.toFile(),
-                                                Files.getLastModifiedTime(origFile).toMillis());
+                log.debug("Downloaded successfully.");
+            } else {
+                log.debug("Retrieving {} from {} if updated", remotePath, remoteRepository.getRepository().getName());
+                try {
+                    success = wagon.getIfNewer(addParameters(remotePath, remoteRepository.getRepository()), destFile.toFile(),
+                            Files.getLastModifiedTime(origFile).toMillis());
+                } catch (IOException e) {
+                    throw new ProxyException("Failed to the modification time of " + origFile.toAbsolutePath());
                 }
-                catch ( IOException e )
-                {
-                    throw new ProxyException( "Failed to the modification time of "+origFile.toAbsolutePath() );
-                }
-                if ( !success )
-                {
+                if (!success) {
                     throw new NotModifiedException(
-                        "Not downloaded, as local file is newer than remote side: " + origFile.toAbsolutePath() );
+                            "Not downloaded, as local file is newer than remote side: " + origFile.toAbsolutePath());
                 }
 
-                if ( Files.exists(destFile))
-                {
-                    log.debug( "Downloaded successfully." );
+                if (Files.exists(destFile)) {
+                    log.debug("Downloaded successfully.");
                 }
             }
-        }
-        catch ( ResourceDoesNotExistException e )
-        {
+        } catch (ResourceDoesNotExistException e) {
             throw new NotFoundException(
-                "Resource [" + remoteRepository.getURL() + "/" + remotePath + "] does not exist: " + e.getMessage(),
-                e );
-        }
-        catch ( WagonException e )
-        {
+                    "Resource [" + remoteRepository.getURL() + "/" + remotePath + "] does not exist: " + e.getMessage(),
+                    e);
+        } catch (WagonException e) {
             // TODO: shouldn't have to drill into the cause, but TransferFailedException is often not descriptive enough
 
             String msg =
-                "Download failure on resource [" + remoteRepository.getURL() + "/" + remotePath + "]:" + e.getMessage();
-            if ( e.getCause() != null )
-            {
+                    "Download failure on resource [" + remoteRepository.getURL() + "/" + remotePath + "]:" + e.getMessage();
+            if (e.getCause() != null) {
                 msg += " (cause: " + e.getCause() + ")";
             }
-            throw new ProxyException( msg, e );
+            throw new ProxyException(msg, e);
         }
     }
 
@@ -339,30 +296,25 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
      * @param remoteRepository the remote repository to connect to.
      * @return true if the connection was successful. false if not connected.
      */
-    protected boolean connectToRepository( ProxyConnector connector, Wagon wagon,
-                                         RemoteRepositoryContent remoteRepository )
-    {
+    protected boolean connectToRepository(ProxyConnector connector, Wagon wagon,
+                                          RemoteRepositoryContent remoteRepository) {
         boolean connected = false;
 
         final ProxyInfo networkProxy =
-            connector.getProxyId() == null ? null : this.networkProxyMap.get( connector.getProxyId() );
+                connector.getProxyId() == null ? null : this.networkProxyMap.get(connector.getProxyId());
 
-        if ( log.isDebugEnabled() )
-        {
-            if ( networkProxy != null )
-            {
+        if (log.isDebugEnabled()) {
+            if (networkProxy != null) {
                 // TODO: move to proxyInfo.toString()
                 String msg = "Using network proxy " + networkProxy.getHost() + ":" + networkProxy.getPort()
-                    + " to connect to remote repository " + remoteRepository.getURL();
-                if ( networkProxy.getNonProxyHosts() != null )
-                {
+                        + " to connect to remote repository " + remoteRepository.getURL();
+                if (networkProxy.getNonProxyHosts() != null) {
                     msg += "; excluding hosts: " + networkProxy.getNonProxyHosts();
                 }
-                if ( StringUtils.isNotBlank( networkProxy.getUserName() ) )
-                {
+                if (StringUtils.isNotBlank(networkProxy.getUserName())) {
                     msg += "; as user: " + networkProxy.getUserName();
                 }
-                log.debug( msg );
+                log.debug(msg);
             }
         }
 
@@ -370,18 +322,17 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
         String username = "";
         String password = "";
         RepositoryCredentials repCred = remoteRepository.getRepository().getLoginCredentials();
-        if (repCred!=null && repCred instanceof PasswordCredentials) {
+        if (repCred != null && repCred instanceof PasswordCredentials) {
             PasswordCredentials pwdCred = (PasswordCredentials) repCred;
             username = pwdCred.getUsername();
-            password = pwdCred.getPassword()==null ? "" : new String(pwdCred.getPassword());
+            password = pwdCred.getPassword() == null ? "" : new String(pwdCred.getPassword());
         }
 
-        if ( StringUtils.isNotBlank( username ) && StringUtils.isNotBlank( password ) )
-        {
-            log.debug( "Using username {} to connect to remote repository {}", username, remoteRepository.getURL() );
+        if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) {
+            log.debug("Using username {} to connect to remote repository {}", username, remoteRepository.getURL());
             authInfo = new AuthenticationInfo();
-            authInfo.setUserName( username );
-            authInfo.setPassword( password );
+            authInfo.setUserName(username);
+            authInfo.setPassword(password);
         }
 
         // Convert seconds to milliseconds
@@ -390,19 +341,16 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
 
         // Set timeout  read and connect
         // FIXME olamy having 2 config values
-        wagon.setReadTimeout( (int) timeoutInMilliseconds );
-        wagon.setTimeout( (int)  timeoutInMilliseconds );
+        wagon.setReadTimeout((int) timeoutInMilliseconds);
+        wagon.setTimeout((int) timeoutInMilliseconds);
 
-        try
-        {
+        try {
             Repository wagonRepository =
-                new Repository( remoteRepository.getId(), remoteRepository.getURL().toString() );
-            wagon.connect( wagonRepository, authInfo, networkProxy );
+                    new Repository(remoteRepository.getId(), remoteRepository.getURL().toString());
+            wagon.connect(wagonRepository, authInfo, networkProxy);
             connected = true;
-        }
-        catch ( ConnectionException | AuthenticationException e )
-        {
-            log.warn( "Could not connect to {}: {}", remoteRepository.getRepository().getName(), e.getMessage() );
+        } catch (ConnectionException | AuthenticationException e) {
+            log.warn("Could not connect to {}: {}", remoteRepository.getRepository().getName(), e.getMessage());
             connected = false;
         }
 
@@ -410,13 +358,11 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
     }
 
 
-    public WagonFactory getWagonFactory()
-    {
+    public WagonFactory getWagonFactory() {
         return wagonFactory;
     }
 
-    public void setWagonFactory( WagonFactory wagonFactory )
-    {
+    public void setWagonFactory(WagonFactory wagonFactory) {
         this.wagonFactory = wagonFactory;
     }
 
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml
index 7374f36..ac08cdb 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml
@@ -28,7 +28,7 @@
        default-lazy-init="true">
 
   <context:annotation-config/>
-  <context:component-scan base-package="org.apache.archiva.proxy.common"/>
+  <context:component-scan base-package="org.apache.archiva.proxy.maven"/>
 
   <bean name="wagon#http" scope="prototype" class="org.apache.maven.wagon.providers.http.HttpWagon"/>
 
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
index 4813ddd..30f780c 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
@@ -381,6 +381,7 @@ public abstract class AbstractProxyTestCase
         ProxyConnectorConfiguration connectorConfig = new ProxyConnectorConfiguration();
         connectorConfig.setSourceRepoId( sourceRepoId );
         connectorConfig.setTargetRepoId( targetRepoId );
+        connectorConfig.setProxyId(sourceRepoId);
         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, checksumPolicy );
         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, releasePolicy );
         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, snapshotPolicy );
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
index d3e207a..c3d7c11 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
@@ -125,7 +125,6 @@ public class HttpProxyTransferTest
         // Make the destination dir.
         Files.createDirectories(destRepoDir);
 
-        managedDefaultRepository = createRepository(MANAGED_ID, "Default Managed Repository", repoPath, "default");
 
         Handler handler = new AbstractHandler()
         {
@@ -168,6 +167,7 @@ public class HttpProxyTransferTest
         proxyConfig.setProtocol( "http" );
         proxyConfig.setId( PROXY_ID );
         config.getConfiguration().addNetworkProxy( proxyConfig );
+        ( (MockConfiguration) config ).triggerChange("networkProxies.networkProxy(0).host", "localhost");
 
         // Setup target (proxied to) repository.
         RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration();
@@ -179,6 +179,10 @@ public class HttpProxyTransferTest
 
         config.getConfiguration().addRemoteRepository( repoConfig );
 
+        repositoryRegistry.reload();
+
+        managedDefaultRepository = createRepository(MANAGED_ID, "Default Managed Repository", repoPath, "default");
+
     }
 
     @After
@@ -192,8 +196,8 @@ public class HttpProxyTransferTest
     public void testGetOverHttpProxy()
         throws Exception
     {
-        Assertions.assertThat( System.getProperty( "http.proxyHost" ) ).isEmpty();
-        Assertions.assertThat( System.getProperty( "http.proxyPort" ) ).isEmpty();
+        Assertions.assertThat( System.getProperty( "http.proxyHost", "" ) ).isEmpty();
+        Assertions.assertThat( System.getProperty( "http.proxyPort", "" ) ).isEmpty();
 
         String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
 
@@ -218,8 +222,8 @@ public class HttpProxyTransferTest
         String actualContents = FileUtils.readFileToString( downloadedFile.toFile(), Charset.defaultCharset() );
         assertEquals( "Check file contents.", expectedContents, actualContents );
 
-        Assertions.assertThat( System.getProperty( "http.proxyHost" ) ).isEmpty();
-        Assertions.assertThat( System.getProperty( "http.proxyPort" ) ).isEmpty();
+        Assertions.assertThat( System.getProperty( "http.proxyHost" , "") ).isEmpty();
+        Assertions.assertThat( System.getProperty( "http.proxyPort" , "") ).isEmpty();
     }
 
     private void addConnector()
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index 2b06667..e185c3e 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -19,16 +19,25 @@ package org.apache.archiva.repository.mock;
  * under the License.
  */
 
+import org.apache.archiva.common.utils.VersionUtil;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
+import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
 import org.apache.archiva.model.ArchivaArtifact;
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
 import org.apache.archiva.repository.*;
+import org.apache.archiva.repository.content.PathParser;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author Martin Stockhammer <ma...@apache.org>
@@ -36,8 +45,17 @@ import java.util.Set;
 @Service("managedRepositoryContent#mock")
 public class ManagedRepositoryContentMock implements ManagedRepositoryContent
 {
+    private static final String PATH_SEPARATOR = "/";
+    private static final String GROUP_SEPARATOR = ".";
+    public static final String MAVEN_METADATA = "maven-metadata.xml";
+
+
     private ManagedRepository repository;
 
+    ManagedRepositoryContentMock(ManagedRepository repo) {
+        this.repository = repo;
+    }
+
     @Override
     public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException
     {
@@ -65,7 +83,7 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
     @Override
     public String getId( )
     {
-        return null;
+        return repository.getId();
     }
 
     @Override
@@ -122,16 +140,199 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
         this.repository = repo;
     }
 
+    private Map<ArtifactReference, String> refs = new HashMap<>();
+
     @Override
     public ArtifactReference toArtifactReference( String path ) throws LayoutException
     {
-        return null;
+        if ( StringUtils.isBlank( path ) )
+        {
+            throw new LayoutException( "Unable to convert blank path." );
+        }
+
+        ArtifactMetadata metadata = getArtifactForPath("test-repository", path);
+
+        ArtifactReference artifact = new ArtifactReference();
+        artifact.setGroupId( metadata.getNamespace() );
+        artifact.setArtifactId( metadata.getProject() );
+        artifact.setVersion( metadata.getVersion() );
+        MavenArtifactFacet facet = (MavenArtifactFacet) metadata.getFacet( MavenArtifactFacet.FACET_ID );
+        if ( facet != null )
+        {
+            artifact.setClassifier( facet.getClassifier() );
+            artifact.setType( facet.getType() );
+        }
+        refs.put(artifact, path);
+        return artifact;
+    }
+
+    public ArtifactMetadata getArtifactForPath( String repoId, String relativePath )
+    {
+        String[] parts = relativePath.replace( '\\', '/' ).split( "/" );
+
+        int len = parts.length;
+        if ( len < 4 )
+        {
+            throw new IllegalArgumentException(
+                    "Not a valid artifact path in a Maven 2 repository, not enough directories: " + relativePath );
+        }
+
+        String id = parts[--len];
+        String baseVersion = parts[--len];
+        String artifactId = parts[--len];
+        StringBuilder groupIdBuilder = new StringBuilder();
+        for ( int i = 0; i < len - 1; i++ )
+        {
+            groupIdBuilder.append( parts[i] );
+            groupIdBuilder.append( '.' );
+        }
+        groupIdBuilder.append( parts[len - 1] );
+
+        return getArtifactFromId( repoId, groupIdBuilder.toString(), artifactId, baseVersion, id );
+    }
+
+    private static final Pattern TIMESTAMP_PATTERN = Pattern.compile( "([0-9]{8}.[0-9]{6})-([0-9]+).*" );
+
+
+
+    public ArtifactMetadata getArtifactFromId( String repoId, String namespace, String projectId, String projectVersion,
+                                               String id )
+    {
+        if ( !id.startsWith( projectId + "-" ) )
+        {
+            throw new IllegalArgumentException( "Not a valid artifact path in a Maven 2 repository, filename '" + id
+                    + "' doesn't start with artifact ID '" + projectId + "'" );
+        }
+
+        MavenArtifactFacet facet = new MavenArtifactFacet();
+
+        int index = projectId.length() + 1;
+        String version;
+        String idSubStrFromVersion = id.substring( index );
+        if ( idSubStrFromVersion.startsWith( projectVersion ) && !VersionUtil.isUniqueSnapshot( projectVersion ) )
+        {
+            // non-snapshot versions, or non-timestamped snapshot versions
+            version = projectVersion;
+        }
+        else if ( VersionUtil.isGenericSnapshot( projectVersion ) )
+        {
+            // timestamped snapshots
+            try
+            {
+                int mainVersionLength = projectVersion.length() - 8; // 8 is length of "SNAPSHOT"
+                if ( mainVersionLength == 0 )
+                {
+                    throw new IllegalArgumentException(
+                            "Timestamped snapshots must contain the main version, filename was '" + id + "'" );
+                }
+
+                Matcher m = TIMESTAMP_PATTERN.matcher( idSubStrFromVersion.substring( mainVersionLength ) );
+                m.matches();
+                String timestamp = m.group( 1 );
+                String buildNumber = m.group( 2 );
+                facet.setTimestamp( timestamp );
+                facet.setBuildNumber( Integer.parseInt( buildNumber ) );
+                version = idSubStrFromVersion.substring( 0, mainVersionLength ) + timestamp + "-" + buildNumber;
+            }
+            catch ( IllegalStateException e )
+            {
+                throw new IllegalArgumentException( "Not a valid artifact path in a Maven 2 repository, filename '" + id
+                        + "' doesn't contain a timestamped version matching snapshot '"
+                        + projectVersion + "'", e);
+            }
+        }
+        else
+        {
+            // invalid
+            throw new IllegalArgumentException(
+                    "Not a valid artifact path in a Maven 2 repository, filename '" + id + "' doesn't contain version '"
+                            + projectVersion + "'" );
+        }
+
+        String classifier;
+        String ext;
+        index += version.length();
+        if ( index == id.length() )
+        {
+            // no classifier or extension
+            classifier = null;
+            ext = null;
+        }
+        else
+        {
+            char c = id.charAt( index );
+            if ( c == '-' )
+            {
+                // classifier up until '.'
+                int extIndex = id.indexOf( '.', index );
+                if ( extIndex >= 0 )
+                {
+                    classifier = id.substring( index + 1, extIndex );
+                    ext = id.substring( extIndex + 1 );
+                }
+                else
+                {
+                    classifier = id.substring( index + 1 );
+                    ext = null;
+                }
+            }
+            else if ( c == '.' )
+            {
+                // rest is the extension
+                classifier = null;
+                ext = id.substring( index + 1 );
+            }
+            else
+            {
+                throw new IllegalArgumentException( "Not a valid artifact path in a Maven 2 repository, filename '" + id
+                        + "' expected classifier or extension but got '"
+                        + id.substring( index ) + "'" );
+            }
+        }
+
+        ArtifactMetadata metadata = new ArtifactMetadata();
+        metadata.setId( id );
+        metadata.setNamespace( namespace );
+        metadata.setProject( projectId );
+        metadata.setRepositoryId( repoId );
+        metadata.setProjectVersion( projectVersion );
+        metadata.setVersion( version );
+
+        facet.setClassifier( classifier );
+
+        // we use our own provider here instead of directly accessing Maven's artifact handlers as it has no way
+        // to select the correct order to apply multiple extensions mappings to a preferred type
+        // TODO: this won't allow the user to decide order to apply them if there are conflicts or desired changes -
+        //       perhaps the plugins could register missing entries in configuration, then we just use configuration
+        //       here?
+
+        String type = null;
+
+
+        // use extension as default
+        if ( type == null )
+        {
+            type = ext;
+        }
+
+        // TODO: should we allow this instead?
+        if ( type == null )
+        {
+            throw new IllegalArgumentException(
+                    "Not a valid artifact path in a Maven 2 repository, filename '" + id + "' does not have a type" );
+        }
+
+        facet.setType( type );
+        metadata.addFacet( facet );
+
+        return metadata;
     }
 
+
     @Override
     public Path toFile( ArtifactReference reference )
     {
-        return null;
+        return Paths.get(getRepoRoot(), refs.get(reference));
     }
 
     @Override
@@ -140,16 +341,36 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
         return null;
     }
 
-    @Override
+    private String formatAsDirectory( String directory )
+    {
+        return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );
+    }
+
     public String toMetadataPath( ProjectReference reference )
     {
-        return null;
+        StringBuilder path = new StringBuilder();
+
+        path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
+        path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
+        path.append( MAVEN_METADATA );
+
+        return path.toString();
     }
 
-    @Override
     public String toMetadataPath( VersionedReference reference )
     {
-        return null;
+        StringBuilder path = new StringBuilder();
+
+        path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
+        path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
+        if ( reference.getVersion() != null )
+        {
+            // add the version only if it is present
+            path.append( VersionUtil.getBaseVersion( reference.getVersion() ) ).append( PATH_SEPARATOR );
+        }
+        path.append( MAVEN_METADATA );
+
+        return path.toString();
     }
 
     @Override
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
index c797b56..4ab4a5a 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java
@@ -19,11 +19,13 @@ package org.apache.archiva.repository.mock;
  * under the License.
  */
 
+import org.apache.archiva.common.utils.VersionUtil;
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.RepositoryURL;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.RemoteRepositoryContent;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 /**
@@ -34,22 +36,26 @@ public class RemoteRepositoryContentMock implements RemoteRepositoryContent
 {
     RemoteRepository repository;
 
+    RemoteRepositoryContentMock(RemoteRepository repo) {
+        this.repository = repo;
+    }
+
     @Override
     public String getId( )
     {
-        return null;
+        return repository.getId();
     }
 
     @Override
     public RemoteRepository getRepository( )
     {
-        return null;
+        return repository;
     }
 
     @Override
     public RepositoryURL getURL( )
     {
-        return null;
+        return new RepositoryURL(repository.getLocation().toString());
     }
 
     @Override
@@ -67,7 +73,15 @@ public class RemoteRepositoryContentMock implements RemoteRepositoryContent
     @Override
     public String toPath( ArtifactReference reference )
     {
-        return null;
+        String baseVersion;
+        if (VersionUtil.isSnapshot(reference.getVersion())) {
+            baseVersion=VersionUtil.getBaseVersion(reference.getVersion());
+        } else {
+            baseVersion=reference.getVersion();
+        }
+        return reference.getGroupId().replaceAll("\\.", "/")+"/"+reference.getArtifactId()+"/"+baseVersion+"/"
+                +reference.getArtifactId()+"-"+reference.getVersion()+(
+                StringUtils.isNotEmpty(reference.getClassifier()) ? "-"+reference.getClassifier() : "")+"."+reference.getType();
     }
 
     @Override
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java
index 3693e07..2822ae9 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java
@@ -51,12 +51,12 @@ public class RepositoryContentProviderMock implements RepositoryContentProvider
 
     @Override
     public RemoteRepositoryContent createRemoteContent(RemoteRepository repository) throws RepositoryException {
-        return new RemoteRepositoryContentMock();
+        return new RemoteRepositoryContentMock(repository);
     }
 
     @Override
     public ManagedRepositoryContent createManagedContent(ManagedRepository repository) throws RepositoryException {
-        return new ManagedRepositoryContentMock();
+        return new ManagedRepositoryContentMock(repository);
     }
 
     @Override
diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml
index 7afd4a4..f900a93 100644
--- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml
+++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml
@@ -20,10 +20,49 @@
 
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
-           http://www.springframework.org/schema/beans/spring-beans.xsd"
+           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+           http://www.springframework.org/schema/context
+           http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
        default-lazy-init="true">
 
+  <context:component-scan base-package="org.apache.archiva.proxy.maven"/>
+
   <bean name="wagon#file" scope="prototype" class="org.apache.maven.wagon.providers.file.FileWagon"/>
 
+  <alias name="userConfiguration#redback" alias="userConfiguration#default"/>
+
+  <!-- ***
+   JPA settings
+   *** -->
+  <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+    <property name="jpaVendorAdapter" >
+      <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
+    </property>
+    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hsqldb.xml" />
+    <property name="jpaPropertyMap">
+      <map>
+        <entry key="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database" />
+        <entry key="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" />
+        <entry key="openjpa.ConnectionUserName" value="sa" />
+        <entry key="openjpa.ConnectionPassword" value="" />
+        <entry key="openjpa.Log" value="${openjpa.Log:DefaultLevel=INFO,Runtime=ERROR,Tool=ERROR,SQL=ERROR,Schema=ERROR,MetaData=ERROR}" />
+        <entry key="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
+        <entry key="openjpa.jdbc.MappingDefaults"
+               value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/>
+      </map>
+    </property>
+
+  </bean>
+
+  <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
+    <property name="entityManagerFactory" ref="entityManagerFactory" />
+  </bean>
+
+  <tx:annotation-driven />
+  <!-- ***
+     End of JPA settings
+     *** -->
+
 </beans>
\ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java
index 7331614..6869c34 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java
@@ -150,6 +150,11 @@ public class ArchivaProxyRegistry implements ProxyRegistry, ConfigurationListene
     }
 
     @Override
+    public boolean hasHandler(RepositoryType type) {
+        return this.handlerMap.containsKey(type);
+    }
+
+    @Override
     public void configurationEvent(ConfigurationEvent event) {
         log.debug("Config changed updating proxy list");
         updateNetworkProxies();
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java
index 3f6bfe6..5622fe5 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java
@@ -60,6 +60,7 @@ import java.nio.file.Paths;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
 
 public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHandler, RegistryListener {
 
@@ -97,13 +98,13 @@ public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHa
     @PostConstruct
     public void initialize()
     {
-        initConnectorsAndNetworkProxies();
+        initConnectors();
         archivaConfiguration.addChangeListener( this );
 
     }
 
     @SuppressWarnings("unchecked")
-    private void initConnectorsAndNetworkProxies()
+    private void initConnectors()
     {
 
         ProxyConnectorOrderComparator proxyOrderSorter = new ProxyConnectorOrderComparator();
@@ -226,6 +227,21 @@ public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHa
         return proxyConnectorRuleConfigurations;
     }
 
+    private void updateNetworkProxies() {
+        Map<String, NetworkProxy> proxies = archivaConfiguration.getConfiguration().getNetworkProxies().stream().map(p -> {
+            NetworkProxy np = new NetworkProxy();
+            np.setId(p.getId());
+            np.setUseNtlm(p.isUseNtlm());
+            np.setUsername(p.getUsername());
+            np.setPassword(p.getPassword());
+            np.setProtocol(p.getProtocol());
+            np.setHost(p.getHost());
+            np.setPort(p.getPort());
+            return np;
+        }).collect(Collectors.toMap(p -> p.getId(), p -> p));
+        setNetworkProxies(proxies);
+    }
+
     @Override
     public Path fetchFromProxies(ManagedRepositoryContent repository, ArtifactReference artifact )
         throws ProxyDownloadException
@@ -911,12 +927,13 @@ public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHa
     @Override
     public void afterConfigurationChange(Registry registry, String propertyName, Object propertyValue )
     {
-        if ( ConfigurationNames.isNetworkProxy( propertyName ) //
-            || ConfigurationNames.isManagedRepositories( propertyName ) //
+        if ( ConfigurationNames.isManagedRepositories( propertyName ) //
             || ConfigurationNames.isRemoteRepositories( propertyName ) //
             || ConfigurationNames.isProxyConnector( propertyName ) ) //
         {
-            initConnectorsAndNetworkProxies();
+            initConnectors();
+        } else if (ConfigurationNames.isNetworkProxy(propertyName)) {
+            updateNetworkProxies();
         }
     }
 
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java
index 56f3d51..95c096a 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java
@@ -52,6 +52,14 @@ public interface ProxyRegistry {
     List<RepositoryProxyHandler> getHandler(RepositoryType type);
 
     /**
+     * Returns true, if there are proxy handler registered for the given type.
+     *
+     * @param type The repository type
+     * @return True, if a handler is registered, otherwise false.
+     */
+    boolean hasHandler(RepositoryType type);
+
+    /**
      * Returns the list of all proxy connectors.
      * @return
      */
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy/src/test/resources/spring-context.xml
deleted file mode 100755
index 9917806..0000000
--- a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/spring-context.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-           http://www.springframework.org/schema/context
-           http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
-       default-lazy-init="true">
-
-  <context:annotation-config/>
-  <context:component-scan base-package="org.apache.archiva.metadata.repository,org.apache.archiva.proxy,org.apache.archiva.repository.mock"/>
-  <alias name="mockRepositoryProvider" alias="mavenRepositoryProvider" />
-
-  <alias name="archivaConfiguration#mock" alias="archivaConfiguration#default"/>
-  <alias name="archivaConfiguration#mock" alias="archivaConfiguration"/>
-  <alias name="archivaTaskScheduler#repositoryMock" alias="archivaTaskScheduler#repository" />
-
-  <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler">
-    <property name="properties">
-      <props>
-        <prop key="org.quartz.scheduler.instanceName">scheduler1</prop>
-        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
-        <prop key="org.quartz.threadPool.threadCount">1</prop>
-        <prop key="org.quartz.threadPool.threadPriority">4</prop>
-        <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
-      </props>
-    </property>
-  </bean>
-
-  <bean name="repositoryContentFactory#mocked" class="org.apache.archiva.repository.RepositoryContentFactory">
-    <property name="archivaConfiguration" ref="archivaConfiguration#mock"/>
-  </bean>
-
-
-
-  <bean name="repositoryProxyConnectors#test" class="org.apache.archiva.proxy.maven.MavenRepositoryProxyHandler">
-    <property name="archivaConfiguration" ref="archivaConfiguration#mock"/>
-    <property name="repositoryFactory" ref="repositoryContentFactory#mocked"/>
-    <property name="metadataTools" ref="metadataTools#mocked"/>
-  </bean>
-
-  <bean name="metadataTools#default" class="org.apache.archiva.repository.metadata.MetadataTools">
-    <property name="configuration" ref="archivaConfiguration#mock"/>
-  </bean>
-
-  <bean name="metadataTools#mocked" class="org.apache.archiva.repository.metadata.MetadataTools">
-    <property name="configuration" ref="archivaConfiguration#mock"/>
-  </bean>
-
-
-  <bean name="cache#url-failures-cache" class="org.apache.archiva.redback.components.cache.ehcache.EhcacheCache" lazy-init="true"
-        destroy-method="dispose">
-    <property name="diskExpiryThreadIntervalSeconds" value="600"/>
-    <property name="diskPersistent" value="false"/>
-    <property name="diskStorePath" value="${appserver.base}/tmp/urlcache"/>
-    <property name="maxElementsInMemory" value="1000"/>
-    <property name="memoryEvictionPolicy" value="LRU"/>
-    <property name="name" value="url-failures-cache"/>
-    <property name="overflowToDisk" value="false"/>
-    <!-- 45 minutes = 2700 seconds -->
-    <property name="timeToIdleSeconds" value="2700"/>
-    <!-- 30 minutes = 1800 seconds  -->
-    <property name="timeToLiveSeconds" value="1800"/>
-  </bean>
-
-  <bean name="wagon#test" class="org.apache.archiva.proxy.WagonDelegate" scope="singleton"/>
-  <bean name="wagon#file" scope="prototype" class="org.apache.maven.wagon.providers.file.FileWagon"/>
-
-  <alias name="userConfiguration#redback" alias="userConfiguration#default"/>
-
-  <!-- ***
-   JPA settings
-   *** -->
-  <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
-    <property name="jpaVendorAdapter" >
-      <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
-    </property>
-    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hsqldb.xml" />
-    <property name="jpaPropertyMap">
-      <map>
-        <entry key="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database" />
-        <entry key="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" />
-        <entry key="openjpa.ConnectionUserName" value="sa" />
-        <entry key="openjpa.ConnectionPassword" value="" />
-        <entry key="openjpa.Log" value="${openjpa.Log:DefaultLevel=INFO,Runtime=ERROR,Tool=ERROR,SQL=ERROR,Schema=ERROR,MetaData=ERROR}" />
-        <entry key="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
-        <entry key="openjpa.jdbc.MappingDefaults"
-               value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/>
-      </map>
-    </property>
-
-  </bean>
-
-  <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
-    <property name="entityManagerFactory" ref="entityManagerFactory" />
-  </bean>
-
-  <tx:annotation-driven />
-  <!-- ***
-     End of JPA settings
-     *** -->
-
-</beans>
\ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java
index 8312e2b..9df3f49 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java
@@ -357,6 +357,7 @@ public class MetadataTools
     @PostConstruct
     public void initialize()
     {
+        assert(configuration != null);
         this.artifactPatterns = new ArrayList<>();
         this.proxies = new HashMap<>();
         initConfigVariables();
@@ -898,6 +899,8 @@ public class MetadataTools
 
     private void initConfigVariables()
     {
+        assert(this.artifactPatterns!=null);
+        assert(proxies!=null);
         synchronized ( this.artifactPatterns )
         {
             this.artifactPatterns.clear();
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
index c1ffe62..9488261 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
@@ -35,6 +35,7 @@ import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMetadataVer
 import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
 import org.apache.archiva.model.ArchivaArtifact;
 import org.apache.archiva.model.ArchivaRepositoryMetadata;
+import org.apache.archiva.proxy.ProxyRegistry;
 import org.apache.archiva.proxy.model.RepositoryProxyHandler;
 import org.apache.archiva.redback.components.cache.Cache;
 import org.apache.archiva.repository.ManagedRepositoryContent;
@@ -82,8 +83,7 @@ public class DefaultBrowseService
     private DependencyTreeBuilder dependencyTreeBuilder;
 
     @Inject
-    @Named( value = "repositoryProxyConnectors#default" )
-    private RepositoryProxyHandler connectors;
+    ProxyRegistry proxyRegistry;
 
     @Inject
     @Named( value = "browse#versionMetadata" )
@@ -830,7 +830,10 @@ public class DefaultBrowseService
             {
 
                 org.apache.archiva.repository.ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(repoId);
-
+                if (!proxyRegistry.hasHandler(managedRepo.getType())) {
+                    throw new RepositoryException( "No proxy handler found for repository type "+managedRepo.getType());
+                }
+                RepositoryProxyHandler proxyHandler = proxyRegistry.getHandler(managedRepo.getType()).get(0);
                 if ( ( snapshot && !managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT) ) || ( !snapshot
                     && managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT) ) )
                 {
@@ -886,13 +889,13 @@ public class DefaultBrowseService
 
                 String path = managedRepositoryContent.toPath( archivaArtifact );
 
-                file = connectors.fetchFromProxies( managedRepositoryContent, path );
+                file = proxyHandler.fetchFromProxies( managedRepositoryContent, path );
 
                 if ( file != null && Files.exists(file) )
                 {
                     // download pom now
                     String pomPath = StringUtils.substringBeforeLast( path, ".jar" ) + ".pom";
-                    connectors.fetchFromProxies( managedRepositoryContent, pomPath );
+                    proxyHandler.fetchFromProxies( managedRepositoryContent, pomPath );
                     return true;
                 }
             }
diff --git a/archiva-modules/archiva-web/archiva-webdav/pom.xml b/archiva-modules/archiva-web/archiva-webdav/pom.xml
index 0da5b2e..45ccdd8 100644
--- a/archiva-modules/archiva-web/archiva-webdav/pom.xml
+++ b/archiva-modules/archiva-web/archiva-webdav/pom.xml
@@ -89,6 +89,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-proxy-maven</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-security</artifactId>
     </dependency>
     <dependency>
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
index 3abf50c..b229ec9 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
@@ -46,6 +46,7 @@ import org.apache.archiva.metadata.repository.storage.RepositoryStorage;
 import org.apache.archiva.model.ArchivaRepositoryMetadata;
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.policies.ProxyDownloadException;
+import org.apache.archiva.proxy.ProxyRegistry;
 import org.apache.archiva.proxy.model.RepositoryProxyHandler;
 import org.apache.archiva.redback.authentication.AuthenticationException;
 import org.apache.archiva.redback.authentication.AuthenticationResult;
@@ -137,8 +138,7 @@ public class ArchivaDavResourceFactory
     private RepositoryRequest repositoryRequest;
 
     @Inject
-    @Named( value = "repositoryProxyConnectors#default" )
-    private RepositoryProxyHandler connectors;
+    private ProxyRegistry proxyRegistry;
 
     @Inject
     private MetadataTools metadataTools;
@@ -753,9 +753,13 @@ public class ArchivaDavResourceFactory
         throws DavException
     {
         String path = resource.getPath();
+        if (!proxyRegistry.hasHandler(managedRepository.getRepository().getType())) {
+            throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "No proxy handler found for repository type "+managedRepository.getRepository().getType());
+        }
+        RepositoryProxyHandler proxyHandler = proxyRegistry.getHandler(managedRepository.getRepository().getType()).get(0);
         if ( repositoryRequest.isSupportFile( path ) )
         {
-            Path proxiedFile = connectors.fetchFromProxies( managedRepository, path );
+            Path proxiedFile = proxyHandler.fetchFromProxies( managedRepository, path );
 
             return ( proxiedFile != null );
         }
@@ -763,14 +767,14 @@ public class ArchivaDavResourceFactory
         // Is it a Metadata resource?
         if ( repositoryRequest.isDefault( path ) && repositoryRequest.isMetadata( path ) )
         {
-            return connectors.fetchMetadataFromProxies( managedRepository, path ).isModified();
+            return proxyHandler.fetchMetadataFromProxies( managedRepository, path ).isModified();
         }
 
         // Is it an Archetype Catalog?
         if ( repositoryRequest.isArchetypeCatalog( path ) )
         {
             // FIXME we must implement a merge of remote archetype catalog from remote servers.
-            Path proxiedFile = connectors.fetchFromProxies( managedRepository, path );
+            Path proxiedFile = proxyHandler.fetchFromProxies( managedRepository, path );
 
             return ( proxiedFile != null );
         }
@@ -789,7 +793,7 @@ public class ArchivaDavResourceFactory
                     this.applicationContext.getBean( "repositoryStorage#" + repositoryLayout, RepositoryStorage.class );
                 repositoryStorage.applyServerSideRelocation( managedRepository, artifact );
 
-                Path proxiedFile = connectors.fetchFromProxies( managedRepository, artifact );
+                Path proxiedFile = proxyHandler.fetchFromProxies( managedRepository, artifact );
 
                 resource.setPath( managedRepository.toPath( artifact ) );
 
@@ -917,6 +921,14 @@ public class ArchivaDavResourceFactory
                       + path;
     }
 
+    public void setProxyRegistry(ProxyRegistry proxyRegistry) {
+        this.proxyRegistry = proxyRegistry;
+    }
+
+    public ProxyRegistry getProxyRegistry() {
+        return this.proxyRegistry;
+    }
+
     private static class LogicalResource
     {
         private String path;
@@ -1416,11 +1428,6 @@ public class ArchivaDavResourceFactory
         this.repositoryRequest = repositoryRequest;
     }
 
-    public void setConnectors( RepositoryProxyHandler connectors )
-    {
-        this.connectors = connectors;
-    }
-
     public RemoteRepositoryAdmin getRemoteRepositoryAdmin()
     {
         return remoteRepositoryAdmin;
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
index 3b82377..a55d891 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
@@ -19,15 +19,10 @@ package org.apache.archiva.webdav;
  * under the License.
  */
 
-import com.gargoylesoftware.htmlunit.HttpMethod;
-import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
-import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.WebRequest;
-import com.gargoylesoftware.htmlunit.WebResponse;
+import com.gargoylesoftware.htmlunit.*;
 import junit.framework.TestCase;
 import net.sf.ehcache.CacheManager;
 import org.apache.archiva.admin.model.beans.ManagedRepository;
-import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.Configuration;
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
@@ -101,8 +96,6 @@ public abstract class AbstractRepositoryServletTestCase
     @Inject
     protected ApplicationContext applicationContext;
 
-    @Inject
-    protected ManagedRepositoryAdmin managedRepositoryAdmin;
 
     @Inject
     RepositoryRegistry repositoryRegistry;
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
index b568076..22a99f3 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
@@ -34,8 +34,7 @@ import org.apache.archiva.configuration.Configuration;
 import org.apache.archiva.configuration.FileTypes;
 import org.apache.archiva.configuration.RepositoryGroupConfiguration;
 import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider;
-import org.apache.archiva.proxy.maven.MavenRepositoryProxyHandler;
-import org.apache.archiva.proxy.model.ProxyFetchResult;
+import org.apache.archiva.proxy.ProxyRegistry;
 import org.apache.archiva.repository.EditableManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.RemoteRepository;
@@ -50,7 +49,6 @@ import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.content.maven2.ManagedDefaultRepositoryContent;
 import org.apache.archiva.repository.content.maven2.RepositoryRequest;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavResourceLocator;
@@ -68,7 +66,6 @@ import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.test.context.ContextConfiguration;
 
 import javax.inject.Inject;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -139,6 +136,9 @@ public class ArchivaDavResourceFactoryTest
     @Inject
     RemoteRepositoryAdmin remoteRepositoryAdmin;
 
+    @Inject
+    ProxyRegistry proxyRegistry;
+
 
     @Inject
     DefaultRepositoryGroupAdmin defaultRepositoryGroupAdmin;
@@ -149,7 +149,7 @@ public class ArchivaDavResourceFactoryTest
     @Inject
     FileTypes fileTypes;
 
-    private Path getProjectBase() {
+    public Path getProjectBase() {
         if (this.projectBase.get()==null) {
             String pathVal = System.getProperty("mvn.project.base.dir");
             Path baseDir;
@@ -229,7 +229,9 @@ public class ArchivaDavResourceFactoryTest
         resourceFactory.setArchivaConfiguration( archivaConfiguration );
         resourceFactory.setRepositoryFactory( repoFactory );
         resourceFactory.setRepositoryRequest( repoRequest );
-        resourceFactory.setConnectors( new OverridingRepositoryProxyHandler() );
+        proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).clear();
+        proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).add(new OverridingRepositoryProxyHandler(this));
+        resourceFactory.setProxyRegistry(proxyRegistry);
         resourceFactory.setRemoteRepositoryAdmin( remoteRepositoryAdmin );
         resourceFactory.setManagedRepositoryAdmin( defaultManagedRepositoryAdmin );
         resourceFactory.setRepositoryRegistry( repositoryRegistry );
@@ -749,23 +751,4 @@ public class ArchivaDavResourceFactoryTest
         }
     }
 
-    class OverridingRepositoryProxyHandler
-        extends MavenRepositoryProxyHandler
-    {
-        @Override
-        public ProxyFetchResult fetchMetadataFromProxies( ManagedRepositoryContent repository, String logicalPath )
-        {
-            Path target = Paths.get(repository.getRepoRoot(), logicalPath );
-            try
-            {
-                FileUtils.copyFile( getProjectBase().resolve( "target/test-classes/maven-metadata.xml" ).toFile(), target.toFile() );
-            }
-            catch ( IOException e )
-            {
-
-            }
-
-            return new ProxyFetchResult( target, true );
-        }
-    }
 }
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/OverridingRepositoryProxyHandler.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/OverridingRepositoryProxyHandler.java
new file mode 100644
index 0000000..75f6726
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/OverridingRepositoryProxyHandler.java
@@ -0,0 +1,55 @@
+package org.apache.archiva.webdav;
+
+/*
+ * 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.archiva.proxy.maven.MavenRepositoryProxyHandler;
+import org.apache.archiva.proxy.model.ProxyFetchResult;
+import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.commons.io.FileUtils;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+class OverridingRepositoryProxyHandler
+    extends MavenRepositoryProxyHandler
+{
+    private ArchivaDavResourceFactoryTest archivaDavResourceFactoryTest;
+
+    public OverridingRepositoryProxyHandler(ArchivaDavResourceFactoryTest archivaDavResourceFactoryTest) {
+        this.archivaDavResourceFactoryTest = archivaDavResourceFactoryTest;
+    }
+
+    @Override
+    public ProxyFetchResult fetchMetadataFromProxies(ManagedRepositoryContent repository, String logicalPath )
+    {
+        Path target = Paths.get(repository.getRepoRoot(), logicalPath );
+        try
+        {
+            FileUtils.copyFile( archivaDavResourceFactoryTest.getProjectBase().resolve( "target/test-classes/maven-metadata.xml" ).toFile(), target.toFile() );
+        }
+        catch ( IOException e )
+        {
+
+        }
+
+        return new ProxyFetchResult( target, true );
+    }
+}
diff --git a/archiva-modules/plugins/maven2-repository/pom.xml b/archiva-modules/plugins/maven2-repository/pom.xml
index 0691eb7..d16eb97 100644
--- a/archiva-modules/plugins/maven2-repository/pom.xml
+++ b/archiva-modules/plugins/maven2-repository/pom.xml
@@ -54,6 +54,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-model</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-proxy-maven</artifactId>
       <exclusions>
         <exclusion>
@@ -202,6 +206,7 @@
       <scope>test</scope>
     </dependency>
 
+
   </dependencies>
   <build>
     <plugins>
diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
index 45a699a..b7011ca 100644
--- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
+++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
@@ -45,12 +45,7 @@ import org.apache.archiva.proxy.maven.WagonFactory;
 import org.apache.archiva.proxy.model.NetworkProxy;
 import org.apache.archiva.proxy.model.ProxyConnector;
 import org.apache.archiva.proxy.model.RepositoryProxyHandler;
-import org.apache.archiva.repository.LayoutException;
-import org.apache.archiva.repository.ManagedRepository;
-import org.apache.archiva.repository.ManagedRepositoryContent;
-import org.apache.archiva.repository.ReleaseScheme;
-import org.apache.archiva.repository.RemoteRepository;
-import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.*;
 import org.apache.archiva.repository.content.PathParser;
 import org.apache.archiva.repository.maven2.MavenSystemManager;
 import org.apache.archiva.xml.XMLException;
@@ -623,11 +618,15 @@ public class Maven2RepositoryStorage
         pomReference.setVersion(artifact.getVersion());
         pomReference.setType("pom");
 
-        RepositoryProxyHandler connectors =
-                applicationContext.getBean("repositoryProxyConnectors#default", RepositoryProxyHandler.class);
+        RepositoryType repositoryType = managedRepository.getRepository().getType();
+        if (!proxyRegistry.hasHandler(repositoryType)) {
+            throw new ProxyDownloadException("No proxy handler found for repository type "+repositoryType, new HashMap<>());
+        }
+
+        RepositoryProxyHandler proxyHandler = proxyRegistry.getHandler(repositoryType).get(0);
 
         // Get the artifact POM from proxied repositories if needed
-        connectors.fetchFromProxies(managedRepository, pomReference);
+        proxyHandler.fetchFromProxies(managedRepository, pomReference);
 
         // Open and read the POM from the managed repo
         Path pom = managedRepository.toFile(pomReference);
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/MockRepositoryArchivaTaskScheduler.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/MockRepositoryArchivaTaskScheduler.java
new file mode 100644
index 0000000..08bcd96
--- /dev/null
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/MockRepositoryArchivaTaskScheduler.java
@@ -0,0 +1,58 @@
+package org.apache.archiva.metadata.repository;
+/*
+ * 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.archiva.redback.components.taskqueue.TaskQueueException;
+import org.apache.archiva.scheduler.repository.model.RepositoryArchivaTaskScheduler;
+import org.apache.archiva.scheduler.repository.model.RepositoryTask;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Olivier Lamy
+ */
+@Service ("archivaTaskScheduler#repositoryMock")
+public class MockRepositoryArchivaTaskScheduler
+    implements RepositoryArchivaTaskScheduler
+{
+    @Override
+    public boolean isProcessingRepositoryTask( String repositoryId )
+    {
+        return false;
+    }
+
+    @Override
+    public boolean isProcessingRepositoryTask( RepositoryTask task )
+    {
+        return false;
+    }
+
+    @Override
+    public void queueTask( RepositoryTask task )
+        throws TaskQueueException
+    {
+        // no op
+    }
+
+    @Override
+    public boolean unQueueTask( RepositoryTask task )
+        throws TaskQueueException
+    {
+        return false;
+    }
+}
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
index 6594fda..c10f13d 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
@@ -395,8 +395,10 @@ public class Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
     {
         copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-module-b",
                                     "target/test-repository/com/example/test/test-artifact-module-b" );
+        copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-parent",
+                "target/test-repository/com/example/test/test-artifact-parent" );
         copyTestArtifactWithParent( "src/test/resources/com/example/test/test-snapshot-artifact-root",
-                "target/test-repositorys/com/example/test/test-snapshot-artifact-root" );
+                "target/test-repository/com/example/test/test-snapshot-artifact-root" );
 
         ReadMetadataRequest readMetadataRequest =
             new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "com.example.test" ).projectId(
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
index 55ef898..e094a20 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
@@ -155,6 +155,11 @@ public class Maven2RepositoryMetadataResolverMRM1411Test
     {
         copyTestArtifactWithParent( "target/test-classes/com/example/test/test-artifact-module-a",
                                     "target/test-repository/com/example/test/test-artifact-module-a" );
+        copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-parent",
+                "target/test-repository/com/example/test/test-artifact-parent" );
+
+        copyTestArtifactWithParent( "target/test-classes/com/example/test/test-artifact-root",
+                "target/test-repository/com/example/test/test-artifact-root" );
 
         ProjectVersionMetadata metadata = storage.readProjectVersionMetadata(
             new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "test-artifact-module-a", "1.0" ) );
@@ -258,8 +263,11 @@ public class Maven2RepositoryMetadataResolverMRM1411Test
         copyTestArtifactWithParent( "target/test-classes/com/example/test/test-snapshot-artifact-module-a",
                                     "target/test-repository/com/example/test/test-snapshot-artifact-module-a" );
 
-        //copyTestArtifactWithParent( "target/test-classes/com/example/test/test-snapshot-artifact-root",
-        //                            "target/test-repository/com/example/test/test-snapshot-artifact-root" );
+        copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-parent",
+                "target/test-repository/com/example/test/test-artifact-parent" );
+
+        copyTestArtifactWithParent( "target/test-classes/com/example/test/test-snapshot-artifact-root",
+                                    "target/test-repository/com/example/test/test-snapshot-artifact-root" );
 
         ProjectVersionMetadata metadata = storage.readProjectVersionMetadata(
             new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "test-snapshot-artifact-module-a",
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
index 4c3168f..dd4ecd9 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
@@ -35,7 +35,7 @@ import java.nio.file.Paths;
  * @author Olivier Lamy
  */
 @RunWith( ArchivaSpringJUnit4ClassRunner.class )
-@ContextConfiguration( { "classpath*:/META-INF/spring-context.xml" } )
+@ContextConfiguration( { "classpath*:/spring-context-storage.xml", "classpath*:META-INF/spring-context.xml" } )
 public class Maven2RepositoryStorageTest
 {
     @Inject
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/META-INF/spring-context.xml
similarity index 99%
rename from archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml
rename to archiva-modules/plugins/maven2-repository/src/test/resources/META-INF/spring-context.xml
index 537762d..5b72119 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml
+++ b/archiva-modules/plugins/maven2-repository/src/test/resources/META-INF/spring-context.xml
@@ -26,4 +26,5 @@
 
 
 
+
 </beans>
\ No newline at end of file
diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context-storage.xml
similarity index 52%
copy from archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
copy to archiva-modules/plugins/maven2-repository/src/test/resources/spring-context-storage.xml
index 064fdb6..f88f88f 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
+++ b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context-storage.xml
@@ -28,11 +28,36 @@
        default-lazy-init="true">
 
   <context:annotation-config/>
-  <context:component-scan base-package="org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/>
+  <context:component-scan base-package="org.apache.archiva.policies.urlcache,org.apache.archiva.proxy,org.apache.archiva.proxy.maven,org.apache.archiva.indexer,org.apache.maven.index,org.apache.archiva.repository,org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/>
 
 
+  <bean name="archivaConfiguration#test" class="org.apache.archiva.metadata.repository.storage.maven2.conf.MockConfiguration"/>
   <alias name="archivaConfiguration#test" alias="archivaConfiguration#default"/>
   <alias name="archivaConfiguration#test" alias="archivaConfiguration"/>
 
   <alias name="metadataResolver#test" alias="metadataResolver#default"/>
+
+  <alias name="archivaTaskScheduler#repositoryMock" alias="archivaTaskScheduler#repository" />
+
+  <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler">
+    <property name="properties">
+      <props>
+        <prop key="org.quartz.scheduler.instanceName">scheduler1</prop>
+        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
+        <prop key="org.quartz.threadPool.threadCount">1</prop>
+        <prop key="org.quartz.threadPool.threadPriority">4</prop>
+        <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
+      </props>
+    </property>
+  </bean>
+
+  <bean name="metadataTools#default" class="org.apache.archiva.repository.metadata.MetadataTools">
+    <property name="configuration" ref="archivaConfiguration#default"/>
+  </bean>
+
+  <bean name="filetypes" class="org.apache.archiva.configuration.FileTypes">
+    <property name="archivaConfiguration" ref="archivaConfiguration#default"/>
+  </bean>
+
+
 </beans>
\ No newline at end of file
diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
index 064fdb6..85fa73c 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
+++ b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
@@ -28,11 +28,37 @@
        default-lazy-init="true">
 
   <context:annotation-config/>
-  <context:component-scan base-package="org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/>
+  <context:component-scan base-package="org.apache.archiva.repository,org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/>
 
 
+  <bean name="archivaConfiguration#test" class="org.apache.archiva.configuration.DefaultArchivaConfiguration">
+  </bean>
   <alias name="archivaConfiguration#test" alias="archivaConfiguration#default"/>
   <alias name="archivaConfiguration#test" alias="archivaConfiguration"/>
 
   <alias name="metadataResolver#test" alias="metadataResolver#default"/>
+
+  <alias name="archivaTaskScheduler#repositoryMock" alias="archivaTaskScheduler#repository" />
+
+  <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler">
+    <property name="properties">
+      <props>
+        <prop key="org.quartz.scheduler.instanceName">scheduler1</prop>
+        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
+        <prop key="org.quartz.threadPool.threadCount">1</prop>
+        <prop key="org.quartz.threadPool.threadPriority">4</prop>
+        <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
+      </props>
+    </property>
+  </bean>
+
+  <bean name="metadataTools#default" class="org.apache.archiva.repository.metadata.MetadataTools">
+    <property name="configuration" ref="archivaConfiguration#default"/>
+  </bean>
+
+  <bean name="filetypes" class="org.apache.archiva.configuration.FileTypes">
+    <property name="archivaConfiguration" ref="archivaConfiguration#default"/>
+  </bean>
+
+
 </beans>
\ No newline at end of file
diff --git a/src/ci/scripts/prepareWorkspace.sh b/src/ci/scripts/prepareWorkspace.sh
index b93c7a0..bdb31ee 100755
--- a/src/ci/scripts/prepareWorkspace.sh
+++ b/src/ci/scripts/prepareWorkspace.sh
@@ -22,7 +22,7 @@
 #
 #  Removes directories that are not used anymore.
 ##
-ATTIC_DIRS="archiva-modules/archiva-base/archiva-indexer"
+ATTIC_DIRS="archiva-modules/archiva-base/archiva-indexer archiva-modules/archiva-base/archiva-proxy-common"
 REMOVE_DIRS=".indexer"
 TMP_DIRECTORY=".tmp"