diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
index 6df43d7..a8daf16 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
@@ -234,6 +234,10 @@
                 {
                     log.warn( "skip error deleting artifact {}: {}", reference, e.getMessage( ) );
                 }
+                catch ( org.apache.archiva.repository.ContentAccessException e )
+                {
+                    e.printStackTrace( );
+                }
 
                 boolean snapshotVersion = VersionUtil.isSnapshot( reference.getVersion( ) );
 
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
index 56b3bf0..84a1d0f 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
@@ -181,6 +181,10 @@
         {
             log.error( "Could not remove metadata during cleanup of released snapshots of {}", path, e );
         }
+        catch ( org.apache.archiva.repository.ContentAccessException e )
+        {
+            e.printStackTrace( );
+        }
     }
 
 
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
index 1a443ee..f5ae868 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
@@ -115,7 +115,7 @@
                 {
                     if ( newArtifactFile.getModificationTime().toEpochMilli() < olderThanThisDate.getTimeInMillis( ) )
                     {
-                        artifactsToDelete.addAll( repository.getRelatedArtifacts( newArtifactReference ) );
+                        artifactsToDelete.addAll( repository.getRelatedArtifacts( repository.toVersion(newArtifactReference) ) );
                     }
                 }
                 // Is this a timestamp snapshot "1.0-20070822.123456-42" ?
@@ -125,7 +125,7 @@
 
                     if ( timestampCal.getTimeInMillis( ) < olderThanThisDate.getTimeInMillis( ) )
                     {
-                        artifactsToDelete.addAll( repository.getRelatedArtifacts( newArtifactReference ) );
+                        artifactsToDelete.addAll( repository.getRelatedArtifacts( repository.toVersion(newArtifactReference) ) );
                     }
                 }
             }
@@ -139,6 +139,10 @@
         {
             log.debug( "Not processing file that is not an artifact: {}", e.getMessage( ) );
         }
+        catch ( org.apache.archiva.repository.ContentAccessException e )
+        {
+            e.printStackTrace( );
+        }
     }
 
     private Calendar uniqueSnapshotToCalendar( String version )
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
index 5cd523d..af617c1 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
@@ -94,7 +94,8 @@
                     {
                         break;
                     }
-                    artifactsToDelete.addAll( repository.getRelatedArtifacts( getNewArtifactReference( artifact, version ) ) );
+                    VersionedReference ref = repository.toVersion( getNewArtifactReference( artifact, version ) );
+                    artifactsToDelete.addAll( repository.getRelatedArtifacts( ref ) );
                 }
                 purge( artifactsToDelete );
             }
@@ -107,6 +108,10 @@
         {
             log.error( "Repostory artifact not found {}", path );
         }
+        catch ( org.apache.archiva.repository.ContentAccessException e )
+        {
+            e.printStackTrace( );
+        }
     }
 
     /*
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ContentNotFoundException.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ContentNotFoundException.java
index 7579deb..63e7ee7 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ContentNotFoundException.java
+++ b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ContentNotFoundException.java
@@ -20,8 +20,8 @@
  */
 
 /**
- * ContentNotFoundException is thrown in response for requests for content that is not the repository. 
  *
+ * ContentNotFoundException is thrown in response for requests for content that is not in the repository.
  *
  */
 public class ContentNotFoundException
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java
index 2948044..5dd39cc 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java
+++ b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java
@@ -48,7 +48,15 @@
     VersionedReference toVersion( String groupId, String artifactId, String version );
 
     /**
-     * Return the version reference the artifact is part of.
+     * Returns the version reference that represents the generic version, which means that
+     * snapshot versions are converted to <VERSION>-SNAPSHOT
+     * @param artifactReference the artifact reference
+     * @return the generic version
+     */
+    VersionedReference toGenericVersion( ArtifactReference artifactReference );
+
+    /**
+     * Return the version reference that matches exactly the version string of the artifact
      *
      * @param artifactReference The artifact reference
      * @return the version reference
@@ -75,7 +83,7 @@
      * @throws ContentNotFoundException
      */
     void deleteVersion( VersionedReference reference )
-        throws ContentNotFoundException;
+        throws ContentNotFoundException, ContentAccessException;
 
     /**
      * delete a specified artifact from the repository
@@ -84,7 +92,7 @@
      * @throws ContentNotFoundException
      */
     void deleteArtifact( ArtifactReference artifactReference )
-        throws ContentNotFoundException;
+        throws ContentNotFoundException, ContentAccessException;
 
     /**
      * @param groupId
@@ -92,7 +100,7 @@
      * @since 1.4-M3
      */
     void deleteGroupId( String groupId )
-        throws ContentNotFoundException;
+        throws ContentNotFoundException, ContentAccessException;
 
     /**
      *
@@ -101,7 +109,15 @@
      * @throws ContentNotFoundException
      */
     void deleteProject( String namespace, String projectId )
-        throws RepositoryException;
+        throws ContentNotFoundException, ContentAccessException;
+
+
+    /**
+     * Deletes a project
+     * @param reference
+     */
+    void deleteProject(ProjectReference reference) throws ContentNotFoundException, ContentAccessException;
+
 
     /**
      * <p>
@@ -118,6 +134,26 @@
     /**
      * <p>
      * Gather up the list of related artifacts to the ArtifactReference provided.
+     * If type and / or classifier of the reference is set, this returns only a list of artifacts that is directly
+     * related to the given artifact, like checksums.
+     * If type and classifier is <code>null</code> it will return the same artifacts as 
+     * {@link #getRelatedArtifacts(VersionedReference)}
+     * </p>
+     * <p>
+     * <strong>NOTE:</strong> Some layouts (such as maven 1 "legacy") are not compatible with this query.
+     * </p>
+     *
+     * @param reference the reference to work off of.
+     * @return the list of ArtifactReferences for related artifacts, if
+     * @throws ContentNotFoundException if the initial artifact reference does not exist within the repository.
+     * @see #getRelatedArtifacts(VersionedReference)
+     */
+    List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference )
+        throws ContentNotFoundException, LayoutException, ContentAccessException;
+
+    /**
+     * <p>
+     * Gather up the list of related artifacts to the ArtifactReference provided.
      * This typically includes the pom files, and those things with
      * classifiers (such as doc, source code, test libs, etc...). Even if the classifier
      * is set in the artifact reference, it may return artifacts with different classifiers.
@@ -130,9 +166,8 @@
      * @return the list of ArtifactReferences for related artifacts, if
      * @throws ContentNotFoundException if the initial artifact reference does not exist within the repository.
      */
