diff --git a/src/main/java/org/apache/sling/launchpad/testservices/serversidetests/ResourceResolverTest.java b/src/main/java/org/apache/sling/launchpad/testservices/serversidetests/ResourceResolverTest.java
index 94e80de..6aa4848 100644
--- a/src/main/java/org/apache/sling/launchpad/testservices/serversidetests/ResourceResolverTest.java
+++ b/src/main/java/org/apache/sling/launchpad/testservices/serversidetests/ResourceResolverTest.java
@@ -2667,71 +2667,6 @@
         }
     }
 
-    /*@Test public void test_resolve_with_sling_alias_limited_access() throws Exception {
-        Principal testUserPrincipal = AccessControlUtil.getPrincipalManager(session).getPrincipal("testuser");
-
-        Node child = rootNode.addNode("child");
-        child.setProperty("sling:alias", "kind");
-        AccessControlUtil.replaceAccessControlEntry(session, child.getPath(), testUserPrincipal, null, new String[] {"jcr:all"}, null, "last");
-        session.save();
-try {
-        Session testUserSession = getRepository().login(new SimpleCredentials("testuser", "test".toCharArray()));
-        final Map<String, Object> authInfo = new HashMap<String, Object>();
-        authInfo.put(ResourceResolverFactory.USER, "admin");
-        authInfo.put(ResourceResolverFactory.PASSWORD, "admin".toCharArray());
-        authInfo.put("testAttributeString", "AStringValue");
-        authInfo.put("testAttributeNumber", 999);
-        ResourceResolver testUserResolver = resFac.getResourceResolver(authInfo);
-
-        try {
-            // expect child due to the aliased not not being visible and no parent
-            // due to mapping the rootPath onto root
-            String path = "/child";
-            String mapped = testUserResolver.map(child.getPath());
-            assertEquals(path, mapped);
-
-            Resource res = testUserResolver.resolve(null, path);
-            assertNotNull(res);
-            assertTrue(res instanceof NonExistingResource);
-            assertEquals("/child",
-                res.getResourceMetadata().getResolutionPath());
-            // TODO - is this correct?
-            assertEquals(null, res.getResourceMetadata().getResolutionPathInfo());
-
-            // second level alias
-            Node grandchild = child.addNode("grandchild");
-            grandchild.setProperty("sling:alias", "enkel");
-            AccessControlUtil.replaceAccessControlEntry(session, grandchild.getPath(), testUserPrincipal, new String[] { "jcr:all" }, null, null, "first");
-            session.save();
-
-            // expect /child/enkel due to parent node not being
-            // visible to the test user and no parent due to mapping
-            // the rootPath onto root
-            String pathEnkel = "/child/enkel";
-            String mappedEnkel = testUserResolver.map(grandchild.getPath());
-            assertEquals(pathEnkel, mappedEnkel);*/
-
-            //TODO already commented
-            /*
-            Resource resEnkel = testUserResolver.resolve(null, pathEnkel);
-            assertNotNull(resEnkel);
-            assertEquals(rootNode.getPath() + "/kind/enkel",
-                resEnkel.getResourceMetadata().getResolutionPath());
-            assertEquals("", resEnkel.getResourceMetadata().getResolutionPathInfo());
-
-            Node resNodeEnkel = resEnkel.adaptTo(Node.class);
-            assertNotNull(resNodeEnkel);
-            assertEquals(grandchild.getPath(), resNodeEnkel.getPath());
-            */
-       /*} finally {
-            testUserSession.logout();
-        }
-        } finally {
-            child.remove();
-            session.save();
-        }
-    }*/
-
     @Test public void test_resolve_with_sling_alias_limited_access() throws Exception {
         
         Principal testUserPrincipal = new Principal() {
