Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java	(revision 654064)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java	(working copy)
@@ -62,7 +62,9 @@
     private final EntryFactory factory;
 
     /**
-     * Create a new <code>ChildNodeEntries</code> collection
+     * Create a new <code>ChildNodeEntries</code> collection and retrieve
+     * the entries from the persistent layer if the parent is neither
+     * NEW nor in a terminal status.
      */
     ChildNodeEntriesImpl(NodeEntry parent, EntryFactory factory) throws ItemNotFoundException, RepositoryException {
         entriesByName = new NameMap();
@@ -71,15 +73,38 @@
         this.parent = parent;
         this.factory = factory;
 
-        if (parent.getStatus() == Status.NEW || Status.isTerminal(parent.getStatus())) {
-            return; // cannot retrieve child-entries from persistent layer
-        }
+        if (parent.getStatus() != Status.NEW && !Status.isTerminal(parent.getStatus())) {
+            NodeId id = parent.getWorkspaceId();
+            Iterator childNodeInfos = factory.getItemStateFactory().getChildNodeInfos(id);
+            // simply add all child entries to the empty collection
+            while (childNodeInfos.hasNext()) {
+                ChildInfo ci = (ChildInfo) childNodeInfos.next();
+                NodeEntry entry = factory.createNodeEntry(parent, ci.getName(), ci.getUniqueID());
+                add(entry, ci.getIndex());
+            }
+        } /* else: cannot retrieve child-entries from persistent layer. the parent
+           * is NEW (transient only) or already removed from the persistent layer.
+           */
+    }
 