-    List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference )
-        throws ContentNotFoundException, LayoutException;
-
+    List<ArtifactReference> getRelatedArtifacts( VersionedReference reference )
+        throws ContentNotFoundException, LayoutException, ContentAccessException;
     /**
      * Returns all the assets that belong to a given artifact type. The list returned contain
      * all the files that correspond to the given artifact reference.
@@ -142,14 +177,14 @@
      * @param reference
      * @return
      */
-    List<StorageAsset> getRelatedAssets(ArtifactReference reference) throws ContentNotFoundException, LayoutException;
+    List<StorageAsset> getRelatedAssets(ArtifactReference reference) throws ContentNotFoundException, LayoutException, ContentAccessException;
 
     /**
      * Returns all artifacts that belong to a given version
      * @param reference the version reference
      * @return the list of artifacts or a empty list
      */
-    List<ArtifactReference> getArtifacts(VersionedReference reference) throws ContentNotFoundException, LayoutException;
+    List<ArtifactReference> getArtifacts(VersionedReference reference) throws ContentNotFoundException, LayoutException, ContentAccessException;
 
 
 
@@ -184,7 +219,7 @@
      * @throws LayoutException
      */
     Set<String> getVersions( ProjectReference reference )
-        throws ContentNotFoundException, LayoutException;
+        throws ContentNotFoundException, LayoutException, ContentAccessException;
 
 
 
@@ -202,7 +237,7 @@
      * @throws ContentNotFoundException if the versioned reference does not exist within the repository.
      */
     Set<String> getVersions( VersionedReference reference )
-        throws ContentNotFoundException;
+        throws ContentNotFoundException, ContentAccessException, LayoutException;
 
     /**
      * Determines if the artifact referenced exists in the repository.
@@ -210,7 +245,7 @@
      * @param reference the artifact reference to check for.
      * @return true if the artifact referenced exists.
      */
-    boolean hasContent( ArtifactReference reference );
+    boolean hasContent( ArtifactReference reference ) throws ContentAccessException;
 
     /**
      * Determines if the project referenced exists in the repository.
@@ -218,7 +253,7 @@
      * @param reference the project reference to check for.
      * @return true it the project referenced exists.
      */
-    boolean hasContent( ProjectReference reference );
+    boolean hasContent( ProjectReference reference ) throws ContentAccessException;
 
     /**
      * Determines if the version reference exists in the repository.
@@ -226,7 +261,7 @@
      * @param reference the version reference to check for.
      * @return true if the version referenced exists.
      */
-    boolean hasContent( VersionedReference reference );
+    boolean hasContent( VersionedReference reference ) throws ContentAccessException;
 
     /**
      * Set the repository configuration to associate with this
@@ -242,6 +277,14 @@
      * @param reference the artifact reference to use.
      * @return the relative path to the artifact.
      */
