diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java
index 7a28a9f816131dbe48bee482addd01fd0bafcc12..e8df52b28de83d713d15ce5efd6f10dae8f3eef4 100644
--- a/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java
+++ b/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java
@@ -67,6 +67,7 @@ import ch.unige.aou.exception.AouDownloadException;
 import ch.unige.aou.message.DocumentFileMessage;
 import ch.unige.aou.model.publication.DocumentFile;
 import ch.unige.aou.model.publication.DocumentFile.DocumentFileStatus;
+import ch.unige.aou.model.tool.CleanTool;
 
 @Service
 @ConditionalOnBean(AdminController.class)
@@ -373,6 +374,8 @@ public class DocumentFileProcessingService extends AouService {
     if (dotExtension != null) {
       fileName = name + dotExtension;
     }
+    //Replace blank spaces and + characters with underscore
+    fileName = CleanTool.cleanFileName(fileName);
 
     // Deduplicate filename with a suffix number if it is already used by another documentFile
     List<String> otherDocumentFilenames = documentFile.getPublication().getDocumentFiles().stream()
diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java
index 438f547283d9d3df058927c358e41abf3885ac37..c8e83b539749e1b5497c08159cdf7575fb320a94 100644
--- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java
+++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java
@@ -82,7 +82,7 @@ import ch.unige.aou.service.rest.JournalTitleRemoteService;
 public class ArxivImportService extends MetadataAndFileImportService {
   private static final Logger log = LoggerFactory.getLogger(ArxivImportService.class);
 
-  private static final String ARXIV_FILE_NAME = "-from-arxiv.pdf";
+  private static final String ARXIV_FILE_NAME = "_from_arxiv.pdf";
 
   private static final String XPATH_ARXIV = "/default:feed/default:entry";
   private static final String XPATH_ERROR_VALUE = "Error";
@@ -126,7 +126,7 @@ public class ArxivImportService extends MetadataAndFileImportService {
     documentFile.setDocumentFileType(documentFileType);
     documentFile.setMimetype(mimeType);
     documentFile.setIsImported(true);
-    documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + ARXIV_FILE_NAME);
+    documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + ARXIV_FILE_NAME));
 
     try {
       documentFile.setSourceData(new URI(filePath));
diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java
index 797c88785cd8d400e1343515ae006bac6b08247e..033aea51e68b08b9c5f8f6650ddf8b55e71b4781 100644
--- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java
+++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java
@@ -93,7 +93,7 @@ import ch.unige.aou.service.rest.OpenAireService;
 @ConditionalOnBean(AdminController.class)
 public class DoiCrossrefImportService extends MetadataAndFileImportService {
 
-  private static final String CROSSREF_FILE_NAME = "-from-crossref.pdf";
+  private static final String CROSSREF_FILE_NAME = "_from_crossref.pdf";
 
   private static final Logger log = LoggerFactory.getLogger(DoiCrossrefImportService.class);
 
@@ -175,7 +175,7 @@ public class DoiCrossrefImportService extends MetadataAndFileImportService {
       documentFile.setMimetype(mimeType);
       documentFile.setIsImported(true);
       documentFile.setLicense(license);
-      documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + CROSSREF_FILE_NAME);
+      documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + CROSSREF_FILE_NAME));
 
       try {
         documentFile.setSourceData(new URI(fileUrl));
diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java
index 09fd90bdeb244662b2d970f567b3b30c17c471ad..30f6f534223a982eb4384e9f440561e31a8eb880 100644
--- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java
+++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java
@@ -74,6 +74,7 @@ import ch.unige.aou.model.publication.DocumentFile;
 import ch.unige.aou.model.publication.DocumentFileType;
 import ch.unige.aou.model.publication.Publication;
 import ch.unige.aou.model.settings.License;
+import ch.unige.aou.model.tool.CleanTool;
 import ch.unige.aou.model.xml.deposit.v2_4.Contributor;
 import ch.unige.aou.model.xml.deposit.v2_4.DepositDoc;
 import ch.unige.aou.model.xml.deposit.v2_4.Funding;
@@ -88,7 +89,7 @@ public class EuropePmcImportService extends MetadataAndFileImportService {
 
   private static final Logger log = LoggerFactory.getLogger(EuropePmcImportService.class);
 
-  private static final String EUROPE_PMC_FILE_NAME = "-from-europePmc.pdf";
+  private static final String EUROPE_PMC_FILE_NAME = "_from_europePmc.pdf";
 
   private static final String XPATH_DEFAULT_ROOT = "/responseWrapper/resultList/result[pmcid='VALUE']";
   private static final String XPATH_HAS_SUPPLEMENTARY_FILES = EuropePmcImportService.XPATH_DEFAULT_ROOT + "/hasSuppl";
@@ -247,7 +248,7 @@ public class EuropePmcImportService extends MetadataAndFileImportService {
       documentFile.setAccessLevel(DocumentFile.AccessLevel.PUBLIC);
       documentFile.setDocumentFileType(documentFileType);
       documentFile.setMimetype("application/pdf");
-      documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + EUROPE_PMC_FILE_NAME);
+      documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + EUROPE_PMC_FILE_NAME));
       documentFile.setLicense(license);
       documentFile.setIsImported(true);
       try {
diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java
index 0c75c1d7b5c5c0cc46bfc30143de0b61c7d8e710..821eb6bd8eed1e2b8359193a7f1033c5917e8b30 100644
--- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java
+++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java
@@ -77,7 +77,7 @@ import ch.unige.aou.service.rest.JournalTitleRemoteService;
 @Service
 @ConditionalOnBean(AdminController.class)
 public class InspireHepImportService extends MetadataAndFileImportService {
-  private static final String INSPIRE_HEP_FILE_NAME = "-from-inspireHep.pdf";
+  private static final String INSPIRE_HEP_FILE_NAME = "_from_inspireHep.pdf";
 
   private static final Logger log = LoggerFactory.getLogger(InspireHepImportService.class);
   private String apiArxivUrl;
@@ -429,7 +429,7 @@ public class InspireHepImportService extends MetadataAndFileImportService {
           documentFile.setMimetype(file.getMimetype());
           documentFile.setIsImported(true);
           documentFile.setLicense(license);
-          documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + INSPIRE_HEP_FILE_NAME);
+          documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + INSPIRE_HEP_FILE_NAME));
 
           try {
             documentFile.setSourceData(new URI(fileUrl));
diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java
index 2c92a84260498ecf807ba2f84776b669dba6b3b1..adcea23cdb9783d9a24b128a87a0765ca2509b9f 100644
--- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java
+++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java
@@ -52,6 +52,7 @@ import ch.unige.aou.model.publication.DocumentFile;
 import ch.unige.aou.model.publication.DocumentFileType;
 import ch.unige.aou.model.publication.Publication;
 import ch.unige.aou.model.settings.License;
+import ch.unige.aou.model.tool.CleanTool;
 import ch.unige.aou.model.xml.deposit.v2_4.DepositDoc;
 import ch.unige.aou.service.DownloadService;
 import ch.unige.aou.service.MetadataService;
@@ -66,7 +67,7 @@ public class UnpaywallImportService extends MetadataAndFileImportService {
   private String unpaywallApiUrl;
   private String unpaywallEmail;
 
-  private static final String UNPAYWALL_FILE_NAME = "-from-unpaywall.pdf";
+  private static final String UNPAYWALL_FILE_NAME = "_from_sunpaywall.pdf";
   private static final String LICENSE_OTHER_AO = "OTHER-OA";
   private static final String LICENSE = "license";
 
@@ -167,7 +168,7 @@ public class UnpaywallImportService extends MetadataAndFileImportService {
               documentFile.setAccessLevel(accessLevel);
               documentFile.setDocumentFileType(this.getDocumentFileTypeFromUnpaywallVersion(version));
               documentFile.setMimetype("application/pdf");
-              documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + UNPAYWALL_FILE_NAME);
+              documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + UNPAYWALL_FILE_NAME));
               documentFile.setIsImported(true);
               this.saveDocumentFileIfSourceDataValid(documentFile);
             } catch (URISyntaxException e) {
diff --git a/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java b/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java
index b0880ebcab432e60759e0c2b5ad9f2601f46e25b..704df56411cc00bfe4b3415048072051ed5b6a39 100644
--- a/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java
+++ b/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java
@@ -108,6 +108,14 @@ public class CleanTool {
     return value;
   }
 
+  public static String cleanFileName(String value) {
+    if (!StringTool.isNullOrEmpty(value)) {
+      value = value.replaceAll("\\s+", "_");
+      value = value.replaceAll("\\+", "_");
+    }
+    return value;
+  }
+
   public static String restoreAllowedHtmlTags(String value, List<String> allowedTags) {
     if (!StringTool.isNullOrEmpty(value)) {
       for (String tag : allowedTags) {
diff --git a/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java b/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java
index 3aa2b96326eb293709b5f748f403d46fb8e14efc..aaf9dbdfb0cd50ed0f11a3dee92fff70e6e63696 100644
--- a/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java
+++ b/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java
@@ -366,4 +366,12 @@ class CleanToolTest {
     assertEquals("Let&quot;s go !", CleanTool.cleanQuotes("Let&nbsp;&raquo;s go !"));
     assertEquals("Let&quot;s go !", CleanTool.cleanQuotes("Let&laquo;&nbsp;s go !"));
   }
+
+  @Test
+  void cleanFileName() {
+    assertEquals("picture.jpeg", CleanTool.cleanFileName("picture.jpeg"));
+    assertEquals("picture_geneve.jpeg", CleanTool.cleanFileName("picture+geneve.jpeg"));
+    assertEquals("picture_geneve.jpeg", CleanTool.cleanFileName("picture_geneve.jpeg"));
+    assertEquals("picture_geneve.jpeg", CleanTool.cleanFileName("picture geneve.jpeg"));
+  }
 }