Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/HierarchyEntryImpl.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/HierarchyEntryImpl.java	(revision 897849)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/HierarchyEntryImpl.java	(working copy)
@@ -26,7 +26,6 @@
 import org.apache.jackrabbit.jcr2spi.state.ItemState;
 import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory;
 import org.apache.jackrabbit.jcr2spi.state.Status;
-import org.apache.jackrabbit.jcr2spi.state.ItemState.MergeResult;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
@@ -224,13 +223,13 @@
             // with the passed state.
             int currentStatus = currentState.getStatus();
             boolean keepChanges = Status.isTransient(currentStatus) || Status.isStale(currentStatus);
-            MergeResult mergeResult = currentState.merge(state, keepChanges);
+
             if (currentStatus == Status.INVALIDATED) {
                 currentState.setStatus(Status.EXISTING);
-            } else if (mergeResult.modified()) {
+            } else {
+                currentState.merge(state, keepChanges);
                 currentState.setStatus(Status.MODIFIED);
             } // else: not modified. just leave status as it is.
-            mergeResult.dispose();
         }
     }
 
Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java	(revision 897849)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java	(working copy)
@@ -265,9 +265,8 @@
      *
      * @param another
      * @param keepChanges
-     * @return a MergeResult instance which represent the result of the merge operation
      */
-    public abstract MergeResult merge(ItemState another, boolean keepChanges);
+    public abstract void merge(ItemState another, boolean keepChanges);
 
     /**
      * Revert all transient modifications made to this ItemState.
@@ -335,49 +334,4 @@
         }
     }
 
-    // -----------------------------------------------------< MergeResult >---
-
-    /**
-     * A MergeResult represents the result of a {@link ItemState#merge(ItemState, boolean)}
-     * operation.
-     */
-    public interface MergeResult {
-
-        /**
-         * @return  true iff the target state of {@link ItemState#merge(ItemState, boolean)}
-         * was modified.
-         */
-        public boolean modified();
-
-        /**
-         * Dispose this MergeResult and release all internal resources that
-         * are not needed any more.
-         */
-        public void dispose();
-    }
-
-    /**
-     * A SimpleMergeResult is just a holder for a modification status.
-     * The {@link #modified()} method just returns the modification status passed
-     * to the constructor.
-     */
-    protected class SimpleMergeResult implements MergeResult {
-        private final boolean modified;
-
-        /**
-         * @param modified  modification status
-         */
-        public SimpleMergeResult(boolean modified) {
-            this.modified = modified;
-        }
-
-        public boolean modified() {
-            return modified;
-        }
-
-        public void dispose() {
-            // nothing to do.
-        }
-    }
-
 }
Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java	(revision 897849)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java	(working copy)
@@ -123,8 +123,7 @@
     /**
      * @see ItemState#merge(ItemState, boolean)
      */
-    public MergeResult merge(ItemState another, boolean keepChanges) {
-        boolean modified = false;
+    public void merge(ItemState another, boolean keepChanges) {
         if (another != null && another != this) {
             if (!another.isNode()) {
                 throw new IllegalArgumentException("Attempt to merge node state with property state.");
@@ -134,7 +133,6 @@
 
                 if (nState.definition != null && !nState.definition.equals(definition)) {
                     definition = nState.definition;
-                    modified = true;
                 }
 
                 // since 'mixinTypeNames' are modified upon save only, no special
@@ -142,11 +140,9 @@
                 List mixN = Arrays.asList(nState.mixinTypeNames);
                 if (mixN.size() != mixinTypeNames.length || !mixN.containsAll(Arrays.asList(mixinTypeNames))) {
                     setMixinTypeNames(nState.mixinTypeNames);
-                    modified = true;
                 }
             }
         }
-        return new SimpleMergeResult(modified);
     }
 
     /**
Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java	(revision 897849)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java	(working copy)
@@ -130,29 +130,20 @@
      *
      * @see ItemState#merge(ItemState, boolean)
      */
-    public MergeResult merge(ItemState another, boolean keepChanges) {
-        boolean modified = false;
+    public void merge(ItemState another, boolean keepChanges) {
         if (another != null && another != this) {
             if (another.isNode()) {
                 throw new IllegalArgumentException("Attempt to merge property state with node state.");
             }
-            PropertyDiffer result = new PropertyDiffer(data, ((PropertyState) another).data);
 
             // reset the pInfo to point to the pInfo of another state.
+            this.data.discardValues();
             this.data = ((PropertyState) another).data;
-            // if transient changes should be preserved OR if there are not
-            // transient changes, return the differ and postpone the effort of
-            // calculating the diff (the test if this state got internally changed)).
-            if (keepChanges || transientData == null) {
-                return result;
-            } else {
-                result.dispose();
+            if (!keepChanges && transientData != null) {
                 transientData.discardValues();
                 transientData = null;
-                modified = true;
             }
         }
-        return new SimpleMergeResult(modified);
     }
 
     /**
@@ -379,33 +370,4 @@
         }
     }
 
-    /**
-     * Helper class for delayed determination of property differences.
-     */
-    private class PropertyDiffer implements MergeResult {
-
-        private final PropertyData oldData;
-        private final PropertyData newData;
-
-        PropertyDiffer(PropertyData oldData, PropertyData newData) {
-            super();
-            this.oldData = oldData;
-            this.newData = newData;
-        }
-
-        public boolean modified() {
-            if (oldData.discarded || newData.discarded) {
-                // cannot calculate the diff any more -> return true.
-                String msg = " Diff cannot be calculated: " + ((oldData.discarded) ? "Old property data" : "New property data") + " have already been discarded.";
-                log.debug(msg);
-                return true;
-            }
-            return diff(oldData, newData);
-        }
-
-        public void dispose() {
-            oldData.discardValues();
-        }
-    }
-
 }