+    StorageAsset toFile( VersionedReference reference );
+
+    /**
+     * Given an {@link ArtifactReference}, return the file reference to the artifact.
+     *
+     * @param reference the artifact reference to use.
+     * @return the relative path to the artifact.
+     */
     StorageAsset toFile( ArtifactReference reference );
 
     /**
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
index d85b3a3..b875be6 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
@@ -43,13 +43,11 @@
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.RemoteRepositoryContent;
-import org.apache.archiva.repository.Repository;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.metadata.MetadataReader;
 import org.apache.archiva.repository.metadata.RepositoryMetadataException;
 import org.apache.archiva.repository.storage.StorageAsset;
-import org.apache.archiva.xml.XMLException;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
@@ -148,7 +146,15 @@
                                                VersionedReference reference )
         throws LayoutException, IOException, ContentNotFoundException
     {
-        Set<String> foundVersions = managedRepository.getVersions( reference );
+        Set<String> foundVersions = null;
+        try
+        {
+            foundVersions = managedRepository.getVersions( reference );
+        }
+        catch ( org.apache.archiva.repository.ContentAccessException e )
+        {
+            e.printStackTrace( );
+        }
 
         // Next gather up the referenced 'latest' versions found in any proxied repositories
         // maven-metadata-${proxyId}.xml files that may be present.
@@ -519,7 +525,15 @@
         metadata.setArtifactId( reference.getArtifactId() );
 
         // Gather up all versions found in the managed repository.
-        Set<String> allVersions = managedRepository.getVersions( reference );
+        Set<String> allVersions = null;
+        try
+        {
+            allVersions = managedRepository.getVersions( reference );
+        }
+        catch ( org.apache.archiva.repository.ContentAccessException e )
+        {
+            e.printStackTrace( );
+        }
 
         // Gather up all plugins found in the managed repository.
         // TODO: do we know this information instead?
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index 3b42d27..3248430 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -23,11 +23,11 @@
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
+import org.apache.archiva.repository.ContentAccessException;
 import org.apache.archiva.repository.ContentNotFoundException;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
-import org.apache.archiva.repository.RepositoryException;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.springframework.stereotype.Service;
 
@@ -49,6 +49,12 @@
     }
 
     @Override
+    public VersionedReference toGenericVersion( ArtifactReference artifactReference )
+    {
+        return null;
+    }
+
+    @Override
     public VersionedReference toVersion( ArtifactReference artifactReference )
     {
         return null;
@@ -61,25 +67,31 @@
     }
 
     @Override
-    public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException
+    public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException
+    public void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteGroupId( String groupId ) throws ContentNotFoundException
+    public void deleteGroupId( String groupId ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteProject( String namespace, String projectId ) throws RepositoryException
+    public void deleteProject( String namespace, String projectId ) throws ContentNotFoundException, ContentAccessException
+    {
+
+    }
+
+    @Override
+    public void deleteProject( ProjectReference reference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
@@ -91,19 +103,25 @@
     }
 
     @Override
-    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public List<ArtifactReference> getArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException
+    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
+    {
+        return null;
+    }
+
+    @Override
+    public List<ArtifactReference> getArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
@@ -121,31 +139,31 @@
     }
 
     @Override
-    public Set<String> getVersions( ProjectReference reference ) throws ContentNotFoundException, LayoutException
+    public Set<String> getVersions( ProjectReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public Set<String> getVersions( VersionedReference reference ) throws ContentNotFoundException
+    public Set<String> getVersions( VersionedReference reference ) throws ContentNotFoundException, ContentAccessException, LayoutException
     {
         return null;
     }
 
     @Override
-    public boolean hasContent( ArtifactReference reference )
+    public boolean hasContent( ArtifactReference reference ) throws ContentAccessException
     {
         return false;
     }
 
     @Override
-    public boolean hasContent( ProjectReference reference )
+    public boolean hasContent( ProjectReference reference ) throws ContentAccessException
     {
         return false;
     }
 
     @Override
-    public boolean hasContent( VersionedReference reference )
+    public boolean hasContent( VersionedReference reference ) throws ContentAccessException
     {
         return false;
     }
@@ -157,6 +175,12 @@
     }
 
     @Override
+    public StorageAsset toFile( VersionedReference reference )
+    {
+        return null;
+    }
+
+    @Override
     public ArtifactReference toArtifactReference( String path ) throws LayoutException
     {
         return null;
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
index 6fec88e..86d43d1 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
@@ -65,6 +65,12 @@
     }
 
     @Override
+    public VersionedReference toGenericVersion( ArtifactReference artifactReference )
+    {
+        return null;
+    }
+
+    @Override
     public VersionedReference toVersion( ArtifactReference artifactReference )
     {
         return null;
@@ -77,25 +83,31 @@
     }
 
     @Override
-    public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException
+    public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException
+    public void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteGroupId( String groupId ) throws ContentNotFoundException
+    public void deleteGroupId( String groupId ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteProject( String namespace, String projectId ) throws RepositoryException
+    public void deleteProject( String namespace, String projectId ) throws ContentNotFoundException, ContentAccessException
+    {
+
+    }
+
+    @Override
+    public void deleteProject( ProjectReference reference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
@@ -107,19 +119,25 @@
     }
 
     @Override
-    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public List<ArtifactReference> getArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException
+    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
+    {
+        return null;
+    }
+
+    @Override
+    public List<ArtifactReference> getArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
@@ -148,31 +166,31 @@
     }
 
     @Override
-    public Set<String> getVersions( ProjectReference reference ) throws ContentNotFoundException, LayoutException
+    public Set<String> getVersions( ProjectReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public Set<String> getVersions( VersionedReference reference ) throws ContentNotFoundException
+    public Set<String> getVersions( VersionedReference reference ) throws ContentNotFoundException, ContentAccessException, LayoutException
     {
         return null;
     }
 
     @Override
-    public boolean hasContent( ArtifactReference reference )
+    public boolean hasContent( ArtifactReference reference ) throws ContentAccessException
     {
         return false;
     }
 
     @Override
-    public boolean hasContent( ProjectReference reference )
+    public boolean hasContent( ProjectReference reference ) throws ContentAccessException
     {
         return false;
     }
 
     @Override
-    public boolean hasContent( VersionedReference reference )
+    public boolean hasContent( VersionedReference reference ) throws ContentAccessException
     {
         return false;
     }
@@ -183,6 +201,12 @@
         this.repository = repo;
     }
 
+    @Override
+    public StorageAsset toFile( VersionedReference reference )
+    {
+        return null;
+    }
+
     private Map<ArtifactReference, String> refs = new HashMap<>();
 
     @Override
diff --git a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index 3aba949..f263345 100644
--- a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -69,6 +69,12 @@
     }
 
     @Override
+    public VersionedReference toGenericVersion( ArtifactReference artifactReference )
+    {
+        return null;
+    }
+
+    @Override
     public VersionedReference toVersion( ArtifactReference artifactReference )
     {
         return null;
@@ -81,25 +87,31 @@
     }
 
     @Override
-    public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException
+    public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException
+    public void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteGroupId( String groupId ) throws ContentNotFoundException
+    public void deleteGroupId( String groupId ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
 
     @Override
-    public void deleteProject( String namespace, String projectId ) throws RepositoryException
+    public void deleteProject( String namespace, String projectId ) throws ContentNotFoundException, ContentAccessException
+    {
+
+    }
+
+    @Override
+    public void deleteProject( ProjectReference reference ) throws ContentNotFoundException, ContentAccessException
     {
 
     }
@@ -111,19 +123,25 @@
     }
 
     @Override
-    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public List<ArtifactReference> getArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException
+    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
+    {
+        return null;
+    }
+
+    @Override
+    public List<ArtifactReference> getArtifacts( VersionedReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
@@ -152,31 +170,31 @@
     }
 
     @Override
-    public Set<String> getVersions( ProjectReference reference ) throws ContentNotFoundException, LayoutException
+    public Set<String> getVersions( ProjectReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
 
     @Override
-    public Set<String> getVersions( VersionedReference reference ) throws ContentNotFoundException
+    public Set<String> getVersions( VersionedReference reference ) throws ContentNotFoundException, ContentAccessException, LayoutException
     {
         return null;
     }
 
     @Override
-    public boolean hasContent( ArtifactReference reference )
+    public boolean hasContent( ArtifactReference reference ) throws ContentAccessException
     {
         return false;
     }
 
     @Override
-    public boolean hasContent( ProjectReference reference )
+    public boolean hasContent( ProjectReference reference ) throws ContentAccessException
     {
         return false;
     }
 
     @Override
-    public boolean hasContent( VersionedReference reference )
+    public boolean hasContent( VersionedReference reference ) throws ContentAccessException
     {
         return false;
     }
@@ -187,6 +205,12 @@
         this.repository = repo;
     }
 
+    @Override
+    public StorageAsset toFile( VersionedReference reference )
+    {
+        return null;
+    }
+
     private Map<ArtifactReference, String> refs = new HashMap<>();
 
     @Override
diff --git a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
index 6336d0a..ba14ac0 100644
--- a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
+++ b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
@@ -20,7 +20,6 @@
  */
 
 import org.apache.archiva.common.filelock.FileLockManager;
