Index: modeshape-jcr/src/main/java/org/modeshape/jcr/AbstractJcrNode.java =================================================================== --- modeshape-jcr/src/main/java/org/modeshape/jcr/AbstractJcrNode.java (revision 2478) +++ modeshape-jcr/src/main/java/org/modeshape/jcr/AbstractJcrNode.java (working copy) @@ -1538,8 +1538,12 @@ abstract class AbstractJcrNode extends AbstractJcrItem implements javax.jcr.Node property.remove(); return property; } - // else the property doesn't exist ... - throw new RepositoryException(JcrI18n.propertyNotFoundOnNode.text(name, getPath(), cache.workspaceName())); + + /* + * Return without throwing an exception to match JR behavior. This is also in conformance with the spec. + * This is a fix for MODE-976. + */ + return null; } /** Index: modeshape-jcr/src/test/java/org/modeshape/jcr/ModeShapeTckTest.java =================================================================== --- modeshape-jcr/src/test/java/org/modeshape/jcr/ModeShapeTckTest.java (revision 2478) +++ modeshape-jcr/src/test/java/org/modeshape/jcr/ModeShapeTckTest.java (working copy) @@ -1229,4 +1229,15 @@ public class ModeShapeTckTest extends AbstractJCRTest { assertThat(nodeA.getPath(), is("/nodeB/nodeA")); assertThat(nodeB.getPath(), is("/nodeB")); } + + @FixFor( "MODE-956" ) + public void testShouldBeAbleToSetNonexistingPropertyToNull() throws Exception { + Node rootNode = superuser.getRootNode(); + + Node child = rootNode.addNode("child", "nt:unstructured"); + rootNode.save(); + + child.setProperty("foo", (Calendar)null); + } + }