-        NodeId id = parent.getWorkspaceId();
-        Iterator it = factory.getItemStateFactory().getChildNodeInfos(id);
-        // simply add all child entries to the empty collection
-        while (it.hasNext()) {
-            ChildInfo ci = (ChildInfo) it.next();
+    /**
+     * Create a new <code>ChildNodeEntries</code> collection from the given
+     * <code>childNodeInfos</code> instead of retrieving them from the
+     * persistent layer.
+     *
+     * @param parent
+     * @param factory
+     * @param childNodeInfos
+     */
+    ChildNodeEntriesImpl(NodeEntry parent, EntryFactory factory, Iterator childNodeInfos) {
+        entriesByName = new NameMap();
+        entries = new LinkedEntries();
+
+        this.parent = parent;
+        this.factory = factory;
+
+        while (childNodeInfos.hasNext()) {
+            ChildInfo ci = (ChildInfo) childNodeInfos.next();
             NodeEntry entry = factory.createNodeEntry(parent, ci.getName(), ci.getUniqueID());
             add(entry, ci.getIndex());
         }
@@ -117,15 +142,20 @@
         }
 
         NodeId id = parent.getWorkspaceId();
-        Iterator it = factory.getItemStateFactory().getChildNodeInfos(id);
+        Iterator childNodeInfos = factory.getItemStateFactory().getChildNodeInfos(id);
+        reload(childNodeInfos);
+    }
+
+    void reload(Iterator childNodeInfos) {
+        // TODO: should existing (not-new) entries that are not present in the childInfos be removed?
         // create list from all ChildInfos (for multiple loop)
         List cInfos = new ArrayList();
-        while (it.hasNext()) {
-            cInfos.add(it.next());
+        while (childNodeInfos.hasNext()) {
+            cInfos.add(childNodeInfos.next());
         }
         // first make sure the ordering of all existing entries is ok
         NodeEntry entry = null;
-        for (it = cInfos.iterator(); it.hasNext();) {
+        for (Iterator it = cInfos.iterator(); it.hasNext();) {
             ChildInfo ci = (ChildInfo) it.next();
             NodeEntry nextEntry = get(ci);
             if (nextEntry != null) {
@@ -137,7 +167,7 @@
         }
         // then insert the 'new' entries
         List newEntries = new ArrayList();
-        for (it = cInfos.iterator(); it.hasNext();) {
+        for (Iterator it = cInfos.iterator(); it.hasNext();) {
             ChildInfo ci = (ChildInfo) it.next();
             NodeEntry beforeEntry = get(ci);
             if (beforeEntry == null) {
@@ -325,8 +355,8 @@
      * <code>null</code> <code>insertNode</code> is moved to the end of the
      * child node entries.
      *
-     * @param insertNode the NodeEntry to move.
-     * @param beforeNode the NodeEntry where <code>insertNode</code> is
+     * @param insertEntry the NodeEntry to move.
+     * @param beforeEntry the NodeEntry where <code>insertNode</code> is
      * reordered to.
      * @return the NodeEntry that followed the 'insertNode' before the reordering.
      * @throws NoSuchElementException if <code>insertNode</code> or
@@ -355,11 +385,12 @@
 
     /**
      *
-     * @param insertObj
+     * @param insertName
      * @param insertLN
      * @param beforeLN
      */
-    private void reorder(Name insertName, LinkedEntries.LinkNode insertLN, LinkedEntries.LinkNode beforeLN) {
+    private void reorder(Name insertName, LinkedEntries.LinkNode insertLN,
+                         LinkedEntries.LinkNode beforeLN) {
         // reorder named map
         if (entriesByName.containsSiblings(insertName)) {
             int position;
@@ -731,7 +762,6 @@
          *
          * @param siblings
          * @param index
-         * @param checkValidity
          * @return
          */
         private static NodeEntry findMatchingEntry(List siblings, int index) {
Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java	(revision 654064)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java	(working copy)
@@ -177,6 +177,14 @@
     public List getNodeEntries(Name nodeName) throws RepositoryException;
 
     /**
+     * Creates or updates the <code>ChildNodeEntries</code> of this node.
+     *
+     * @param childInfos
+     * @throws RepositoryException
+     */
+    public void setNodeEntries(Iterator childInfos) throws RepositoryException;
+
+    /**
      * Adds a new child NodeEntry to this entry.
      *
      * @param nodeName
Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java	(revision 654064)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java	(working copy)
@@ -590,6 +590,19 @@
     }
 
     /**
+     *
+     * @param childInfos
+     * @throws RepositoryException
+     */
+    public void setNodeEntries(Iterator childInfos) throws RepositoryException {
+        if (childNodeEntries == null) {
+            childNodeEntries = new ChildNodeEntriesImpl(this, factory, childInfos);
+        } else {
+            ((ChildNodeEntriesImpl) childNodeEntries).reload(childInfos);
+        }
+    }
+
+    /**
      * @inheritDoc
      * @see NodeEntry#addNodeEntry(Name, String, int)
      */
Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java	(revision 654064)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java	(working copy)
@@ -270,6 +270,13 @@
             log.warn("Internal error", e);
         }
 
+        // unless the child-info are omitted by the SPI impl -> make sure
+        // the childentries the nodeentry are initialized or updated.
+        Iterator childInfos = info.getChildInfos();
+        if (childInfos != null) {
+            entry.setNodeEntries(childInfos);
+        }
+
         notifyCreated(state);
         return state;
     }
Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java
===================================================================
--- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java	(revision 654064)
+++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java	(working copy)
@@ -16,18 +16,19 @@
  */
 package org.apache.jackrabbit.spi.commons;
 
-import org.apache.jackrabbit.spi.NodeInfo;
-import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.PropertyId;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.IdFactory;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.spi.NodeInfo;
 import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.PropertyId;
 
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.Serializable;
-
 /**
  * <code>NodeInfoImpl</code> implements a serializable <code>NodeInfo</code>
  * based on another node info.
@@ -65,6 +66,11 @@
     private final List propertyIds;
 
     /**
+     * The list of {@link ChildInfo}s of this node info.
+     */
+    private final List childInfos;
+
+    /**
      * Creates a new serializable <code>NodeInfo</code> for the given
      * <code>NodeInfo</code>.
      *
@@ -86,6 +92,7 @@
             NodeId nodeId = nodeInfo.getId();
             nodeId = idFactory.createNodeId(nodeId.getUniqueID(), nodeId.getPath());
             final Iterator propIds = nodeInfo.getPropertyIds();
+            final Iterator childInfos = nodeInfo.getChildInfos();
             return new NodeInfoImpl(nodeInfo.getPath(), nodeId,
                     nodeInfo.getIndex(), nodeInfo.getNodetype(),
                     nodeInfo.getMixins(), serRefs.iterator(),
@@ -104,7 +111,25 @@
                         public void remove() {
                             throw new UnsupportedOperationException();
                         }
-                    });
+                    },
+                    ((childInfos == null) ? null :
+                    new Iterator() {
+                        public boolean hasNext() {
+                            return childInfos.hasNext();
+                        }
+                        public Object next() {
+                            ChildInfo cInfo = (ChildInfo) childInfos.next();
+                            if (cInfo instanceof Serializable) {
+                                return cInfo;
+                            } else {
+                                return new ChildInfoImpl(cInfo.getName(), cInfo.getUniqueID(), cInfo.getIndex());
+                            }
+                        }
+                        public void remove() {
+                            throw new UnsupportedOperationException();
+                        }
+                    })
+            );
         }
     }
 
@@ -120,13 +145,15 @@
      * @param mixinNames      the names of the assigned mixins.
      * @param references      the references to this node.
      * @param propertyIds     the properties of this node.
+     * @param childInfos      the child infos of this node or <code>null</code>.
      * @deprecated Use {@link #NodeInfoImpl(Name, Path, NodeId, int, Name, Name[], Iterator, Iterator)}
      * instead. The parentId is not used any more.
      */
     public NodeInfoImpl(NodeId parentId, Name name, Path path, NodeId id,
                         int index, Name primaryTypeName, Name[] mixinNames,
-                        Iterator references, Iterator propertyIds) {
-         this(path, id, index, primaryTypeName, mixinNames, references, propertyIds);
+                        Iterator references, Iterator propertyIds,
+                        Iterator childInfos) {
+         this(path, id, index, primaryTypeName, mixinNames, references, propertyIds, childInfos);
     }
 
     /**
@@ -141,7 +168,8 @@
      * @param propertyIds     the properties of this node.
      */
     public NodeInfoImpl(Path path, NodeId id, int index, Name primaryTypeName,
-                        Name[] mixinNames, Iterator references, Iterator propertyIds) {
+                        Name[] mixinNames, Iterator references, Iterator propertyIds,
+                        Iterator childInfos) {
         super(path, true);
         this.id = id;
         this.index = index;
@@ -155,6 +183,14 @@
         while (propertyIds.hasNext()) {
             this.propertyIds.add(propertyIds.next());
         }
+        if (childInfos == null) {
+            this.childInfos = null;
+        } else {
+            this.childInfos = new ArrayList();
+            while (childInfos.hasNext()) {
+                this.childInfos.add(childInfos.next());
+            }
+        }
     }
 
     //-------------------------------< NodeInfo >-------------------------------
@@ -202,4 +238,11 @@
     public Iterator getPropertyIds() {
         return propertyIds.iterator();
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator getChildInfos() {
+        return (childInfos == null) ? null : childInfos.iterator();
+    }
 }
Index: jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java
===================================================================
--- jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java	(revision 654064)
+++ jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java	(working copy)
@@ -16,18 +16,19 @@
  */
 package org.apache.jackrabbit.spi2jcr;
 
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.conversion.NameException;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.apache.jackrabbit.spi.commons.conversion.NameException;
-import org.apache.jackrabbit.spi.Name;
 
-import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
 import javax.jcr.PropertyIterator;
-import javax.jcr.NamespaceException;
+import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
-import java.util.List;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * <code>NodeInfoImpl</code> implements a <code>NodeInfo</code> on top of a JCR
@@ -53,7 +54,8 @@
                 resolver.getQName(node.getPrimaryNodeType().getName()),
                 getNodeTypeNames(node.getMixinNodeTypes(), resolver),
                 getPropertyIds(node.getReferences(), resolver, idFactory),
-                getPropertyIds(node.getProperties(), resolver, idFactory));
+                getPropertyIds(node.getProperties(), resolver, idFactory),
+                getChildInfos(node.getNodes(), resolver));
     }
 
     /**
@@ -98,4 +100,13 @@
         }
         return references.iterator();
     }
+
+    private static Iterator getChildInfos(NodeIterator childNodes,
+                                          NamePathResolver resolver) throws RepositoryException {
+        List childInfos = new ArrayList();
+        while (childNodes.hasNext()) {
+            childInfos.add(new ChildInfoImpl(childNodes.nextNode(), resolver));
+        }
+        return childInfos.iterator();
+    }
 }
Index: jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java
===================================================================
--- jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java	(revision 654064)
+++ jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java	(working copy)
@@ -73,4 +73,22 @@
      * @see PropertyInfo#getId()
      */
     public Iterator getPropertyIds();
+
+    /**
+     * Return the all <code>ChildInfo</code>s of the node represent by
+     * this info, an empty iterator if that node doesn't have any child nodes
+     * or <code>null</code> if the implementation is not able or for some
+     * internal reasons not willing to compute the <code>ChildInfo</code>
+     * iterator. In the latter case the user of this API must call
+     * {@link RepositoryService#getChildInfos(SessionInfo, NodeId)} in order
+     * to determine the existence and identity of the child nodes.
+     *
+     * @return An iterator of <code>ChildInfo</code>s or <code>null</code> if
+     * the implementation is not able or willing to compute the set of
+     * <code>ChildInfo</code>s (e.g. an implementation may choose to return
+     * <code>null</code> if there is a huge amount of child nodes). In this
+     * case {@link RepositoryService#getChildInfos(SessionInfo, NodeId)} will
+     * be used to load the <code>ChildInfo</code>s.
+     */
+    public Iterator getChildInfos();
 }