-import org.apache.archiva.common.utils.PathUtil;
 import org.apache.archiva.common.utils.VersionUtil;
 import org.apache.archiva.configuration.FileTypes;
 import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider;
@@ -29,12 +28,12 @@
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
+import org.apache.archiva.repository.ContentAccessException;
 import org.apache.archiva.repository.ContentNotFoundException;
 import org.apache.archiva.repository.EditableManagedRepository;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
-import org.apache.archiva.repository.RepositoryException;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.commons.lang3.StringUtils;
 
@@ -44,10 +43,10 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -94,11 +93,13 @@
      */
     @Override
     public VersionedReference toVersion( String groupId, String artifactId, String version ) {
-        VersionedReference ref = new VersionedReference();
-        ref.setGroupId(groupId);
-        ref.setArtifactId(artifactId);
-        ref.setVersion(version);
-        return ref;
+        return new VersionedReference().groupId( groupId ).artifactId( artifactId ).version( version );
+    }
+
+    @Override
+    public VersionedReference toGenericVersion( ArtifactReference artifactReference )
+    {
+        return toVersion( artifactReference.getGroupId( ), artifactReference.getArtifactId( ), VersionUtil.getBaseVersion( artifactReference.getVersion( ) ));
     }
 
     /**
@@ -107,102 +108,133 @@
      * @return
      */
     public VersionedReference toVersion( ArtifactReference artifactReference) {
-        return toVersion( artifactReference.getGroupId( ), artifactReference.getArtifactId( ), VersionUtil.getBaseVersion( artifactReference.getVersion( ) ));
+        return toVersion( artifactReference.getGroupId( ), artifactReference.getArtifactId( ), artifactReference.getVersion( ) );
     }
 
     @Override
     public ArtifactReference toArtifact( String groupId, String artifactId, String version, String type, String classifier) {
-        ArtifactReference ar = new ArtifactReference( );
-        ar.setGroupId( groupId );
-        ar.setArtifactId( artifactId );
-        ar.setVersion( version );
-        ar.setType( type );
-        ar.setClassifier( classifier );
-        return ar;
+        return new ArtifactReference( ).groupId( groupId ).artifactId( artifactId ).version( version ).type( type ).classifier( classifier );
     }
 
 
     @Override
-    public void deleteVersion( VersionedReference reference )
+    public void deleteVersion( VersionedReference ref ) throws ContentNotFoundException, ContentAccessException
     {
-        Path projectDir = getRepoDir().resolve(toPath(reference));
-        if ( Files.exists(projectDir) && Files.isDirectory(projectDir) )
+        final String path = toPath( ref );
+        final Path deleteTarget = getRepoDir().resolve(path);
+        if ( !Files.exists(deleteTarget) )
         {
-            org.apache.archiva.common.utils.FileUtils.deleteQuietly( projectDir );
+            log.warn( "Version path for repository {} does not exist: {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Version not found for repository "+getId()+": "+path );
         }
-    }
-
-    @Override
-    public void deleteProject( String namespace, String projectId )
-        throws RepositoryException
-    {
-        ProjectReference ref = new ProjectReference( );
-        ref.setGroupId( namespace );
-        ref.setArtifactId( projectId );
-        Path projDirectory = getRepoDir( ).resolve( toPath(ref) );
-        if ( !Files.exists(projDirectory) )
-        {
-            throw new ContentNotFoundException( "cannot found project " + namespace + ":" + projectId );
-        }
-        if ( Files.isDirectory(projDirectory) )
+        if ( Files.isDirectory(deleteTarget) )
         {
             try
             {
-                org.apache.archiva.common.utils.FileUtils.deleteDirectory( projDirectory );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( deleteTarget );
             }
             catch ( IOException e )
             {
-                throw new RepositoryException( e.getMessage(), e );
+                log.error( "Could not delete file path {}: {}", deleteTarget, e.getMessage( ), e );
+                throw new ContentAccessException( "Error while trying to delete path "+path+" from repository "+getId()+": "+e.getMessage( ), e );
+            }
+        } else {
+            log.warn( "Version path for repository {} is not a directory {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Version path for repository "+getId()+" is not directory: " + path );
+        }
+    }
+
+    @Override
+    public void deleteProject( ProjectReference ref )
+        throws ContentNotFoundException, ContentAccessException
+    {
+        final String path = toPath( ref );
+        final Path deleteTarget = getRepoDir( ).resolve( path );
+        if ( !Files.exists(deleteTarget) )
+        {
+            log.warn( "Project path for repository {} does not exist: {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Project not found for repository "+getId()+": "+path );
+        }
+        if ( Files.isDirectory(deleteTarget) )
+        {
+            try
+            {
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( deleteTarget );
+            }
+            catch ( IOException e )
+            {
+                log.error( "Could not delete file path {}: {}", deleteTarget, e.getMessage( ), e );
+                throw new ContentAccessException( "Error while trying to delete path "+path+" from repository "+getId()+": "+e.getMessage( ), e );
             }
         }
         else
         {
-            log.warn( "project {}:{} is not a directory", namespace, projectId );
+            log.warn( "Project path for repository {} is not a directory {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Project path for repository "+getId()+" is not directory: " + path );
         }
 
     }
 
     @Override
