diff --git a/pom.xml b/pom.xml
index 1126712..6f98cd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,7 +37,7 @@
     <properties>
         <oak.version>1.8.9</oak.version>
         <jackrabbit.version>2.16.3</jackrabbit.version>
-        <sling-mock.version>2.3.2</sling-mock.version>
+        <sling-mock.version>2.3.11-SNAPSHOT</sling-mock.version>
     </properties>
 
     <scm>
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/oak/contentimport/ContentLoaderJsonTest.java b/src/test/java/org/apache/sling/testing/mock/sling/oak/contentimport/ContentLoaderJsonTest.java
index fdacb1a..3a00285 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/oak/contentimport/ContentLoaderJsonTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/oak/contentimport/ContentLoaderJsonTest.java
@@ -18,8 +18,17 @@
  */
 package org.apache.sling.testing.mock.sling.oak.contentimport;
 
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
@@ -28,6 +37,8 @@
 import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderJsonTest;
 import org.junit.Test;
 
+import com.google.common.collect.Lists;
+
 @SuppressWarnings("null")
 public class ContentLoaderJsonTest extends AbstractContentLoaderJsonTest {
 
@@ -45,4 +56,51 @@
         assertNotNull(props.get(JcrConstants.JCR_UUID));
     }
 
+    @Test
+    public void testMixinNodeType() throws Exception {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content/par/image/ntLinkedFileTargetWithMixin/" + JcrConstants.JCR_CONTENT);
+
+        assertMixinNodeType(resource, "app:TestMixin");
+    }
+
+    @Test
+    public void testReferenceable() throws Exception {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content/par/image/ntLinkedFileTargetWithMixin/" + JcrConstants.JCR_CONTENT);
+        ValueMap props = ResourceUtil.getValueMap(resource);
+
+        assertMixinNodeType(resource, "mix:referenceable");
+        assertNotNull(props.get(JcrConstants.JCR_UUID));
+    }
+
+    @Test
+    public void testLinkedFile() throws Exception {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content/par/image/ntLinkedFile");
+        Resource targetResource = context.resourceResolver().getResource(path + "/sample/en/jcr:content/par/image/ntLinkedFileTargetWithMixin/" + JcrConstants.JCR_CONTENT);
+        Node node = resource.adaptTo(Node.class);
+        Node target = node.getProperty(JcrConstants.JCR_CONTENT).getNode();
+
+        assertEquals(targetResource.getPath(), target.getPath());
+        assertEquals(targetResource.getValueMap().get(JcrConstants.JCR_UUID), target.getProperty(JcrConstants.JCR_UUID).getString());
+    }
+
+    private void assertMixinNodeType(final Resource resource, final String mixinNodeType) throws RepositoryException {
+        ArrayList<NodeType> mixinNodeTypes = Lists.newArrayList();
+        Node node = resource.adaptTo(Node.class);
+        if (node != null) {
+            mixinNodeTypes.addAll(Arrays.asList(node.getMixinNodeTypes()));
+        } else {
+            ValueMap props = ResourceUtil.getValueMap(resource);
+            mixinNodeTypes.addAll(Arrays.asList((NodeType[]) props.get(JcrConstants.JCR_MIXINTYPES)));
+        }
+
+        Object hit = CollectionUtils.find(mixinNodeTypes, new Predicate() {
+            @Override
+            public boolean evaluate(Object o) {
+                NodeType nodeType = (NodeType) o;
+                return nodeType.getName().equals(mixinNodeType);
+            }
+        });
+        assertNotNull(hit);
+    }
+
 }
