diff --git a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
index 0b45c3af12..27ae18cfcb 100644
--- a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
+++ b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
@@ -540,7 +540,35 @@ public final class IndexDefinitionBuilder {
                 Set<String> asyncBefore = getAsyncValuesWithoutNRT(before);
                 Set<String> asyncAfter = getAsyncValuesWithoutNRT(after);
                 return asyncBefore.equals(asyncAfter);
+            } else if (PathFilter.PROP_INCLUDED_PATHS.equals(before.getName())) {
+                Set<String> beforeRoots = Sets.newHashSet(before.getValue(STRINGS));
+                Set<String> afterRoots = Sets.newHashSet(after.getValue(STRINGS));
+
+                for (String afterRoot : afterRoots) {
+                    boolean needsReindex = true;
+                    for (String beforeRoot : beforeRoots) {
+                        if (PathUtils.isAncestor(beforeRoot, afterRoot) || beforeRoot.equals(afterRoot)) {
+                            needsReindex = false;
+                        }
+                    }
+
+                    // any path which requires reindex is case closed
+                    if (needsReindex) {
+                        return false;
+                    }
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean propertyAdded(PropertyState after) {
+            // adding included paths shouldn't require reindexing (it affects cost, etc btw)
+            if (PathFilter.PROP_INCLUDED_PATHS.equals(after.getName())) {
+                return true;
             }
+
             return false;
         }
 
diff --git a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilderTest.java b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilderTest.java
index a559d37ff1..300ddc70a6 100644
--- a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilderTest.java
+++ b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilderTest.java
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugins.index.lucene.util;
 
 import java.util.Iterator;
 
+import com.google.common.collect.ImmutableList;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -36,10 +37,13 @@ import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
 import org.junit.After;
 import org.junit.Test;
 
+import static com.google.common.collect.ImmutableList.of;
 import static java.util.Arrays.asList;
+import static org.apache.jackrabbit.oak.api.Type.STRINGS;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.AGGREGATES;
 import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static org.apache.jackrabbit.oak.spi.filter.PathFilter.PROP_INCLUDED_PATHS;
 import static org.junit.Assert.*;
 
 public class IndexDefinitionBuilderTest {
@@ -78,9 +82,9 @@ public class IndexDefinitionBuilderTest {
         NodeState state = builder.build();
         assertTrue(state.getChildNode("indexRules").exists());
         assertTrue(state.getChildNode("indexRules").getChildNode("nt:base").exists());
-        assertEquals(asList("/a", "/b"), state.getProperty(PathFilter.PROP_INCLUDED_PATHS).getValue(Type.STRINGS));
-        assertEquals(asList("/c", "/d"), state.getProperty(IndexConstants.QUERY_PATHS).getValue(Type.STRINGS));
-        assertEquals(asList("/e", "/f"), state.getProperty(IndexConstants.SUPERSEDED_INDEX_PATHS).getValue(Type.STRINGS));
+        assertEquals(asList("/a", "/b"), state.getProperty(PROP_INCLUDED_PATHS).getValue(STRINGS));
+        assertEquals(asList("/c", "/d"), state.getProperty(IndexConstants.QUERY_PATHS).getValue(STRINGS));
+        assertEquals(asList("/e", "/f"), state.getProperty(IndexConstants.SUPERSEDED_INDEX_PATHS).getValue(STRINGS));
     }
 
     @Test
@@ -313,4 +317,39 @@ public class IndexDefinitionBuilderTest {
         NodeState state = builder.build();
         assertFalse(NodeStateUtils.getNode(state, "/indexRules/nt:file/properties").exists());
     }
+
+    @Test
+    public void noReindexWithAdditionalIncludedPaths() throws Exception {
+        nodeBuilder = builder.build().builder();
+        nodeBuilder.setProperty(REINDEX_PROPERTY_NAME, false);
+
+        builder = new IndexDefinitionBuilder(nodeBuilder);
+        builder.includedPaths("/a");
+
+        assertFalse(builder.build().getBoolean(REINDEX_PROPERTY_NAME));
+    }
+
+    @Test
+    public void reindexWithNewIncludedPathsNotPartOfOriginal() throws Exception {
+        nodeBuilder = builder.build().builder();
+        nodeBuilder.setProperty(REINDEX_PROPERTY_NAME, false);
+        nodeBuilder.setProperty(PROP_INCLUDED_PATHS, of("/foo"), STRINGS);
+
+        builder = new IndexDefinitionBuilder(nodeBuilder);
+        builder.includedPaths("/foo", "/a");
+
+        assertTrue(builder.build().getBoolean(REINDEX_PROPERTY_NAME));
+    }
+
+    @Test
+    public void reindexWithNewIncludedPathsInOriginalSetSubtrees() throws Exception {
+        nodeBuilder = builder.build().builder();
+        nodeBuilder.setProperty(REINDEX_PROPERTY_NAME, false);
+        nodeBuilder.setProperty(PROP_INCLUDED_PATHS, of("/foo"), STRINGS);
+
+        builder = new IndexDefinitionBuilder(nodeBuilder);
+        builder.includedPaths("/foo/a");
+
+        assertFalse(builder.build().getBoolean(REINDEX_PROPERTY_NAME));
+    }
 }
\ No newline at end of file