-    public void deleteArtifact( ArtifactReference artifactReference )
+    public void deleteProject( String namespace, String projectId ) throws ContentNotFoundException, ContentAccessException
     {
+        this.deleteProject( new ProjectReference().groupId( namespace ).artifactId( projectId ) );
+    }
+
+    @Override
+    public void deleteArtifact( ArtifactReference ref ) throws ContentNotFoundException, ContentAccessException
+    {
+        final String path = toPath( ref );
         final Path repoDir = getRepoDir( );
-        Path filePath = repoDir.resolve( toPath( artifactReference ) );
-        Path parentPath = filePath.getParent( );
-        if ( Files.exists(filePath) )
+        Path deleteTarget = repoDir.resolve( path );
+        if ( Files.exists(deleteTarget) )
         {
-            org.apache.archiva.common.utils.FileUtils.deleteQuietly( filePath );
+            try
+            {
+                if (Files.isDirectory( deleteTarget ))
+                {
+                    org.apache.archiva.common.utils.FileUtils.deleteDirectory( deleteTarget );
+                } else {
+                    Files.delete( deleteTarget );
+                }
+            }
+            catch ( IOException e )
+            {
+                log.error( "Could not delete file path {}: {}", deleteTarget, e.getMessage( ), e );
+                throw new ContentAccessException( "Error while trying to delete path "+path+" from repository "+getId()+": "+e.getMessage( ), e );
+            }
+        } else {
+            log.warn( "Artifact path for repository {} does not exist: {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Artifact not found for repository "+getId()+": "+path );
         }
 
-        Path filePathmd5 = parentPath.resolve( filePath.getFileName().toString()+".md5" );
-
-        if ( Files.exists(filePathmd5) )
-        {
-            org.apache.archiva.common.utils.FileUtils.deleteQuietly( filePathmd5 );
-        }
-
-        Path filePathsha1 = parentPath.resolve( filePath.getFileName().toString()+ ".sha1" );
-
-        if ( Files.exists(filePathsha1) )
-        {
-            org.apache.archiva.common.utils.FileUtils.deleteQuietly( filePathsha1 );
-        }
     }
 
     @Override
     public void deleteGroupId( String groupId )
-        throws ContentNotFoundException
+        throws ContentNotFoundException, ContentAccessException
     {
-        Path directory = getRepoDir( ).resolve( toPath( groupId ) );
-        if ( Files.exists(directory) )
+        final String path = toPath( groupId );
+        final Path deleteTarget = getRepoDir( ).resolve( path );
+        if (!Files.exists(deleteTarget)) {
+            log.warn( "Namespace path for repository {} does not exist: {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Namespace not found for repository "+getId()+": "+path );
+        }
+        if ( Files.isDirectory(deleteTarget) )
         {
             try
             {
-                org.apache.archiva.common.utils.FileUtils.deleteDirectory( directory );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( deleteTarget );
             }
             catch ( IOException e )
             {
-                log.warn( "skip error deleting directory {}:", directory, e );
+                log.error( "Could not delete file path {}: {}", deleteTarget, e.getMessage( ), e );
+                throw new ContentAccessException( "Error while trying to delete path "+path+" from repository "+getId()+": "+e.getMessage( ), e );
             }
+        } else {
+            log.warn( "Namespace path for repository {} is not a directory {}", getId(), deleteTarget );
+            throw new ContentNotFoundException( "Namespace path for repository "+getId()+" is not directory: " + path );
+
         }
     }
 
@@ -213,11 +245,115 @@
     }
 
     @Override
