diff --git a/modules/core/nuxeo-core-api/pom.xml b/modules/core/nuxeo-core-api/pom.xml
index b99e72b1c12..347476eb8ed 100644
--- a/modules/core/nuxeo-core-api/pom.xml
+++ b/modules/core/nuxeo-core-api/pom.xml
@@ -41,6 +41,10 @@
       <groupId>org.nuxeo.runtime</groupId>
       <artifactId>nuxeo-runtime</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.nuxeo.runtime</groupId>
+      <artifactId>nuxeo-runtime-cluster</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.nuxeo.runtime</groupId>
       <artifactId>nuxeo-runtime-jtajca</artifactId>
diff --git a/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/CachingBinaryManager.java b/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/CachingBinaryManager.java
index 7799a725aa8..3435f531456 100644
--- a/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/CachingBinaryManager.java
+++ b/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/CachingBinaryManager.java
@@ -34,6 +34,7 @@ import org.nuxeo.common.file.LRUFileCache;
 import org.nuxeo.common.utils.SizeUtils;
 import org.nuxeo.ecm.core.api.NuxeoException;
 import org.nuxeo.runtime.api.Framework;
+import org.nuxeo.runtime.cluster.ClusterService;
 import org.nuxeo.runtime.trackers.files.FileEventTracker;
 
 /**
@@ -144,10 +145,20 @@ public abstract class CachingBinaryManager extends AbstractBinaryManager {
 
         File cachedFile = fileCache.getFile(digest);
         if (cachedFile != null) {
+            log.warn("File is in the cache -> " + cachedFile.getAbsolutePath());
             // file already in cache
             if (Framework.isTestModeSet()) {
                 Framework.getProperties().setProperty("cachedBinary", digest);
             }
+            if (fileStorage.exist(digest)) {
+                log.warn(String.format("File %s exists in remote storage => nothing to do", digest));
+            } else if (!((ClusterService)Framework.getService(ClusterService.class)).isEnabled()) {
+                log.warn("Cluster is disabled => nothing to do");
+            } else {
+                // cacheFile has been removed from transient store => must be re-uploaded for cluster
+                log.warn(String.format("Adding cached file %s to remote storage", digest)); 
+                fileStorage.storeFile(digest, cachedFile);
+            }
             // delete tmp file, not needed anymore
             tmp.delete();
         } else {
@@ -172,9 +183,11 @@ public abstract class CachingBinaryManager extends AbstractBinaryManager {
      * Used by {@link LazyBinary}.
      */
     public File getFile(String digest) throws IOException {
+        log.warn(String.format("Getting file %s", digest));
         // get file from cache
         File file = fileCache.getFile(digest);
         if (file != null) {
+            log.warn(String.format("=> File %s retrieved from cache : %s", digest, file.getAbsolutePath()));
             return file;
         }
         // fetch file from storage
@@ -182,10 +195,12 @@ public abstract class CachingBinaryManager extends AbstractBinaryManager {
         if (fileStorage.fetchFile(digest, tmp)) {
             // put file in cache
             file = fileCache.putFile(digest, tmp);
+            log.warn(String.format("=> File %s retrieved from fileStorage %s : %s", digest, fileStorage.getClass().getName(), file.getAbsolutePath()));
             return file;
         } else {
             // file not in storage
             tmp.delete();
+            log.warn(String.format("=> File %s not in storage", digest));
             return null;
         }
     }
diff --git a/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/FileStorage.java b/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/FileStorage.java
index 66a23d7d4d6..19d143dda0f 100644
--- a/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/FileStorage.java
+++ b/modules/core/nuxeo-core-api/src/main/java/org/nuxeo/ecm/core/blob/binary/FileStorage.java
@@ -46,5 +46,9 @@ public interface FileStorage {
      * @throws IOException if a storage error occurred
      */
     boolean fetchFile(String key, File file) throws IOException;
+    
+    default boolean exist(String key) throws IOException {
+        return true;
+    }
 
 }
diff --git a/modules/core/nuxeo-core-binarymanager-cloud/nuxeo-core-binarymanager-gcp/src/main/java/org/nuxeo/ecm/core/storage/gcp/GoogleStorageBinaryManager.java b/modules/core/nuxeo-core-binarymanager-cloud/nuxeo-core-binarymanager-gcp/src/main/java/org/nuxeo/ecm/core/storage/gcp/GoogleStorageBinaryManager.java
index c36f733f745..f01e931d6bd 100644
--- a/modules/core/nuxeo-core-binarymanager-cloud/nuxeo-core-binarymanager-gcp/src/main/java/org/nuxeo/ecm/core/storage/gcp/GoogleStorageBinaryManager.java
+++ b/modules/core/nuxeo-core-binarymanager-cloud/nuxeo-core-binarymanager-gcp/src/main/java/org/nuxeo/ecm/core/storage/gcp/GoogleStorageBinaryManager.java
@@ -227,6 +227,11 @@ public class GoogleStorageBinaryManager extends AbstractCloudBinaryManager {
             }
             return false;
         }
+        
+        @Override
+        public boolean exist(String key) {
+            return bucket.get(bucketPrefix + key) != null;
+        }
     }
 
     @Override
