diff --git a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
index 684ce80..90e8f9c 100644
--- a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
+++ b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
@@ -26,16 +26,23 @@
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 
-import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.jcr.resource.internal.HelperData;
 import org.apache.sling.spi.resource.provider.ResolveContext;
 import org.apache.sling.spi.resource.provider.ResourceContext;
+import org.jetbrains.annotations.NotNull;
 import org.junit.Assert;
 import org.mockito.Mockito;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 
+import static javax.jcr.nodetype.NodeType.NT_UNSTRUCTURED;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
 public class JcrResourceProviderTest extends SlingRepositoryTestBase {
 
     JcrResourceProvider jcrResourceProvider;
@@ -47,34 +54,48 @@
         // create the session
         session = getSession();
         Repository repo = getRepository();
-        ComponentContext ctx = Mockito.mock(ComponentContext.class);
-        Mockito.when(ctx.locateService(Mockito.anyString(), Mockito.any(ServiceReference.class))).thenReturn(repo);
+        ComponentContext ctx = mock(ComponentContext.class);
+        when(ctx.locateService(Mockito.anyString(), Mockito.any(ServiceReference.class))).thenReturn(repo);
         jcrResourceProvider = new JcrResourceProvider();
         jcrResourceProvider.activate(ctx);
     }
 
     @Override
     protected void tearDown() throws Exception {
-        jcrResourceProvider.deactivate();
-        super.tearDown();
+        try {
+            if (session.nodeExists("/parent")) {
+                session.removeItem("/parent");
+                session.save();
+            }
+        } finally {
+            jcrResourceProvider.deactivate();
+            super.tearDown();
+        }
+    }
+    
+    private @NotNull JcrProviderState createProviderState() {
+        return new JcrProviderState(session, new HelperData(null, null), false);
+    }
+    
+    private @NotNull ResolveContext mockResolveContext() {
+        ResolveContext ctx = mock(ResolveContext.class);
+        when(ctx.getProviderState()).thenReturn(createProviderState());
+        return ctx;
     }
 
     public void testAdaptTo_Principal() {
-        ResolveContext ctx = Mockito.mock(ResolveContext.class);
-        Mockito.when(ctx.getProviderState()).thenReturn(new JcrProviderState(session, null, false));
+        ResolveContext ctx = mockResolveContext();
         Assert.assertNotNull(jcrResourceProvider.adaptTo(ctx, Principal.class));
     }
 
     public void testOrderBefore() throws RepositoryException, PersistenceException {
-        Node parentNode = session.getRootNode().addNode("parent", NodeType.NT_UNSTRUCTURED);
-        parentNode.addNode("child1", NodeType.NT_UNSTRUCTURED);
-        parentNode.addNode("child2", NodeType.NT_UNSTRUCTURED);
-        parentNode.addNode("child3", NodeType.NT_UNSTRUCTURED);
+        Node parentNode = session.getRootNode().addNode("parent", NT_UNSTRUCTURED);
+        parentNode.addNode("child1", NT_UNSTRUCTURED);
+        parentNode.addNode("child2", NT_UNSTRUCTURED);
+        parentNode.addNode("child3", NT_UNSTRUCTURED);
         session.save();
 
-        ResolveContext ctx = Mockito.mock(ResolveContext.class);
-        JcrProviderState state = new JcrProviderState(session, null, false);
-        Mockito.when(ctx.getProviderState()).thenReturn(state);
+        ResolveContext ctx = mockResolveContext();
         Resource parent = jcrResourceProvider.getResource(ctx, "/parent", ResourceContext.EMPTY_CONTEXT, null);
         Assert.assertNotNull(parent);
         // order with invalid names
@@ -100,6 +121,45 @@
         
         Assert.assertTrue(jcrResourceProvider.orderBefore(ctx, parent, "child2", null));
     }
+    
+    public void testGetParent() throws Exception {
+        Node parentNode = session.getRootNode().addNode("parent", NT_UNSTRUCTURED);
+        Node child = parentNode.addNode("child", NT_UNSTRUCTURED);
+        Node grandchild = child.addNode("grandchild", NT_UNSTRUCTURED);
+        session.save();
+
+        ResolveContext ctx = mockResolveContext();
+        Resource rootResource = jcrResourceProvider.getResource(ctx, PathUtils.ROOT_PATH, ResourceContext.EMPTY_CONTEXT, null);
+        Resource parentResource = jcrResourceProvider.getResource(ctx, parentNode.getPath(), ResourceContext.EMPTY_CONTEXT, rootResource);
+        Resource childResource = jcrResourceProvider.getResource(ctx, child.getPath(), ResourceContext.EMPTY_CONTEXT, parentResource);
+        Resource grandChildResource = jcrResourceProvider.getResource(ctx, grandchild.getPath(), ResourceContext.EMPTY_CONTEXT, childResource);
+        assertResources(rootResource, parentResource, childResource, grandChildResource);
+        
+        assertParent(jcrResourceProvider.getParent(ctx, grandChildResource), child.getPath());
+        assertParent(jcrResourceProvider.getParent(ctx, childResource), parentNode.getPath());
+        assertParent(jcrResourceProvider.getParent(ctx, parentResource), PathUtils.ROOT_PATH);
+        assertNull(jcrResourceProvider.getParent(ctx, rootResource));
+    }
+    
+    public void testGetParentDifferentResource() {
+        Resource r = mock(Resource.class);
+        when(r.getPath()).thenReturn("/test/path");
+        Resource parent = jcrResourceProvider.getParent(mockResolveContext(), r);
+        assertFalse(parent instanceof JcrNodeResource);
+    }
+    
+    private static void assertResources(Resource... resources) {
+        for (Resource r : resources) {
+            assertNotNull(r);
+            assertTrue(r instanceof JcrNodeResource);
+        }
+    }
+    
+    private static void assertParent(Resource parent, String expectedPath) {
+        assertNotNull(parent);
+        assertTrue(parent instanceof JcrNodeResource);
+        assertEquals(expectedPath, parent.getPath());
+    }
 }
 
 