-    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference )
-        throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getRelatedArtifacts( VersionedReference reference )
+        throws ContentNotFoundException, LayoutException, ContentAccessException
     {
+        StorageAsset artifactDir = toFile( reference );
+        if ( !artifactDir.exists())
+        {
+            throw new ContentNotFoundException(
+                "Unable to get related artifacts using a non-existant directory: " + artifactDir.getPath() );
+        }
+
+        if ( !artifactDir.isContainer() )
+        {
+            throw new ContentNotFoundException(
+                "Unable to get related artifacts using a non-directory: " + artifactDir.getPath() );
+        }
+
+        // First gather up the versions found as artifacts in the managed repository.
+
+        try (Stream<StorageAsset> stream = artifactDir.list().stream() ) {
+            return stream.filter(asset -> !asset.isContainer()).map(path -> {
+                try {
+                    ArtifactReference artifact = toArtifactReference(path.getPath());
+                    if( artifact.getGroupId().equals( reference.getGroupId() ) && artifact.getArtifactId().equals(
+                            reference.getArtifactId() ) && artifact.getVersion().equals( reference.getVersion() )) {
+                        return artifact;
+                    } else {
+                        return null;
+                    }
+                } catch (LayoutException e) {
+                    log.debug( "Not processing file that is not an artifact: {}", e.getMessage() );
+                    return null;
+                }
+            }).filter(Objects::nonNull).collect(Collectors.toList());
+        } catch (RuntimeException e) {
+            Throwable cause = e.getCause( );
+            if (cause!=null) {
+                if (cause instanceof LayoutException) {
+                    throw (LayoutException)cause;
+                } else
+                {
+                    throw new ContentAccessException( cause.getMessage( ), cause );
+                }
+            } else {
+                throw new ContentAccessException( e.getMessage( ), e );
+            }
+        }
+    }
+
+    /*
+     * Create the filter for various combinations of classifier and type
+     */
+    private Predicate<ArtifactReference> getChecker(ArtifactReference referenceObject, String extension) {
+        // TODO: Check, if extension is the correct parameter here
+        // We compare type with extension which works for artifacts like .jar.md5 but may
+        // be not the best way.
+
+        if (referenceObject.getClassifier()!=null && referenceObject.getType()!=null) {
+            return ((ArtifactReference a) ->
+                referenceObject.getGroupId().equals( a.getGroupId() )
+                && referenceObject.getArtifactId().equals( a.getArtifactId() )
+                && referenceObject.getVersion( ).equals( a.getVersion( ) )
+                && ( (a.getType()==null)
+                    || referenceObject.getType().equals( a.getType() )
+                    || a.getType().startsWith(extension) )
+                && referenceObject.getClassifier().equals( a.getClassifier() )
+            );
+        } else if (referenceObject.getClassifier()!=null && referenceObject.getType()==null){
+            return ((ArtifactReference a) ->
+                referenceObject.getGroupId().equals( a.getGroupId() )
+                    && referenceObject.getArtifactId().equals( a.getArtifactId() )
+                    && referenceObject.getVersion( ).equals( a.getVersion( ) )
+                    && referenceObject.getClassifier().equals( a.getClassifier() )
+            );
+        } else if (referenceObject.getClassifier()==null && referenceObject.getType()!=null){
+            return ((ArtifactReference a) ->
+                referenceObject.getGroupId().equals( a.getGroupId() )
+                    && referenceObject.getArtifactId().equals( a.getArtifactId() )
+                    && referenceObject.getVersion( ).equals( a.getVersion( ) )
+                    && ( (a.getType()==null)
+                    || referenceObject.getType().equals( a.getType() )
+                    || a.getType().startsWith(extension) )
+            );
+        } else {
+            return ((ArtifactReference a) ->
+                referenceObject.getGroupId().equals( a.getGroupId() )
+                    && referenceObject.getArtifactId().equals( a.getArtifactId() )
+                    && referenceObject.getVersion( ).equals( a.getVersion( ) )
+            );
+        }
+
+
+    }
+
+    @Override
+    public List<ArtifactReference> getRelatedArtifacts( ArtifactReference reference )
+        throws ContentNotFoundException, LayoutException, ContentAccessException
+    {
+        if ( StringUtils.isEmpty( reference.getType() ) && StringUtils.isEmpty( reference.getClassifier() ) ) {
+            return getRelatedArtifacts( toVersion( reference ) );
+        }
+
         StorageAsset artifactFile = toFile( reference );
         StorageAsset repoDir = artifactFile.getParent();
+        String ext;
+        if (!artifactFile.isContainer()) {
+            ext = StringUtils.substringAfterLast( artifactFile.getName(), ".");
+        } else {
+            ext = "";
+        }
 
         if ( !repoDir.exists())
         {
@@ -234,25 +370,33 @@
         // First gather up the versions found as artifacts in the managed repository.
 
         try (Stream<StorageAsset> stream = repoDir.list().stream() ) {
-            return stream.filter(asset -> !asset.isContainer()).map(path -> {
+            return stream.filter(
+                asset -> !asset.isContainer())
+                .map(path -> {
                 try {
-                    ArtifactReference artifact = toArtifactReference(path.getPath());
-                    if( artifact.getGroupId().equals( reference.getGroupId() ) && artifact.getArtifactId().equals(
-                            reference.getArtifactId() ) && artifact.getVersion().equals( reference.getVersion() )) {
-                        return artifact;
-                    } else {
-                        return null;
-                    }
+                    return toArtifactReference(path.getPath());
                 } catch (LayoutException e) {
                     log.debug( "Not processing file that is not an artifact: {}", e.getMessage() );
                     return null;
                 }
-            }).filter(Objects::nonNull).collect(Collectors.toList());
+            }).filter(Objects::nonNull).filter(getChecker( reference, ext )).collect(Collectors.toList());
+        } catch (RuntimeException e) {
+            Throwable cause = e.getCause( );
+            if (cause!=null) {
+                if (cause instanceof LayoutException) {
+                    throw (LayoutException)cause;
+                } else
+                {
+                    throw new ContentAccessException( cause.getMessage( ), cause );
+                }
+            } else {
+                throw new ContentAccessException( e.getMessage( ), e );
+            }
         }
     }
 
     @Override
-    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException
+    public List<StorageAsset> getRelatedAssets( ArtifactReference reference ) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         return null;
     }
@@ -288,19 +432,20 @@
      */
     @Override
     public Set<String> getVersions( ProjectReference reference )
-        throws ContentNotFoundException, LayoutException
+        throws ContentNotFoundException, LayoutException, ContentAccessException
     {
+        final String path = toPath( reference );
         final Path projDir = getRepoDir().resolve(toPath(reference));
         if ( !Files.exists(projDir) )
         {
             throw new ContentNotFoundException(
-                "Unable to get Versions on a non-existant directory: " + projDir.toAbsolutePath() );
+                "Unable to get Versions on a non-existant directory for repository "+getId()+": " + path );
         }
 
         if ( !Files.isDirectory(projDir) )
         {
             throw new ContentNotFoundException(
-                "Unable to get Versions on a non-directory: " + projDir.toAbsolutePath() );
+                "Unable to get Versions on a non-directory for repository "+getId()+": " + path );
         }
 
         final String groupId = reference.getGroupId();
@@ -312,45 +457,50 @@
                     .collect(Collectors.toSet());
         } catch (IOException e) {
             log.error("Could not read directory {}: {}", projDir, e.getMessage(), e);
+            throw new ContentAccessException( "Could not read path for repository "+getId()+": "+ path, e );
         } catch (RuntimeException e) {
-            if (e.getCause()!=null)
+            Throwable cause = e.getCause( );
+            if (cause!=null)
             {
-                if ( e.getCause( ) instanceof LayoutException )
+                if ( cause instanceof LayoutException )
                 {
-                    throw (LayoutException) e.getCause( );
+                    throw (LayoutException) cause;
+                } else {
+                    log.error("Could not read directory {}: {}", projDir, cause.getMessage(), cause);
+                    throw new ContentAccessException( "Could not read path for repository "+getId()+": "+ path, cause );
                 }
-            }else {
-                throw e;
+            } else {
+                log.error("Could not read directory {}: {}", projDir, e.getMessage(), e);
+                throw new ContentAccessException( "Could not read path for repository "+getId()+": "+ path, cause );
             }
         }
