diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
index 36b242a..cc5ea66 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
@@ -280,7 +280,17 @@ public final class DocumentNodeStore
             if (blob instanceof BlobStoreBlob) {
                 return ((BlobStoreBlob) blob).getBlobId();
             }
+
             String id;
+
+            String reference = blob.getReference();
+            if(reference != null){
+                id = blobStore.getBlobId(reference);
+                if(id != null){
+                    return id;
+                }
+            }
+
             try {
                 id = createBlob(blob.getNewStream()).getBlobId();
             } catch (IOException e) {
diff --git oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java
index b81b446..0c554a7 100644
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java
@@ -18,9 +18,17 @@ package org.apache.jackrabbit.oak.plugins.document;
 
 import static org.junit.Assert.assertEquals;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Random;
 
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.kernel.BlobSerializer;
+import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
+import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob;
+import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -71,8 +79,58 @@ public class BlobTest {
         mk.dispose();
     }
 
+    @Test
+    public void testBlobSerialization() throws Exception{
+        TestBlobStore blobStore = new TestBlobStore();
+        DocumentMK mk = new DocumentMK.Builder().setBlobStore(blobStore).open();
+        BlobSerializer blobSerializer = mk.getNodeStore().getBlobSerializer();
+
+        Blob blob = new BlobStoreBlob(blobStore, "foo");
+        assertEquals("foo", blobSerializer.serialize(blob));
+        assertEquals(0, blobStore.writeCount);
+
+        blob = new ArrayBasedBlob("foo".getBytes());
+        blobSerializer.serialize(blob);
+        assertEquals(1, blobStore.writeCount);
+
+        byte[] bytes = "foo".getBytes();
+        String blobId = blobStore.writeBlob(new ByteArrayInputStream(bytes));
+        String reference = blobStore.getReference(blobId);
+        blob = new ReferecnedBlob("foo".getBytes(), reference);
+
+        blobStore.writeCount = 0;
+        blobSerializer.serialize(blob);
+
+        //Using reference so no reference should be written
+        assertEquals(0, blobStore.writeCount);
+    }
+
     private static void log(String s) {
         LOG.info(s);
     }
 
+
+    private static class TestBlobStore extends MemoryBlobStore {
+        int writeCount;
+
+        @Override
+        public String writeBlob(InputStream in) throws IOException {
+            writeCount++;
+            return super.writeBlob(in);
+        }
+    }
+
+    private static class ReferecnedBlob extends ArrayBasedBlob {
+        private final String reference;
+
+        public ReferecnedBlob(byte[] value, String reference) {
+            super(value);
+            this.reference = reference;
+        }
+
+        @Override
+        public String getReference() {
+            return reference;
+        }
+    }
 }
