diff --git oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
index a7dc0f9..0351c70 100644
--- oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
+++ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
@@ -297,7 +297,7 @@ public class IndexCopier implements CopyOnReadStatsMBean, Closeable {
      * Directory implementation which lazily copies the index files from a
      * remote directory in background.
      */
-    private class CopyOnReadDirectory extends FilterDirectory {
+    class CopyOnReadDirectory extends FilterDirectory {
         private final Directory remote;
         private final Directory local;
         private final String indexPath;
@@ -384,6 +384,10 @@ public class IndexCopier implements CopyOnReadStatsMBean, Closeable {
             return remote.openInput(name, context);
         }
 
+        Directory getLocal() {
+            return local;
+        }
+
         private void copy(final CORFileReference reference) {
             updateMaxScheduled(scheduledForCopyCount.incrementAndGet());
             executor.execute(new Runnable() {
diff --git oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
index 5e5cb04..9e97a6e 100644
--- oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
+++ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
@@ -125,7 +125,7 @@ public class LuceneIndexEditorContext {
 
     private static final Parser defaultParser = createDefaultParser();
 
-    private final IndexDefinition definition;
+    private IndexDefinition definition;
 
     private final NodeBuilder definitionBuilder;
 
@@ -149,6 +149,8 @@ public class LuceneIndexEditorContext {
     private final ExtractedTextCache extractedTextCache;
 
     private final IndexAugmentorFactory augmentorFactory;
+
+    private final NodeState root;
     /**
      * The media types supported by the parser used.
      */
@@ -157,6 +159,7 @@ public class LuceneIndexEditorContext {
     LuceneIndexEditorContext(NodeState root, NodeBuilder definition, IndexUpdateCallback updateCallback,
                              @Nullable IndexCopier indexCopier, ExtractedTextCache extractedTextCache,
                              IndexAugmentorFactory augmentorFactory) {
+        this.root = root;
         this.definitionBuilder = definition;
         this.indexCopier = indexCopier;
         this.definition = new IndexDefinition(root, definition);
@@ -309,6 +312,9 @@ public class LuceneIndexEditorContext {
         reindex = true;
         IndexFormatVersion version = IndexDefinition.determineVersionForFreshIndex(definitionBuilder);
         definitionBuilder.setProperty(IndexDefinition.INDEX_VERSION, version.getVersion());
+
+        //Refresh the index definition based on update builder state
+        definition = new IndexDefinition(root, definitionBuilder);
     }
 
     public long incIndexedNodes() {
diff --git oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
index e5e8aeb..bf6a758 100644
--- oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
+++ oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
@@ -68,6 +68,9 @@ import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
 import org.apache.jackrabbit.util.ISO8601;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.store.FilterDirectory;
 import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
@@ -106,6 +109,8 @@ import static org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProp
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -121,6 +126,9 @@ public class LucenePropertyIndexTest extends AbstractQueryTest {
     @Rule
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
+    private String corDir = null;
+    private String cowDir = null;
+
     private LuceneIndexEditorProvider editorProvider;
 
     @Override
@@ -130,8 +138,9 @@ public class LucenePropertyIndexTest extends AbstractQueryTest {
 
     @Override
     protected ContentRepository createRepository() {
-        editorProvider = new LuceneIndexEditorProvider(createIndexCopier(), new ExtractedTextCache(10* FileUtils.ONE_MB, 100));
-        LuceneIndexProvider provider = new LuceneIndexProvider();
+        IndexCopier copier = createIndexCopier();
+        editorProvider = new LuceneIndexEditorProvider(copier, new ExtractedTextCache(10* FileUtils.ONE_MB, 100));
+        LuceneIndexProvider provider = new LuceneIndexProvider(copier);
         return new Oak()
                 .with(new InitialContent())
                 .with(new OpenSecurityProvider())
@@ -145,7 +154,44 @@ public class LucenePropertyIndexTest extends AbstractQueryTest {
 
     private IndexCopier createIndexCopier() {
         try {
-            return new IndexCopier(executorService, temporaryFolder.getRoot());
+            return new IndexCopier(executorService, temporaryFolder.getRoot()) {
+                @Override
+                public Directory wrapForRead(String indexPath, IndexDefinition definition,
+                                             Directory remote) throws IOException {
+                    Directory ret = super.wrapForRead(indexPath, definition, remote);
+                    corDir = getFSDirPath(ret);
+                    return ret;
+                }
+
+                @Override
+                public Directory wrapForWrite(IndexDefinition definition,
+                                              Directory remote, boolean reindexMode) throws IOException {
+                    Directory ret = super.wrapForWrite(definition, remote, reindexMode);
+                    cowDir = getFSDirPath(ret);
+                    return ret;
+                }
+
+                private String getFSDirPath(Directory dir){
+                    if (dir instanceof IndexCopier.CopyOnReadDirectory){
+                        dir = ((CopyOnReadDirectory) dir).getLocal();
+                    }
+
+                    dir = unwrap(dir);
+
+                    if (dir instanceof FSDirectory){
+                        return ((FSDirectory) dir).getDirectory().getAbsolutePath();
+                    }
+                    return null;
+                }
+
+                private Directory unwrap(Directory dir){
+                    if (dir instanceof FilterDirectory){
+                        return unwrap(((FilterDirectory) dir).getDelegate());
+                    }
+                    return dir;
+                }
+
+            };
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
@@ -1917,6 +1963,58 @@ public class LucenePropertyIndexTest extends AbstractQueryTest {
         assertQuery(propabQuery, asList("/test/a"));
     }
 
+    //OAK-4024
+    @Test
+    public void reindexWithCOWWithIndexPath() throws Exception {
+        Tree idx = createIndex("test1", of("propa", "propb"));
+        idx.setProperty(LuceneIndexConstants.INDEX_PATH, "/oak:index/test1");
+        Tree props = TestUtil.newRulePropTree(idx, "mix:title");
+        Tree prop1 = props.addChild(TestUtil.unique("prop"));
+        prop1.setProperty(LuceneIndexConstants.PROP_NAME, "jcr:title");
+        prop1.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
+        root.commit();
+
+        //force CoR
+        executeQuery("SELECT * FROM [mix:title]", SQL2);
+
+        assertNotNull(corDir);
+        String localPathBeforeReindex = corDir;
+
+        //CoW with re-indexing
+        idx.setProperty("reindex", true);
+        root.commit();
+
+        assertNotNull(cowDir);
+        String localPathAfterReindex = cowDir;
+
+        assertNotEquals("CoW should write to different dir on reindexing", localPathBeforeReindex, localPathAfterReindex);
+    }
+
+    @Test
+    public void reindexWithCOWWithoutIndexPath() throws Exception {
+        Tree idx = createIndex("test1", of("propa", "propb"));
+        Tree props = TestUtil.newRulePropTree(idx, "mix:title");
+        Tree prop1 = props.addChild(TestUtil.unique("prop"));
+        prop1.setProperty(LuceneIndexConstants.PROP_NAME, "jcr:title");
+        prop1.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
+        root.commit();
+
+        //force CoR
+        executeQuery("SELECT * FROM [mix:title]", SQL2);
+
+        assertNotNull(corDir);
+        String localPathBeforeReindex = corDir;
+
+        //CoW with re-indexing
+        idx.setProperty("reindex", true);
+        root.commit();
+
+        assertNotNull(cowDir);
+        String localPathAfterReindex = cowDir;
+
+        assertNotEquals("CoW should write to different dir on reindexing", localPathBeforeReindex, localPathAfterReindex);
+    }
+
     @Test
     public void fulltextQueryWithSpecialChars() throws Exception{
         Tree idx = createIndex("test1", of("propa", "propb"));
