diff --git a/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java b/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java
index 4e98914e95b34d3c7bd050c3c35084ffbb692af6..ef9e6313cf24decdbc7d588a8faa0f9e17f01570 100644
--- a/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java
+++ b/DLCM-PreIngest/src/main/java/ch/dlcm/business/DepositService.java
@@ -303,11 +303,11 @@ public class DepositService extends CompositeResourceService<Deposit> {
     super.delete(depositId);
   }
 
-  public void checkArchiveIsEditable(String depositId) {
+  public void checkArchiveIsEditable(String depositId, Integer preferredStorage) {
     final String cannotEditMessage = this.messageService.get("preingest.deposit.error.cannot_edit_deposit", new Object[] { depositId });
     try {
       final String aipId = this.trustedArchiveMetadataRemoteService.getAipIdFromDepositId(depositId);
-      final ArchivalInfoPackage aip = this.aipService.findOne(aipId);
+      final ArchivalInfoPackage aip = this.aipService.findOne(aipId, preferredStorage);
       if (aip.getInfo().getStatus() != PackageStatus.COMPLETED) {
         throw new SolidifyUnmodifiableException(cannotEditMessage);
       }
diff --git a/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java b/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java
index 7c493836ced7cb30238de25b2e57dae69c45a4db..8ddf3e2848450132bcabd55d21f06fedecd58d99 100644
--- a/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java
+++ b/DLCM-PreIngest/src/main/java/ch/dlcm/controller/preingest/DepositController.java
@@ -797,8 +797,9 @@ public class DepositController extends AbstractPackageController<DepositDataFile
     final Result result = new Result(depositId);
     if (((DepositService) this.itemService).statusUpdateIsValid(deposit, newStatus)) {
       if (newStatus == EDITING_METADATA) {
+        Integer preferredStorage = deposit.getPreservationPolicy().getMainStorage();
         // Check if archive is completed
-        ((DepositService) this.itemService).checkArchiveIsEditable(depositId);
+        ((DepositService) this.itemService).checkArchiveIsEditable(depositId, preferredStorage);
         // If archive is in collections, put all its collection in edition
         ((DepositService) this.itemService).putInMetadataEditingCollections(depositId);
         // Purge SIP of the deposit
diff --git a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java
index f41aa255fd8ef63f501afdb3f95e22a03367658c..49f0bb76b97777b3ae2b21300dc12f138bb689f0 100644
--- a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java
+++ b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java
@@ -27,6 +27,7 @@ import java.net.URI;
 import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -242,7 +243,11 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes
 
   @Override
   public ArchivalInfoPackage findOne(String aipId) {
-    return this.getAIPOnStorage(aipId);
+    return this.findOne(aipId, null);
+  }
+
+  public ArchivalInfoPackage findOne(String aipId, Integer preferredStorage) {
+    return this.getAIPOnStorage(aipId, preferredStorage);
   }
 
   public ArchivalInfoPackage getAIPOnDefaultStorage(String aipId) {
@@ -250,12 +255,20 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes
   }
 
   public ArchivalInfoPackage getAIPOnStorage(String aipId) {
-    final String storage = this.findStorageForAIP(aipId);
+    return getAIPOnStorage(aipId, null);
+  }
+
+  public ArchivalInfoPackage getAIPOnStorage(String aipId, Integer preferredStorage) {
+    final String storage = this.findStorageForAIP(aipId, preferredStorage);
     return this.getAIP(storage, aipId);
   }
 
   public String findStorageForAIP(String aipId) {
-    for (String storage : this.archivalStorageList) {
+    return this.findStorageForAIP(aipId, null);
+  }
+
+  public String findStorageForAIP(String aipId, Integer preferredStorage) {
+    for (String storage : this.getArchivalStorageListByPreference(preferredStorage)) {
       if (this.isAipPresent(storage, aipId)) {
         return storage;
       }
@@ -263,6 +276,13 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes
     return this.getDefaultArchivalStorage();
   }
 
+  public String[] getArchivalStorageListByPreference(Integer preferredStorageIndex) {
+    List<String> list = new ArrayList<>(Arrays.asList(this.archivalStorageList));
+    String preferredStorage = list.remove(preferredStorageIndex.intValue());
+    list.add(0, preferredStorage);
+    return list.toArray(new String[0]);
+  }
+
   public ArchivalInfoPackage getAIP(String storageUrl, String aipId) {
     this.restClientService.checkResId(aipId);
     return this.restClientService.getResource(this.getArchivalStorageUrlWithId(storageUrl, aipId), ArchivalInfoPackage.class);
@@ -421,6 +441,10 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes
   }
 
   protected boolean isAipPresent(String storageUrl, String aipId) {
-    return HttpStatus.OK.equals(this.restClientService.headResource(this.getArchivalStorageUrlWithId(storageUrl, aipId)));
+    try {
+      return HttpStatus.OK.equals(this.restClientService.headResource(this.getArchivalStorageUrlWithId(storageUrl, aipId)));
+    } catch (Exception e) {
+      return false;
+    }
   }
 }