-        return Collections.emptySet();
     }
 
     @Override
     public Set<String> getVersions( VersionedReference reference )
-        throws ContentNotFoundException
+        throws ContentNotFoundException, ContentAccessException, LayoutException
     {
         try(Stream<ArtifactReference> stream = getArtifactStream( reference ))
         {
             return stream.filter( Objects::nonNull )
                 .map( ar -> ar.getVersion( ) )
                 .collect( Collectors.toSet( ) );
-        }
-        catch ( LayoutException | IOException e )
-        {
-            throw new ContentNotFoundException( e.getMessage( ), e );
+        } catch (IOException e) {
+            final String path = toPath( reference );
+            log.error("Could not read directory from repository {} - {}: ", getId(), path, e.getMessage(), e);
+            throw new ContentAccessException( "Could not read path for repository "+getId()+": "+ path, e );
         }
     }
 
     @Override
-    public boolean hasContent( ArtifactReference reference )
+    public boolean hasContent( ArtifactReference reference ) throws ContentAccessException
     {
         StorageAsset artifactFile = toFile( reference );
         return artifactFile.exists() && !artifactFile.isContainer();
     }
 
     @Override
-    public boolean hasContent( ProjectReference reference )
+    public boolean hasContent( ProjectReference reference ) throws ContentAccessException
     {
         try
         {
@@ -364,16 +514,22 @@
     }
 
     @Override
-    public boolean hasContent( VersionedReference reference )
+    public boolean hasContent( VersionedReference reference ) throws ContentAccessException
     {
         try
         {
             return ( getFirstArtifact( reference ) != null );
         }
-        catch ( IOException | LayoutException | ContentNotFoundException e )
+        catch ( LayoutException | ContentNotFoundException e )
         {
             return false;
         }
+        catch ( IOException e )
+        {
+            String path = toPath( reference );
+            log.error("Could not read directory from repository {} - {}: ", getId(), path, e.getMessage(), e);
+            throw new ContentAccessException( "Could not read path from repository " + getId( ) + ": " + path, e );
+        }
     }
 
     @Override
@@ -439,6 +595,12 @@
         return repository.getAsset( toPath( reference ) );
     }
 
