Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java	(revision 915797)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java	(working copy)
@@ -637,15 +637,13 @@
                         itemState.setStatus(ItemState.STATUS_NEW);
                     }
                 }
-                if (!item.isTransient()) {
-                    // re-apply transient changes (i.e. undo effect of item.makePersistent())
-                    if (item.isNode()) {
-                        NodeImpl node = (NodeImpl) item;
-                        node.restoreTransient((NodeState) itemState);
-                    } else {
-                        PropertyImpl prop = (PropertyImpl) item;
-                        prop.restoreTransient((PropertyState) itemState);
-                    }
+                // re-apply transient changes (for persistent nodes undo effect of item.makePersistent()) 
+                if (item.isNode()) {
+                    NodeImpl node = (NodeImpl) item;
+                    node.restoreTransient((NodeState) itemState);
+                } else {
+                    PropertyImpl prop = (PropertyImpl) item;
+                    prop.restoreTransient((PropertyState) itemState);
                 }
             } catch (RepositoryException re) {
                 // something went wrong, log exception and carry on
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(revision 915797)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(working copy)
@@ -973,15 +973,34 @@
 
     protected void restoreTransient(NodeState transientState)
             throws RepositoryException {
-        NodeState thisState = (NodeState) getOrCreateTransientItemState();
-        if (transientState.getStatus() == ItemState.STATUS_NEW
-                && thisState.getStatus() != ItemState.STATUS_NEW) {
-            thisState.setStatus(ItemState.STATUS_NEW);
-            stateMgr.disconnectTransientItemState(thisState);
+        NodeState thisState = null;
+        
+        if (!isTransient()) {
+            thisState = (NodeState) getOrCreateTransientItemState();
+            if (transientState.getStatus() == ItemState.STATUS_NEW
+                    && thisState.getStatus() != ItemState.STATUS_NEW) {
+                thisState.setStatus(ItemState.STATUS_NEW);
+                stateMgr.disconnectTransientItemState(thisState);
+            }
+            thisState.setParentId(transientState.getParentId());
+            thisState.setNodeTypeName(transientState.getNodeTypeName());
+        } else {
+            //Re-create transient state in the state manager, because it was removed
+            synchronized (data) {
+                try {
+                    thisState = stateMgr.createTransientNodeState(
+                            (NodeId) transientState.getId(), transientState
+                                    .getNodeTypeName(), transientState
+                                    .getParentId(), NodeState.STATUS_NEW);
+                    data.setState(thisState);
+
+                } catch (ItemStateException e) {
+                    throw new RepositoryException(e);
+                }
+            }
         }
+        
         // re-apply transient changes
-        thisState.setParentId(transientState.getParentId());
-        thisState.setNodeTypeName(transientState.getNodeTypeName());
         thisState.setMixinTypeNames(transientState.getMixinTypeNames());
         thisState.setDefinitionId(transientState.getDefinitionId());
         thisState.setChildNodeEntries(transientState.getChildNodeEntries());
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java	(revision 915797)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java	(working copy)
@@ -149,12 +149,30 @@
 
     protected void restoreTransient(PropertyState transientState)
             throws RepositoryException {
-        PropertyState thisState = (PropertyState) getOrCreateTransientItemState();
-        if (transientState.getStatus() == ItemState.STATUS_NEW
-                && thisState.getStatus() != ItemState.STATUS_NEW) {
-            thisState.setStatus(ItemState.STATUS_NEW);
-            stateMgr.disconnectTransientItemState(thisState);
+        
+        PropertyState thisState = null;
+        if (!isTransient()) {
+            thisState = (PropertyState) getOrCreateTransientItemState();
+            if (transientState.getStatus() == ItemState.STATUS_NEW
+                    && thisState.getStatus() != ItemState.STATUS_NEW) {
+                thisState.setStatus(ItemState.STATUS_NEW);
+                stateMgr.disconnectTransientItemState(thisState);
+            }
+        } else {
+            //Re-create transient state in the state manager, because it was removed
+            synchronized (data) {
+                try {
+
+                    thisState = stateMgr.createTransientPropertyState(
+                            transientState.getParentId(), transientState
+                                    .getName(), PropertyState.STATUS_NEW);
+                    data.setState(thisState);
+                } catch (ItemStateException e) {
+                    throw new RepositoryException(e);
+                }
+            }
         }
+        
         // reapply transient changes
         thisState.setDefinitionId(transientState.getDefinitionId());
         thisState.setType(transientState.getType());
