diff --git a/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java b/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java
index 128572c2280597bcb86f5d286b65e77a580aeffb..5b75ad22618d0e6f2082ac6e237ebd0ca1452879 100644
--- a/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java
+++ b/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java
@@ -68,7 +68,12 @@ public abstract class NoSqlResourceClientService<T extends NoSqlResource> extend
 
   protected void downloadWithToken(String urlString, Path path) {
     final String url = this.getBaseUrl() + urlString;
-    this.restClientTool.downloadContent(URI.create(url), path, TokenUsage.WITH_TOKEN);
+    this.restClientTool.downloadContent(URI.create(url), path, TokenUsage.WITH_TOKEN, false);
+  }
+
+  protected void downloadContentToDirectory(String urlString, Path path) {
+    final String url = this.getBaseUrl() + urlString;
+    this.restClientTool.downloadContent(URI.create(url), path, TokenUsage.WITH_TOKEN, true);
   }
 
   protected String getResources(String url, Map<String, String> params) {
diff --git a/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java b/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java
index 97d3142afea23191b40e9ac8cbe4329e7d6c86a5..850382c361c1446fc4f5d774fa7927df27724c52 100644
--- a/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java
+++ b/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.text.ParseException;
 import java.util.Arrays;
@@ -73,7 +74,16 @@ public abstract class AbstractRestClientTool {
   }
 
   public void downloadContent(URI uri, Path path, TokenUsage tokenUsage) {
-    final ResponseExtractor<Void> responseExtractor = this.buildExtractor(uri, path);
+    this.downloadContent(uri, path, tokenUsage, false);
+  }
+
+  public void downloadContent(URI uri, Path path, TokenUsage tokenUsage, boolean downloadToDirectory) {
+    ResponseExtractor<Void> responseExtractor;
+    if (downloadToDirectory) {
+      responseExtractor = this.buildExtractorToDirectory(uri, path);
+    } else {
+      responseExtractor = this.buildExtractor(uri, path);
+    }
     final RequestCallback requestCallback = request -> request.getHeaders()
             .setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));
     final RestTemplate restTemplate;
@@ -87,18 +97,46 @@ public abstract class AbstractRestClientTool {
     restTemplate.execute(uri, HttpMethod.GET, requestCallback, responseExtractor);
   }
 
-  private ResponseExtractor<Void> buildExtractor(URI uri, Path path) {
+  private ResponseExtractor<Void> buildExtractor(URI uri, Path filePath) {
+    return response -> {
+      final byte[] data = new byte[SolidifyConstants.BUFFER_SIZE];
+      try (final InputStream inputStream = response.getBody();
+              final FileOutputStream fileOutputStream = new FileOutputStream(filePath.toFile());
+              final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, SolidifyConstants.BUFFER_SIZE)) {
+        int nRead;
+        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
+          bufferedOutputStream.write(data, 0, nRead);
+        }
+      } catch (final IOException e) {
+        throw new SolidifyRuntimeException("Error downloading " + uri.toString() + " to " + filePath.toString(), e);
+      }
+      return null;
+    };
+  }
+
+
+  private ResponseExtractor<Void> buildExtractorToDirectory(URI uri, Path directoryPath) {
     return response -> {
       final byte[] data = new byte[SolidifyConstants.BUFFER_SIZE];
+      String disposition = response.getHeaders().getFirst("Content-Disposition");
+      // Check if the provided path is a directory or a filename
+      Path fullPath;
+      if (!StringTool.isNullOrEmpty(disposition) && Files.isDirectory(directoryPath)) {
+        String filename = disposition.replaceFirst("(?i)^.*filename=\"([^\"]*)\".*$", "$1");
+        fullPath = directoryPath.resolve(filename);
+      } else {
+        fullPath = directoryPath;
+      }
+
       try (final InputStream inputStream = response.getBody();
-           final FileOutputStream fileOutputStream = new FileOutputStream(path.toFile());
-           final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, SolidifyConstants.BUFFER_SIZE)) {
+              final FileOutputStream fileOutputStream = new FileOutputStream(fullPath.toFile());
+              final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, SolidifyConstants.BUFFER_SIZE)) {
         int nRead;
         while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
           bufferedOutputStream.write(data, 0, nRead);
         }
       } catch (final IOException e) {
-        throw new SolidifyRuntimeException("Error downloading " + uri.toString() + " to " + path.toString(), e);
+        throw new SolidifyRuntimeException("Error downloading " + uri.toString() + " to " + fullPath.toString(), e);
       }
       return null;
     };