diff --git a/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java b/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
index e29948ebe5..18875e40d0 100644
--- a/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
+++ b/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
@@ -109,6 +109,7 @@ public class FileBlobStore extends AbstractBlobStore {
     protected synchronized void storeBlock(byte[] digest, int level, byte[] data) throws IOException {
         File f = getFile(digest, false);
         if (f.exists()) {
+            FileUtils.touch(f);
             return;
         }
         File parent = f.getParentFile();
diff --git a/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java b/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
index 508772aa79..2267f22665 100644
--- a/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
+++ b/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
@@ -33,6 +33,7 @@ public class MemoryBlobStore extends AbstractBlobStore {
 
     private HashMap<BlockId, byte[]> map = new HashMap<BlockId, byte[]>();
     private HashMap<BlockId, byte[]> old = new HashMap<BlockId, byte[]>();
+    private HashMap<BlockId, Long> timestamps = new HashMap<BlockId, Long>();
     private boolean mark;
 
     @Override
@@ -46,7 +47,9 @@ public class MemoryBlobStore extends AbstractBlobStore {
 
     @Override
     protected synchronized void storeBlock(byte[] digest, int level, byte[] data) {
-        map.put(new BlockId(digest, 0), data);
+        BlockId id =  new BlockId(digest, 0);
+        map.put(id, data);
+        timestamps.put(id, System.currentTimeMillis());
     }
 
     @Override
@@ -90,8 +93,11 @@ public class MemoryBlobStore extends AbstractBlobStore {
         for (String chunkId : chunkIds) {
             BlockId id = new BlockId(StringUtils.convertHexToBytes(chunkId), 0);
             if (map.containsKey(id)) {
-                map.remove(id);
-                count++;
+                if (maxLastModifiedTime == 0 || (maxLastModifiedTime > 0 && maxLastModifiedTime > timestamps.get(id))) {
+                    map.remove(id);
+                    timestamps.remove(id);
+                    count++;
+                }
             } else if (old.containsKey(id)) {
                 old.remove(id);
                 count++;
diff --git a/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java b/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
index 48d60ae0f1..92c598c877 100644
--- a/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
+++ b/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
@@ -445,6 +445,28 @@ public abstract class AbstractBlobStoreTest {
         assertEquals(ids.size(), count);
     }
 
+    @Test
+    public void deleteUpdatedBlob() throws Exception {
+        String id = store.writeBlob(randomStream(0, getArtifactSize()));
+        Thread.sleep(100);
+
+        long beforeUpdateTime = System.currentTimeMillis();
+
+        Thread.sleep(200);
+
+        // Should update the timestamp
+        String id2 = store.writeBlob(randomStream(0, getArtifactSize()));
+        assertEquals(id, id2);
+
+        Set<String> chunks = Sets.newHashSet();
+        Iterator<String> iter = store.resolveChunks(id.toString());
+        while (iter.hasNext()) {
+            chunks.add(iter.next());
+        }
+        long count = store.countDeleteChunks(Lists.newArrayList(chunks), beforeUpdateTime);
+        assertEquals("Deleted updated blobs", 0, count);
+    }
+
     @Test
     public void uploadCallback() throws Exception {
         assumeTrue(supportsStatsCollection());
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
index c0cc85419a..a86844535a 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
@@ -22,6 +22,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import com.mongodb.client.model.FindOneAndUpdateOptions;
 import org.apache.jackrabbit.oak.commons.StringUtils;
 import org.apache.jackrabbit.oak.plugins.blob.CachingBlobStore;
 import org.bson.Document;
@@ -32,7 +33,6 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.AbstractIterator;
 import com.mongodb.BasicDBObject;
-import com.mongodb.DuplicateKeyException;
 import com.mongodb.MongoClient;
 import com.mongodb.MongoException;
 import com.mongodb.client.MongoCollection;
@@ -60,8 +60,6 @@ public class MongoBlobStore extends CachingBlobStore {
 
     private static final Logger LOG = LoggerFactory.getLogger(MongoBlobStore.class);
 
-    private static final int DUPLICATE_KEY_ERROR_CODE = 11000;
-
     private static final CodecRegistry CODEC_REGISTRY = fromRegistries(
             MongoClient.getDefaultCodecRegistry(),
             fromCodecs(new MongoBlobCodec())
@@ -92,24 +90,31 @@ public class MongoBlobStore extends CachingBlobStore {
     protected void storeBlock(byte[] digest, int level, byte[] data) throws IOException {
         String id = StringUtils.convertBytesToHex(digest);
         cache.put(id, data);
+
         // Check if it already exists?
-        MongoBlob mongoBlob = new MongoBlob();
-        mongoBlob.setId(id);
-        mongoBlob.setData(data);
-        mongoBlob.setLevel(level);
-        mongoBlob.setLastMod(System.currentTimeMillis());
+        Document mongoBlob = new Document();
+        mongoBlob.append(MongoBlob.KEY_ID, id);
+        mongoBlob.append(MongoBlob.KEY_DATA, data);
+        mongoBlob.append(MongoBlob.KEY_LEVEL, level);
+
+        Document updateBlob =new Document(MongoBlob.KEY_LAST_MOD, System.currentTimeMillis());
+
+        Document upsert = new Document();
+        upsert.append("$setOnInsert", mongoBlob)
+                .append("$set", updateBlob);
+
         // TODO check the return value
         // TODO verify insert is fast if the entry already exists
         try {
-            getBlobCollection().insertOne(mongoBlob);
-        } catch (DuplicateKeyException e) {
-            // the same block was already stored before: ignore
-        } catch (MongoException e) {
-            if (e.getCode() == DUPLICATE_KEY_ERROR_CODE) {
-                // the same block was already stored before: ignore
-            } else {
-                throw new IOException(e.getMessage(), e);
+            Bson query = getBlobQuery(id, -1);
+            //Bson query = Filters.eq(MongoBlob.KEY_ID, id);
+            FindOneAndUpdateOptions options = new FindOneAndUpdateOptions().projection(new BasicDBObject(MongoBlob.KEY_ID, 1)).upsert(true);
+            MongoBlob oldBlob = getBlobCollection().findOneAndUpdate(query, upsert, options);
+            if (oldBlob != null) {
+                LOG.debug("Block with id [{}] id updated", id);
             }
+        } catch (MongoException e) {
+            throw new IOException(e.getMessage(), e);
         }
     }
 
