Index: src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java	(revision 1207039)
+++ src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java	(working copy)
@@ -214,12 +214,12 @@
         // check if all expected are in result
         for (Iterator<String> it = expectedPaths.iterator(); it.hasNext();) {
             String path = it.next();
-            assertTrue(path + " is not part of the result set", resultPaths.contains(path));
+            assertTrue(path + " is not part of the result set "+ expectedPaths, resultPaths.contains(path));
         }
         // check result does not contain more than expected
         for (Iterator<String> it = resultPaths.iterator(); it.hasNext();) {
             String path = it.next();
-            assertTrue(path + " is not expected to be part of the result set", expectedPaths.contains(path));
+            assertTrue(path + " is not expected to be part of the result set " + expectedPaths, expectedPaths.contains(path));
         }
     }
 
Index: src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java	(revision 1207039)
+++ src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java	(working copy)
@@ -219,6 +219,41 @@
     }
 
     /**
+     * JCR-3160 - Session#move doesn't trigger rebuild of parent node
+     * aggregation
+     */
+    public void testAggregateMove() throws Exception {
+
+        String sql = "SELECT * FROM [nt:folder] as f"
+                + " WHERE ISDESCENDANTNODE([" + testRoot + "])"
+                + " AND CONTAINS (f.*, 'dog')";
+
+        Node folderA = testRootNode.addNode("folderA", "nt:folder");
+        Node folderB = testRootNode.addNode("folderB", "nt:folder");
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        Writer writer = new OutputStreamWriter(out, "UTF-8");
+        writer.write("the quick brown fox jumps over the lazy dog.");
+        writer.flush();
+
+        Node file = folderA.addNode("myFile", "nt:file");
+        Node resource = file.addNode("jcr:content", "nt:resource");
+        resource.setProperty("jcr:lastModified", Calendar.getInstance());
+        resource.setProperty("jcr:encoding", "UTF-8");
+        resource.setProperty("jcr:mimeType", "text/plain");
+        resource.setProperty("jcr:data", session.getValueFactory()
+                .createBinary(new ByteArrayInputStream(out.toByteArray())));
+        
+        testRootNode.getSession().save();
+        executeSQL2Query(sql, new Node[] { folderA });
+
+        testRootNode.getSession().move(file.getPath(),
+                folderB.getPath() + "/myFile");
+        testRootNode.getSession().save();
+        executeSQL2Query(sql, new Node[] { folderB });
+    }
+
+    /**
      * By default, the recursive aggregation is turned off.
      * 
      * The aggregation hierarchy is defined in
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java	(revision 1207039)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java	(working copy)
@@ -633,7 +633,6 @@
             if (state != null) {
                 NodeId id = state.getNodeId();
                 addedIds.add(id);
-                removedIds.remove(id);
                 retrieveAggregateRoot(state, aggregateRoots);
 
                 try {
