diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
index 0499901..f210e29 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
@@ -31,6 +31,7 @@ import static org.apache.jackrabbit.oak.plugins.index.property.PropertyIndex.enc
 
 import java.util.Collections;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import javax.annotation.Nonnull;
 import javax.jcr.PropertyType;
@@ -288,7 +289,7 @@ class PropertyIndexEditor implements IndexEditor {
                 String properties = definition.getString(PROPERTY_NAMES);
                 boolean uniqueIndex = keysToCheckForUniqueness != null;
                 for (IndexStoreStrategy strategy : getStrategies(uniqueIndex)) {
-                    NodeBuilder index = definition.child(strategy
+                    Supplier<NodeBuilder> index = () -> definition.child(strategy
                             .getIndexNodeName());
                     if (uniqueIndex) {
                         keysToCheckForUniqueness.addAll(getExistingKeys(
@@ -334,7 +335,7 @@ class PropertyIndexEditor implements IndexEditor {
      * @param s the index store strategy
      * @return the set of keys that already exist in this unique index
      */
-    private Set<String> getExistingKeys(Set<String> keys, NodeBuilder index, IndexStoreStrategy s) {
+    private Set<String> getExistingKeys(Set<String> keys, Supplier<NodeBuilder> index, IndexStoreStrategy s) {
         Set<String> existing = null;
         for (String key : keys) {
             if (s.exists(index, key)) {
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
index ccb5f44..fbd1821 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
@@ -24,6 +24,7 @@ import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.KEY_COUNT_P
 import java.util.Deque;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -92,15 +93,15 @@ public class ContentMirrorStoreStrategy implements IndexStoreStrategy {
 
     @Override
     public void update(
-            NodeBuilder index, String path,
+            Supplier<NodeBuilder> index, String path,
             @Nullable final String indexName,
             @Nullable final NodeBuilder indexMeta,
             Set<String> beforeKeys, Set<String> afterKeys) {
         for (String key : beforeKeys) {
-            remove(index, key, path);
+            remove(index.get(), key, path);
         }
         for (String key : afterKeys) {
-            insert(index, key, path);
+            insert(index.get(), key, path);
         }
     }
 
@@ -592,7 +593,7 @@ public class ContentMirrorStoreStrategy implements IndexStoreStrategy {
     }
 
     @Override
-    public boolean exists(NodeBuilder index, String key) {
+    public boolean exists(Supplier<NodeBuilder> index, String key) {
         // This is currently not implemented, because there is no test case for it,
         // and because there is currently no need for this method with this class.
         // We would need to traverse the tree and search for an entry "match".
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java
index c59cd37..0e49026 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java
@@ -19,6 +19,7 @@
 package org.apache.jackrabbit.oak.plugins.index.property.strategy;
 
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.spi.query.Filter;
@@ -50,8 +51,8 @@ public class FilteringIndexStoreStrategy implements IndexStoreStrategy {
     }
 
     @Override
-    public void update(NodeBuilder index, String path, String indexName,
-            NodeBuilder indexMeta, Set<String> beforeKeys, Set<String> afterKeys)
+    public void update(Supplier<NodeBuilder> index, String path, String indexName,
+                       NodeBuilder indexMeta, Set<String> beforeKeys, Set<String> afterKeys)
             throws CommitFailedException {
         if (filter.apply(path)) {
             if (readOnly) {
@@ -66,7 +67,7 @@ public class FilteringIndexStoreStrategy implements IndexStoreStrategy {
     }
 
     @Override
-    public boolean exists(NodeBuilder index, String key) {
+    public boolean exists(Supplier<NodeBuilder> index, String key) {
         return strategy.exists(index, key);
     }
 
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java
index cf266a6..baf849f 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.index.property.strategy;
 
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.spi.query.Filter;
@@ -40,9 +41,9 @@ public interface IndexStoreStrategy {
      * @param afterKeys keys that now do apply to the path
      */
     void update(
-        NodeBuilder index, String path,
-        String indexName, NodeBuilder indexMeta,
-        Set<String> beforeKeys, Set<String> afterKeys) throws CommitFailedException;
+            Supplier<NodeBuilder> index, String path,
+            String indexName, NodeBuilder indexMeta,
+            Set<String> beforeKeys, Set<String> afterKeys) throws CommitFailedException;
 
     /**
      * Check whether an entry for the given key exists.
@@ -51,7 +52,7 @@ public interface IndexStoreStrategy {
      * @param key the key
      * @return true if at least one entry exists
      */
-    boolean exists(NodeBuilder index, String key);
+    boolean exists(Supplier<NodeBuilder> index, String key);
 
     /**
      * Search for a given set of values.
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java
index b74829d..9ca6f2b 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java
@@ -22,6 +22,7 @@ import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_CONTE
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import javax.annotation.Nullable;
 
@@ -59,15 +60,15 @@ public class UniqueEntryStoreStrategy implements IndexStoreStrategy {
 
     @Override
     public void update(
-            NodeBuilder index, String path,
+            Supplier<NodeBuilder> index, String path,
             @Nullable final String indexName,
             @Nullable final NodeBuilder indexMeta,
             Set<String> beforeKeys, Set<String> afterKeys) {
         for (String key : beforeKeys) {
-            remove(index, key, path);
+            remove(index.get(), key, path);
         }
         for (String key : afterKeys) {
-            insert(index, key, path);
+            insert(index.get(), key, path);
         }
     }
 
@@ -161,8 +162,8 @@ public class UniqueEntryStoreStrategy implements IndexStoreStrategy {
     }
 
     @Override
-    public boolean exists(NodeBuilder index, String key) {
-        return index.hasChildNode(key);
+    public boolean exists(Supplier<NodeBuilder> index, String key) {
+        return index.get().hasChildNode(key);
     }
 
     @Override
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java
index 34f4a90..28e795f 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java
@@ -36,6 +36,7 @@ import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import com.google.common.collect.Sets;
 
@@ -309,12 +310,12 @@ class ReferenceEditor extends DefaultEditor implements IndexEditor {
         for (IndexStoreStrategy store : refStores) {
             Set<String> empty = of();
             for (String p : rm) {
-                NodeBuilder index = definition.child(store.getIndexNodeName());
+                Supplier<NodeBuilder> index = () -> definition.child(store.getIndexNodeName());
                 store.update(index, p, name, definition, of(key), empty);
             }
             for (String p : add) {
                 // TODO do we still need to encode the values?
-                NodeBuilder index = definition.child(store.getIndexNodeName());
+                Supplier<NodeBuilder> index = () -> definition.child(store.getIndexNodeName());
                 store.update(index, p, name, definition, empty, of(key));
             }
         }
diff --git oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
index 1694f32..7b63f41 100644
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
@@ -962,7 +962,6 @@ public class PropertyIndexTest {
 
     }
 
-    @Ignore("OAK-6463")
     @Test
     public void mountWithCommitInWritableMount() throws Exception{
         NodeState root = INITIAL_CONTENT;
diff --git oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java
index 06d1301..b69585d 100644
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java
@@ -28,6 +28,7 @@ import static org.apache.jackrabbit.oak.plugins.index.counter.ApproximateCounter
 
 import java.util.Collections;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Type;
@@ -67,35 +68,36 @@ public class ContentMirrorStoreStrategyTest {
         IndexStoreStrategy store = new ContentMirrorStoreStrategy();
 
         NodeState root = EMPTY_NODE;
-        NodeBuilder index = root.builder();
+        NodeBuilder builder = root.builder();
+        Supplier<NodeBuilder> index = () -> builder;
 
         for (String path : asList("/", "a/b/c", "a/b/d", "b", "d/e", "d/e/f")) {
             store.update(index, path, null, null, EMPTY, KEY);
         }
-        checkPath(index, "key", "", true);
-        checkPath(index, "key", "a/b/c", true);
-        checkPath(index, "key", "a/b/d", true);
-        checkPath(index, "key", "b", true);
-        checkPath(index, "key", "d/e", true);
-        checkPath(index, "key", "d/e/f", true);
+        checkPath(builder, "key", "", true);
+        checkPath(builder, "key", "a/b/c", true);
+        checkPath(builder, "key", "a/b/d", true);
+        checkPath(builder, "key", "b", true);
+        checkPath(builder, "key", "d/e", true);
+        checkPath(builder, "key", "d/e/f", true);
 
         // remove the root key, removes just the "match" property, when the
         // index is not empty
         store.update(index, "/", null, null, KEY, EMPTY);
-        checkPath(index, "key", "d/e/f", true);
+        checkPath(builder, "key", "d/e/f", true);
 
         // removing intermediary path doesn't remove the entire subtree
         store.update(index, "d/e", null, null, KEY, EMPTY);
-        checkPath(index, "key", "d/e/f", true);
+        checkPath(builder, "key", "d/e/f", true);
 
         // removing intermediary path doesn't remove the entire subtree
         store.update(index, "d/e/f", null, null, KEY, EMPTY);
-        checkNotPath(index, "key", "d");
+        checkNotPath(builder, "key", "d");
 
         // brother segment removed
         store.update(index, "a/b/d", null, null, KEY, EMPTY);
         store.update(index, "a/b", null, null, KEY, EMPTY);
-        checkPath(index, "key", "a/b/c", true);
+        checkPath(builder, "key", "a/b/c", true);
 
         // reinsert root and remove everything else
         store.update(index, "", null, null, EMPTY, KEY);
@@ -105,7 +107,7 @@ public class ContentMirrorStoreStrategyTest {
 
         // remove the root key when the index is empty
         store.update(index, "", null, null, KEY, EMPTY);
-        Assert.assertEquals(0, index.getChildNodeCount(1));
+        Assert.assertEquals(0, builder.getChildNodeCount(1));
     }
 
     private static void checkPath(NodeBuilder node, String key, String path,
@@ -140,7 +142,7 @@ public class ContentMirrorStoreStrategyTest {
         IndexStoreStrategy store = new ContentMirrorStoreStrategy();
         NodeState root = EMPTY_NODE;
         NodeBuilder indexMeta = root.builder();
-        NodeBuilder index = indexMeta.child(INDEX_CONTENT_NODE_NAME);
+        Supplier<NodeBuilder> index = () -> indexMeta.child(INDEX_CONTENT_NODE_NAME);
         store.update(index, "a", null, null, EMPTY, KEY);
         store.update(index, "b", null, null, EMPTY, KEY);
         Assert.assertTrue(
diff --git oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java
index 6353e59..06e352a 100644
--- oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java
+++ oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java
@@ -796,7 +796,6 @@ public class CompositeNodeStoreTest {
         assertEquals("global", rootBuilder.getChildNode("new").getString("store"));
     }
 
-    @Ignore("OAK-6463")
     @Test
     public void propertyIndex() throws Exception{
         NodeBuilder globalBuilder = globalStore.getRoot().builder();
