Index: src/main/java/org/apache/jackrabbit/util/Text.java
===================================================================
--- src/main/java/org/apache/jackrabbit/util/Text.java	(revision 659050)
+++ src/main/java/org/apache/jackrabbit/util/Text.java	(working copy)
@@ -604,9 +604,9 @@
      *         <code>false</code> otherwise.
      */
     public static boolean isDescendant(String path, String descendant) {
-        return !path.equals(descendant) &&
-                descendant.startsWith(path) &&
-                descendant.charAt(path.length()) == '/';
+        String pattern = path.endsWith("/") ? path : path + "/";
+        return !pattern.equals(descendant) &&
+                descendant.startsWith(pattern);
     }
 
     /**
Index: src/test/java/org/apache/jackrabbit/util/TextTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/util/TextTest.java	(revision 659050)
+++ src/test/java/org/apache/jackrabbit/util/TextTest.java	(working copy)
@@ -20,6 +20,10 @@
 import org.apache.jackrabbit.name.IllegalNameException;
 import org.apache.jackrabbit.name.NameFormat;
 
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
 /**
  * Test cases for the Text utility class.
  */
@@ -62,4 +66,39 @@
         checkEscape("%/:[]*'\"|\t\r\n");
     }
 
+    public void testIsDescendant() {
+        String parent = "/";
+        List descendants = new ArrayList();
+        descendants.add("/a");
+        descendants.add("/a/b");
+        for (Iterator it = descendants.iterator(); it.hasNext();) {
+            assertTrue(Text.isDescendant(parent, it.next().toString()));
+        }
+        List nonDescendants = new ArrayList();
+        nonDescendants.add("/");
+        nonDescendants.add("a");
+        for (Iterator it = nonDescendants.iterator(); it.hasNext();) {
+            String nonDesc = it.next().toString();
+            assertFalse(nonDesc + " isn't a descendant of " + parent,Text.isDescendant(parent, nonDesc));
+        }
+
+        parent = "/a/b";
+        descendants = new ArrayList();
+        descendants.add("/a/b/c");
+        descendants.add("/a/b/c/");
+        for (Iterator it = descendants.iterator(); it.hasNext();) {
+            assertTrue(Text.isDescendant(parent, it.next().toString()));
+        }
+        nonDescendants = new ArrayList();
+        nonDescendants.add("/");
+        nonDescendants.add("/a");
+        nonDescendants.add("/a/b");
+        nonDescendants.add("/a/b/");
+        nonDescendants.add("/d");
+        nonDescendants.add("/d/b");
+        for (Iterator it = nonDescendants.iterator(); it.hasNext();) {
+            String nonDesc = it.next().toString();
+            assertFalse(nonDesc + " isn't a descendant of " + parent, Text.isDescendant(parent, nonDesc));
+        }
+    }
 }
