diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java
index 23cd723..b195441 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java
@@ -31,12 +31,15 @@
 
     private final Path path;
 
+    private final Path repositoryPath;
+
     private final List<String> restrictions = new LinkedList<>();
 
-    public Acl(String operation, String privileges, Path path) {
+    public Acl(String operation, String privileges, Path path, Path repositoryPath) {
         this.operation = operation;
         this.privileges = privileges;
         this.path = path;
+        this.repositoryPath = repositoryPath;
     }
 
     public void addRestriction(String restriction) {
@@ -57,6 +60,10 @@
         return path;
     }
 
+    public Path getRepositoryPath() {
+        return repositoryPath;
+    }
+
     public List<String> getRestrictions() {
         return restrictions;
     }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
index cebc5c2..2c0fb84 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
@@ -204,7 +204,7 @@
 
         Set<Path> paths = new TreeSet<>();
         for (Acl authorization : authorizations) {
-            addPath(authorization.getPath(), paths);
+            addPath(authorization.getRepositoryPath(), paths);
         }
 
         for (Path path : paths) {
@@ -247,7 +247,7 @@
             formatter.format("%s %s on %s",
                              authorization.getOperation(),
                              authorization.getPrivileges(),
-                             authorization.getPath());
+                             authorization.getRepositoryPath());
 
             if (!authorization.getRestrictions().isEmpty()) {
                 formatter.format(" restriction(%s)",
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
index 79995f4..6658264 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
@@ -23,6 +23,7 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
@@ -40,6 +41,7 @@
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.util.PlatformNameFormat;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.apache.sling.feature.cpconverter.acl.Acl;
 import org.apache.sling.feature.cpconverter.acl.AclManager;
@@ -80,7 +82,10 @@
         StringWriter stringWriter = new StringWriter();
         handler.setResult(new StreamResult(stringWriter));
 
-        RepPolicyParser systemUserParser = new RepPolicyParser(resourcePath, converter.getAclManager(), handler);
+        RepPolicyParser systemUserParser = new RepPolicyParser(Paths.get(resourcePath),
+                                                               Paths.get(PlatformNameFormat.getRepositoryPath(resourcePath)),
+                                                               converter.getAclManager(),
+                                                               handler);
         boolean hasRejectedAcls;
 
         try (InputStream input = archive.openInputStream(entry)) {
@@ -122,7 +127,9 @@
 
         private final Stack<Acl> acls = new Stack<>();
 
-        private final String path;
+        private final Path path;
+
+        private final Path repositoryPath;
 
         private final AclManager aclManager;
 
@@ -136,9 +143,10 @@
         // just internal pointer for every iteration
         private boolean processCurrentAcl = false;
 
-        public RepPolicyParser(String path, AclManager aclManager, TransformerHandler handler) {
+        public RepPolicyParser(Path path, Path repositoryPath, AclManager aclManager, TransformerHandler handler) {
             super(REP_ACL);
             this.path = path;
+            this.repositoryPath = repositoryPath;
             this.aclManager = aclManager;
             this.handler = handler;
         }
@@ -160,7 +168,7 @@
 
                     String privileges = extractValue(attributes.getValue(REP_PRIVILEGES));
 
-                    Acl acl = new Acl(operation, privileges, Paths.get(path));
+                    Acl acl = new Acl(operation, privileges, path, repositoryPath);
 
                     processCurrentAcl = aclManager.addAcl(principalName, acl);
                     if (processCurrentAcl) {
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java
index 37afda1..384168c 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java
@@ -29,11 +29,13 @@
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.jackrabbit.vault.util.PlatformNameFormat;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
 import org.apache.sling.repoinit.parser.RepoInitParser;
+import org.apache.sling.repoinit.parser.RepoInitParsingException;
 import org.apache.sling.repoinit.parser.impl.RepoInitParserService;
 import org.apache.sling.repoinit.parser.operations.Operation;
 import org.junit.After;
@@ -63,11 +65,11 @@
 
         aclManager.addSystemUser(new SystemUser("acs-commons-package-replication-status-event-service", Paths.get("/asd/public")));
 
-        aclManager.addAcl("acs-commons-ensure-oak-index-service", new Acl("allow", "jcr:read,rep:write,rep:indexDefinitionManagement", Paths.get("/asd/public")));
-        aclManager.addAcl("acs-commons-package-replication-status-event-service", new Acl("allow", "jcr:read,crx:replicate,jcr:removeNode", Paths.get("/asd/public")));
+        aclManager.addAcl("acs-commons-ensure-oak-index-service", newAcl("allow", "jcr:read,rep:write,rep:indexDefinitionManagement", "/asd/public"));
+       aclManager.addAcl("acs-commons-package-replication-status-event-service", newAcl("allow", "jcr:read,crx:replicate,jcr:removeNode", "/asd/public"));
 
         // add an ACL for unknown user
-        aclManager.addAcl("acs-commons-on-deploy-scripts-service", new Acl("allow", "jcr:read,crx:replicate,jcr:removeNode", Paths.get("/asd/public")));
+        aclManager.addAcl("acs-commons-on-deploy-scripts-service", newAcl("allow", "jcr:read,crx:replicate,jcr:removeNode", "/asd/public"));
 
         VaultPackageAssembler assembler = mock(VaultPackageAssembler.class);
         when(assembler.getEntry(anyString())).thenReturn(new File(System.getProperty("java.io.tmpdir")));
@@ -97,4 +99,39 @@
         assertFalse(operations.isEmpty());
     }
 
+    @Test
+    public void pathWithSpecialCharactersTest() throws RepoInitParsingException {
+        aclManager.addSystemUser(new SystemUser("sys-usr", Paths.get("/home/users/system")));
+        aclManager.addAcl("sys-usr", newAcl("allow", "jcr:read", "/content/_cq_tags"));
+        aclManager.addAcl("sys-usr", newAcl("allow", "jcr:write", "/content/cq:tags"));
+        VaultPackageAssembler assembler = mock(VaultPackageAssembler.class);
+        when(assembler.getEntry(anyString())).thenReturn(new File(System.getProperty("java.io.tmpdir")));
+        Feature feature = new Feature(new ArtifactId("org.apache.sling", "org.apache.sling.cp2fm", "0.0.1", null, null));
+
+        aclManager.addRepoinitExtension(Arrays.asList(assembler), feature);
+
+        Extension repoinitExtension = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
+        assertNotNull(repoinitExtension);
+        System.out.println(repoinitExtension.getText());
+
+        String expected = "create service user sys-usr with path /home/users/system\n" +
+                "create path (sling:Folder) /content\n" +
+                "create path (sling:Folder) /content/cq:tags\n" +
+                "set ACL for sys-usr\n" +
+                "allow jcr:read on /content/cq:tags\n" +
+                "allow jcr:write on /content/cq:tags\n" +
+                "end\n";
+
+        String actual = repoinitExtension.getText();
+        assertEquals(expected, actual);
+
+        RepoInitParser repoInitParser = new RepoInitParserService();
+        List<Operation> operations = repoInitParser.parse(new StringReader(actual));
+        assertFalse(operations.isEmpty());
+    }
+
+    private static Acl newAcl(String operation, String privileges, String path) {
+        return new Acl(operation, privileges, Paths.get(path), Paths.get(PlatformNameFormat.getRepositoryPath(path)));
+    }
+
 }
