Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java	(revision 1469305)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java	(working copy)
@@ -57,6 +57,7 @@
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.nodetype.NodeDefinitionImpl;
 import org.apache.jackrabbit.spi.commons.nodetype.PropertyDefinitionImpl;
+import org.apache.jackrabbit.util.ChildrenCollectorFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -739,6 +740,34 @@
      */
     synchronized NodeIterator getChildNodes(NodeId parentId)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException {
+        return getChildNodesInternal(parentId, null, null);
+    }
+
+    /**
+     * @param parentId
+     * @param namePattern a name pattern
+     * @param nameGlobs an array of globbing strings
+     * @return
+     * @throws ItemNotFoundException
+     * @throws AccessDeniedException
+     * @throws RepositoryException
+     */
+    synchronized NodeIterator getChildNodes(NodeId parentId, String namePattern, String[] nameGlobs)
+            throws ItemNotFoundException, AccessDeniedException, RepositoryException {
+    	return getChildNodesInternal(parentId, namePattern, nameGlobs);
+    }
+    
+    /**
+     * @param parentId
+     * @param namePattern a name pattern
+     * @param nameGlobs an array of globbing strings
+     * @return node iterator over matching child nodes
+     * @throws ItemNotFoundException
+     * @throws AccessDeniedException
+     * @throws RepositoryException
+     */
+    private NodeIterator getChildNodesInternal(NodeId parentId, String namePattern, String[] nameGlobs)
+            throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         sanityCheck();
 
         ItemData data = getItemData(parentId);
@@ -754,12 +783,20 @@
             ChildNodeEntry entry = iter.next();
             // delay check for read-access until item is being built
             // thus avoid duplicate check
-            childIds.add(entry.getId());
+
+            // check for name patterns if specified
+            if (namePattern == null && nameGlobs == null ||
+                    namePattern != null
+                    && ChildrenCollectorFilter.matches(sessionContext.getJCRName(entry.getName()), namePattern)
+                    || nameGlobs != null
+                    && ChildrenCollectorFilter.matches(sessionContext.getJCRName(entry.getName()), nameGlobs)) {
+            	childIds.add(entry.getId());
+            }
         }
 
         return new LazyItemIterator(sessionContext, childIds, parentId);
     }
-
+    
     /**
      * @param parentId
      * @return
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(revision 1469305)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(working copy)
@@ -2183,11 +2183,15 @@
         // IMPORTANT: an implementation of Node.getNodes() must not use
         // a class derived from TraversingElementVisitor to traverse the
         // hierarchy because this would lead to an infinite recursion!
+        return getNodesInternal(null, null);
+    }
+    
+    private NodeIterator getNodesInternal(final String namePattern, final String[] nameGlobs) throws RepositoryException {
         return perform(new SessionOperation<NodeIterator>() {
             public NodeIterator perform(SessionContext context)
                     throws RepositoryException {
                 try {
-                    return itemMgr.getChildNodes((NodeId) id);
+                    return itemMgr.getChildNodes((NodeId) id, namePattern, nameGlobs);
                 } catch (ItemNotFoundException e) {
                     throw new RepositoryException(
                             "Failed to list child nodes of " + NodeImpl.this, e);
@@ -2468,10 +2472,7 @@
      * {@inheritDoc}
      */
     public NodeIterator getNodes(String namePattern) throws RepositoryException {
-        // check state of this instance
-        sanityCheck();
-
-        return ChildrenCollectorFilter.collectChildNodes(this, namePattern);
+        return getNodesInternal(namePattern, null);
     }
 
     /**
@@ -3185,10 +3186,7 @@
      */
     public NodeIterator getNodes(String[] nameGlobs)
             throws RepositoryException {
-        // check state of this instance
-        sanityCheck();
-
-        return ChildrenCollectorFilter.collectChildNodes(this, nameGlobs);
+        return getNodesInternal(null, nameGlobs);
     }
 
     /**