+    @Override
+    public StorageAsset toFile( VersionedReference reference )
+    {
+        return repository.getAsset( toPath( reference ) );
+    }
+
     /**
      * Get the first Artifact found in the provided VersionedReference location.
      *
@@ -481,15 +643,17 @@
                 .map(this::toArtifactRef);
     }
 
-    public List<ArtifactReference> getArtifacts(VersionedReference reference) throws ContentNotFoundException, LayoutException
+    public List<ArtifactReference> getArtifacts(VersionedReference reference) throws ContentNotFoundException, LayoutException, ContentAccessException
     {
         try (Stream<ArtifactReference> stream = getArtifactStream( reference ))
         {
             return stream.collect( Collectors.toList( ) );
         } catch ( IOException e )
         {
-            log.error( "Could not access the repository files: ", e.getMessage( ), e );
-            throw new ContentNotFoundException( e.getMessage( ), e );
+            String path = toPath( reference );
+            log.error("Could not read directory from repository {} - {}: ", getId(), path, e.getMessage(), e);
+            throw new ContentAccessException( "Could not read path from repository " + getId( ) + ": " + path, e );
+
         }
     }
 
diff --git a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
index c921adf..03a9b42 100644
--- a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
+++ b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/ManagedDefaultRepositoryContentTest.java
@@ -279,7 +279,7 @@
     }
 
     @Test
-    public void testDeleteArtifactWithType() throws IOException
+    public void testDeleteArtifactWithType() throws IOException, org.apache.archiva.repository.ContentNotFoundException, org.apache.archiva.repository.ContentAccessException
     {
         Path deleteRepo = setupRepoCopy( "delete-repository", "delete-repository-2" );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
@@ -298,8 +298,8 @@
 
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
         assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar" ) ) );
-        assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.md5" ) ) );
-        assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.sha1" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.md5" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.sha1" ) ) );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.pom" ) ) );
 
 
@@ -307,7 +307,7 @@
 
 
     @Test
-    public void testDeleteArtifactWithClassifier() throws IOException
+    public void testDeleteArtifactWithClassifier() throws IOException, org.apache.archiva.repository.ContentNotFoundException, org.apache.archiva.repository.ContentAccessException
     {
         Path deleteRepo = setupRepoCopy( "default-repository", "default-repository-2" );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
@@ -327,7 +327,7 @@
         repoContent.deleteArtifact( ref );
 
         assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
-        assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar.sha1" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar.sha1" ) ) );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar" ) ) );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.md5" ) ) );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.sha1" ) ) );
@@ -336,7 +336,7 @@
     }
 
     @Test
-    public void testDeleteArtifactWithoutType() throws IOException
+    public void testDeleteArtifactWithoutType() throws IOException, org.apache.archiva.repository.ContentNotFoundException, org.apache.archiva.repository.ContentAccessException
     {
         Path deleteRepo = setupRepoCopy( "default-repository", "default-repository-2" );
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
@@ -357,4 +357,41 @@
         assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar" ) ) );
 
     }
+
+
+    @Test
+    public void testDeleteVersion() throws IOException, org.apache.archiva.repository.ContentNotFoundException, org.apache.archiva.repository.ContentAccessException
+    {
+        Path deleteRepo = setupRepoCopy( "delete-repository", "delete-repository-2" );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.md5" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.sha1" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.pom" ) ) );
+
+        VersionedReference ref = new VersionedReference( ).groupId( "org.apache.maven" ).artifactId( "samplejar" ).version( "1.0" );
+
+        repoContent.deleteVersion( ref );
+
+        assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0" ) ) );
+
+    }
+
+    @Test
+    public void testDeleteProject() throws IOException, org.apache.archiva.repository.ContentNotFoundException, org.apache.archiva.repository.ContentAccessException
+    {
+        Path deleteRepo = setupRepoCopy( "delete-repository", "delete-repository-2" );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0-source.jar" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.md5" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar.sha1" ) ) );
+        assertTrue( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0/samplejar-1.0.pom" ) ) );
+
+        ProjectReference ref = new ProjectReference( ).groupId( "org.apache.maven" ).artifactId( "samplejar" );
+
+        repoContent.deleteProject( ref );
+
+        assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0" ) ) );
+
+    }
 }
diff --git a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/resources/log4j2-test.xml b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/resources/log4j2-test.xml
new file mode 100644
index 0000000..9457ae8
--- /dev/null
+++ b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/resources/log4j2-test.xml
@@ -0,0 +1,41 @@
+<?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.
+  -->
+<configuration>
+  <Properties>
+
+  </Properties>
+  <appenders>
+    <Console name="console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{ISO8601_PERIOD} [%L] [%t] %-5level %logger{3} - %msg%n"/>
+    </Console>
+    <!--
+    <RandomAccessFile name="LogFile" fileName="target/test.log">
+      <PatternLayout pattern="%d{ISO8601_PERIOD} [%L] [%t] %-5level %logger{3} - %msg%n"/>
+    </RandomAccessFile>
+    -->
+  </appenders>
+  <loggers>
+    <logger name="org.apache.archiva" level="error"/>
+    <logger name="org.apache.archiva.maven" level="info"/>
+    <root level="error" includeLocation="true">
+      <appender-ref ref="console"/>
+    </root>
+  </loggers>
+</configuration>
\ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
index 4c6561b..c313cd9 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
@@ -96,7 +96,6 @@
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
-import java.util.Set;
 import java.util.TimeZone;
 
 /**
@@ -684,7 +683,7 @@
 
             MetadataRepository metadataRepository = repositorySession.getRepository();
 
-            List<ArtifactReference> related = repository.getRelatedArtifacts( artifactReference );
+            List<ArtifactReference> related = repository.getRelatedArtifacts( repository.toVersion(artifactReference) );
             log.debug( "related: {}", related );
             for ( ArtifactReference artifactRef : related )
             {
@@ -793,7 +792,7 @@
             artifactReference.setGroupId( artifact.getGroupId() );
             artifactReference.setVersion( artifact.getVersion() );
             artifactReference.setClassifier( artifact.getClassifier() );
-            artifactReference.setType( artifact.getPackaging() );
+            artifactReference.setType( artifact.getType() );
 
             MetadataRepository metadataRepository = repositorySession.getRepository();
 
@@ -806,8 +805,10 @@
                     throw new ArchivaRestServiceException( "You must configure a type/packaging when using classifier",
                                                            400, null );
                 }
-
-                repository.deleteArtifact( artifactReference );
+                List<ArtifactReference> artifacts = repository.getRelatedArtifacts( artifactReference );
+                for (ArtifactReference aRef : artifacts ) {
+                    repository.deleteArtifact( aRef );
+                }
 
             }
             else
@@ -833,11 +834,18 @@
                 }
                 else
                 {
-                    List<ArtifactReference> related = repository.getRelatedArtifacts( artifactReference );
+                    // We are deleting all version related artifacts for a snapshot version
+                    VersionedReference versionRef = repository.toVersion( artifactReference );
+                    List<ArtifactReference> related = repository.getRelatedArtifacts( versionRef );
                     log.debug( "related: {}", related );
                     for ( ArtifactReference artifactRef : related )
                     {
-                        repository.deleteArtifact( artifactRef );
+                        try
+                        {
+                            repository.deleteArtifact( artifactRef );
+                        } catch (ContentNotFoundException e) {
+                            log.warn( "Artifact that should be deleted, was not found: {}", artifactRef );
+                        }
                     }
                     StorageAsset metadataFile = getMetadata( repo, targetPath.getPath() );
                     ArchivaRepositoryMetadata metadata = getMetadata( repository.getRepository().getType(), metadataFile );
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java
index 99a8688..7b765c2 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java
@@ -303,6 +303,7 @@
             artifact.setVersion( "1.0.1" );
             artifact.setClassifier( "javadoc" );
             artifact.setPackaging( "jar" );
+            artifact.setType( "javadoc" );
             artifact.setContext( SOURCE_REPO_ID );
 
             RepositoriesService repositoriesService = getRepositoriesService( authorizationHeader );
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 7c56f65..a2c90ec 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
@@ -40,7 +40,6 @@
 import org.apache.archiva.indexer.merger.TemporaryGroupIndex;
 import org.apache.archiva.indexer.search.RepositorySearch;
 import org.apache.archiva.indexer.search.RepositorySearchException;
-import org.apache.archiva.maven2.metadata.MavenMetadataReader;
 import org.apache.archiva.metadata.model.facets.AuditEvent;
 import org.apache.archiva.metadata.repository.storage.RelocationException;
 import org.apache.archiva.metadata.repository.storage.RepositoryStorage;
@@ -66,7 +65,6 @@
 import org.apache.archiva.repository.RepositoryGroup;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.RepositoryRequestInfo;
-import org.apache.archiva.repository.storage.FilesystemAsset;
 import org.apache.archiva.repository.storage.FilesystemStorage;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.archiva.metadata.audit.AuditListener;
@@ -104,7 +102,6 @@
 import javax.inject.Named;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -671,6 +668,10 @@
                     {
                         log.warn( "Artifact path '{}' is invalid.", resourcePath );
                     }
+                    catch ( org.apache.archiva.repository.ContentAccessException e )
+                    {
+                        e.printStackTrace( );
+                    }
                 }
 
                 /*
