diff --git a/pom.xml b/pom.xml
index 9432b8b..9e40c9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -203,7 +203,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.compiler</artifactId>
-            <version>2.3.0</version>
+            <version>2.3.7-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompiler.java b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompiler.java
index bdd1f7d..14aa3ab 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompiler.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompiler.java
@@ -22,16 +22,15 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
-import java.util.ArrayList;
+import java.lang.reflect.InvocationTargetException;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javax.script.Bindings;
 import javax.script.ScriptContext;
@@ -47,6 +46,7 @@
 import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.apache.sling.commons.compiler.JavaCompiler;
 import org.apache.sling.commons.compiler.Options;
+import org.apache.sling.commons.compiler.source.JavaEscapeHelper;
 import org.apache.sling.scripting.api.ScriptNameAware;
 import org.apache.sling.scripting.api.resource.ScriptingResourceResolverProvider;
 import org.apache.sling.scripting.sightly.SightlyException;
@@ -63,7 +63,6 @@
 import org.apache.sling.scripting.sightly.impl.utils.ScriptUtils;
 import org.apache.sling.scripting.sightly.java.compiler.GlobalShadowCheckBackendCompiler;
 import org.apache.sling.scripting.sightly.java.compiler.JavaClassBackendCompiler;
-import org.apache.sling.scripting.sightly.java.compiler.JavaEscapeUtils;
 import org.apache.sling.scripting.sightly.render.RenderContext;
 import org.apache.sling.scripting.sightly.render.RenderUnit;
 import org.osgi.service.component.annotations.Activate;
@@ -102,8 +101,7 @@
     private ResourceBackedPojoChangeMonitor resourceBackedPojoChangeMonitor;
 
     private static final String NO_SCRIPT = "NO_SCRIPT";
-    private static final Pattern MANGLED_CHAR_PATTERN = Pattern.compile("(.*)(__[0-9a-f]{4}__)(.*)");
-    private static final char[] ambiguousSymbols = new char[]{'-', '_', '.'};
+    private static final String JAVA_EXTENSION = ".java";
     static final String SIGHTLY_CONFIG_FILE = "/sightly.config";
 
     private final Map<String, Lock> compilationLocks = new HashMap<>();
@@ -130,7 +128,7 @@
         try {
             is = classLoaderWriter.getInputStream(SIGHTLY_CONFIG_FILE);
             if (is != null) {
-                versionInfo = IOUtils.toString(is, "UTF-8");
+                versionInfo = IOUtils.toString(is, StandardCharsets.UTF_8);
                 if (newVersionString.equals(versionInfo)) {
                     newVersion = false;
                 } else {
@@ -144,7 +142,7 @@
         if (newVersion) {
             OutputStream os = classLoaderWriter.getOutputStream(SIGHTLY_CONFIG_FILE);
             try {
-                IOUtils.write(sightlyEngineConfiguration.getEngineVersion(), os, "UTF-8");
+                IOUtils.write(sightlyEngineConfiguration.getEngineVersion(), os, StandardCharsets.UTF_8);
             } catch (IOException e) {
                 // ignore
             } finally {
@@ -152,10 +150,8 @@
             }
             String scratchFolder = sightlyEngineConfiguration.getScratchFolder();
             boolean scratchFolderDeleted = classLoaderWriter.delete(scratchFolder);
-            if (scratchFolderDeleted) {
-                if (StringUtils.isNotEmpty(versionInfo)) {
-                    LOGGER.info("Deleted stale classes generated by Apache Sling Scripting HTL engine version {}.", versionInfo);
-                }
+            if (scratchFolderDeleted && StringUtils.isNotEmpty(versionInfo)) {
+                LOGGER.info("Deleted stale classes generated by Apache Sling Scripting HTL engine version {}.", versionInfo);
             }
         }
         sightlyCompiler = SightlyCompiler.withKnownExpressionOptions(sightlyEngineConfiguration.getAllowedExpressionOptions());
@@ -182,7 +178,7 @@
                 Resource pojoResource = ScriptUtils.resolveScript(
                         scriptingResourceResolverProvider.getRequestScopedResourceResolver(),
                         renderContext,
-                        className + ".java"
+                        className + JAVA_EXTENSION
                 );
                 if (pojoResource != null) {
                     return getUseObjectAndRecompileIfNeeded(pojoResource);
@@ -231,13 +227,13 @@
             CompilationResult result =
                     shadowCheckBackendCompiler == null ? sightlyCompiler.compile(compilationUnit, javaClassBackendCompiler) :
                             sightlyCompiler.compile(compilationUnit, shadowCheckBackendCompiler);
-            if (result.getWarnings().size() > 0) {
+            if (!result.getWarnings().isEmpty()) {
                 for (CompilerMessage warning : result.getWarnings()) {
                     LOGGER.warn("Script {} {}:{}: {}", warning.getScriptName(), warning.getLine(), warning.getColumn(),
                             warning.getMessage());
                 }
             }
-            if (result.getErrors().size() > 0) {
+            if (!result.getErrors().isEmpty()) {
                 CompilerMessage error = result.getErrors().get(0);
                 throw new ScriptException(error.getMessage(), error.getScriptName(), error.getLine(), error.getColumn());
             }
@@ -270,107 +266,12 @@
         StringBuilder pathElements = new StringBuilder("/");
         String[] classElements = StringUtils.split(fullyQualifiedClassName, '.');
         for (int i = 0; i < classElements.length; i++) {
-            String classElem = classElements[i];
-            Matcher matcher = MANGLED_CHAR_PATTERN.matcher(classElem);
-            if (matcher.matches()) {
-                String group = matcher.group(2);
-                char unmangled = JavaEscapeUtils.unmangle(group);
-                classElem = classElem.replaceAll(group, Character.toString(unmangled));
-                while (matcher.find()) {
-                    group = matcher.group(2);
-                    unmangled = JavaEscapeUtils.unmangle(group);
-                    classElem = classElem.replaceAll(group, Character.toString(unmangled));
-                }
-            } else {
-                int underscoreIndex = classElem.indexOf('_');
-                if (underscoreIndex > -1) {
-                    if (underscoreIndex == classElem.length() - 1) {
-                        classElem = classElem.substring(0, classElem.length() -1);
-                    } else if (underscoreIndex == 0 && !Character.isJavaIdentifierStart(classElem.charAt(1))){
-                        classElem = classElem.substring(1);
-                    }
-                }
-            }
-            pathElements.append(classElem);
+            pathElements.append(JavaEscapeHelper.unescapeAll(classElements[i]));
             if (i < classElements.length - 1) {
                 pathElements.append("/");
             }
         }
-        Set<String> possiblePOJOPaths = getPossiblePojoPaths(pathElements.toString() + ".java");
-        for (String possiblePath : possiblePOJOPaths) {
-            Resource r = resolver.getResource(possiblePath);
-            if (r != null) {
-                return r;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * For a JCR path obtained from expanding a generated class name this method generates all the alternative path names that can be
-     * obtained by expanding the mentioned class' name.
-     *
-     * @param originalPath one of the possible paths
-     * @return a {@link Set} containing all the alternative paths if symbol replacement was needed; otherwise the set will contain just
-     * the {@code originalPath}
-     */
-    private static Set<String> getPossiblePojoPaths(String originalPath) {
-        Set<String> possiblePaths = new LinkedHashSet<>();
-        possiblePaths.add(originalPath);
-        Map<Integer, Character> chars = new HashMap<>();
-        for (char symbol : ambiguousSymbols) {
-            String pathCopy = originalPath.substring(0, originalPath.lastIndexOf("/"));
-            int actualIndex = 0;
-            boolean firstPass = true;
-            while (pathCopy.indexOf(symbol) != -1) {
-                int pos = pathCopy.indexOf(symbol);
-                actualIndex += pos;
-                if (!firstPass) {
-                    actualIndex += 1;
-                }
-                chars.put(actualIndex, symbol);
-                pathCopy = pathCopy.substring(pos + 1);
-                firstPass = false;
-            }
-        }
-        if (chars.size() > 0) {
-            ArrayList<char[]> possibleArrangements = new ArrayList<>();
-            populateArray(possibleArrangements, new char[chars.size()], 0);
-            Integer[] indexes = chars.keySet().toArray(new Integer[0]);
-            for (char[] arrangement : possibleArrangements) {
-                char[] possiblePath = originalPath.toCharArray();
-                for (int i = 0; i < arrangement.length; i++) {
-                    char currentSymbol = arrangement[i];
-                    int currentIndex = indexes[i];
-                    possiblePath[currentIndex] = currentSymbol;
-                }
-                possiblePaths.add(new String(possiblePath));
-            }
-        }
-        return possiblePaths;
-    }
-
-    /**
-     * Given an initial array with its size equal to the number of elements of a needed arrangement, this method will generate all
-     * the possible arrangements of values for this array in the provided {@code arrayCollection}. The values with which the array is
-     * populated are the {@link #ambiguousSymbols} characters.
-     *
-     * @param arrayCollection the collection that will store the arrays
-     * @param symbolsArrangementArray an initial array that will be used for collecting the results
-     * @param index the initial index of the array that will be populated (needed for recursion purposes; start with 0 for the initial call)
-     */
-    private static void populateArray(ArrayList<char[]> arrayCollection, char[] symbolsArrangementArray, int
-            index) {
-        if (symbolsArrangementArray.length > 0) {
-            if (index == symbolsArrangementArray.length) {
-                arrayCollection.add(symbolsArrangementArray.clone());
-            } else {
-                for (char symbol : ambiguousSymbols) {
-                    symbolsArrangementArray[index] = symbol;
-                    populateArray(arrayCollection, symbolsArrangementArray, index + 1);
-                }
-            }
-        }
+        return resolver.getResource(pathElements.toString() + JAVA_EXTENSION);
     }
 
     /**
@@ -393,9 +294,9 @@
         lock.lock();
         try {
             if (sightlyEngineConfiguration.keepGenerated()) {
-                String path = "/" + fqcn.replaceAll("\\.", "/") + ".java";
+                String path = "/" + fqcn.replace(".", "/") + JAVA_EXTENSION;
                 OutputStream os = classLoaderWriter.getOutputStream(path);
-                IOUtils.write(sourceCode, os, "UTF-8");
+                IOUtils.write(sourceCode, os, StandardCharsets.UTF_8);
                 IOUtils.closeQuietly(os);
             }
             String[] sourceCodeLines = sourceCode.split("\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029]");
@@ -426,7 +327,7 @@
                     compilationResult = javaCompiler.compile(new org.apache.sling.commons.compiler.CompilationUnit[]{compilationUnit}, options);
             long end = System.currentTimeMillis();
             List<org.apache.sling.commons.compiler.CompilerMessage> errors = compilationResult.getErrors();
-            if (errors != null && errors.size() > 0) {
+            if (errors != null && !errors.isEmpty()) {
                 throw new SightlyException(createErrorMsg(errors));
             }
             if (compilationResult.didCompile()) {
@@ -435,8 +336,8 @@
             /*
              * the class loader might have become dirty, so let the {@link ClassLoaderWriter} decide which class loader to return
              */
-            return classLoaderWriter.getClassLoader().loadClass(fqcn).newInstance();
-        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IOException e) {
+            return classLoaderWriter.getClassLoader().loadClass(fqcn).getDeclaredConstructor().newInstance();
+        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IOException | NoSuchMethodException | InvocationTargetException e) {
             throw new SightlyException(e);
         } finally {
             lock.unlock();
@@ -444,7 +345,8 @@
     }
 
     private Object getUseObjectAndRecompileIfNeeded(Resource pojoResource)
-            throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
+            throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException,
+            InvocationTargetException {
         SourceIdentifier sourceIdentifier = new SourceIdentifier(sightlyEngineConfiguration, pojoResource.getPath());
         long sourceLastModifiedDateFromCache =
                 resourceBackedPojoChangeMonitor.getLastModifiedDateForJavaUseObject(pojoResource.getPath());
@@ -455,15 +357,15 @@
             long sourceLastModifiedDate = pojoResource.getResourceMetadata().getModificationTime();
             resourceBackedPojoChangeMonitor.recordLastModifiedTimestamp(pojoResource.getPath(), sourceLastModifiedDate);
             if (classLastModifiedDate < 0 || sourceLastModifiedDate > classLastModifiedDate) {
-                return compileSource(sourceIdentifier, IOUtils.toString(pojoResource.adaptTo(InputStream.class), "UTF-8"));
+                return compileSource(sourceIdentifier, IOUtils.toString(pojoResource.adaptTo(InputStream.class), StandardCharsets.UTF_8));
             } else {
-                return classLoaderWriter.getClassLoader().loadClass(sourceIdentifier.getFullyQualifiedClassName()).newInstance();
+                return classLoaderWriter.getClassLoader().loadClass(sourceIdentifier.getFullyQualifiedClassName()).getDeclaredConstructor().newInstance();
             }
         } else {
             if (sourceLastModifiedDateFromCache > classLastModifiedDate) {
-                return compileSource(sourceIdentifier, IOUtils.toString(pojoResource.adaptTo(InputStream.class), "UTF-8"));
+                return compileSource(sourceIdentifier, IOUtils.toString(pojoResource.adaptTo(InputStream.class), StandardCharsets.UTF_8));
             } else {
-                return classLoaderWriter.getClassLoader().loadClass(sourceIdentifier.getFullyQualifiedClassName()).newInstance();
+                return classLoaderWriter.getClassLoader().loadClass(sourceIdentifier.getFullyQualifiedClassName()).getDeclaredConstructor().newInstance();
             }
         }
     }
@@ -477,12 +379,10 @@
         StringBuilder errorsBuffer = new StringBuilder();
         boolean duplicateVariable = false;
         for (final org.apache.sling.commons.compiler.CompilerMessage e : errors) {
-            if (!duplicateVariable) {
-                if (e.getMessage().contains("Duplicate local variable")) {
-                    duplicateVariable = true;
-                    buffer.append(" Maybe you defined more than one identical block elements without defining a different variable for "
-                            + "each one?");
-                }
+            if (!duplicateVariable && e.getMessage().contains("Duplicate local variable")) {
+                duplicateVariable = true;
+                buffer.append(
+                        " Maybe you defined more than one identical block elements without defining a different variable for each one?");
             }
             errorsBuffer.append("\nLine ");
             errorsBuffer.append(e.getLine());
diff --git a/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompilerTest.java b/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompilerTest.java
index 719a44d..c505dbf 100644
--- a/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompilerTest.java
+++ b/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SlingHTLMasterCompilerTest.java
@@ -34,6 +34,7 @@
 import org.apache.sling.commons.compiler.CompilationUnit;
 import org.apache.sling.commons.compiler.JavaCompiler;
 import org.apache.sling.commons.compiler.Options;
+import org.apache.sling.commons.compiler.source.JavaEscapeHelper;
 import org.apache.sling.scripting.api.resource.ScriptingResourceResolverProvider;
 import org.apache.sling.scripting.sightly.compiler.SightlyCompiler;
 import org.apache.sling.scripting.sightly.impl.compiler.MockPojo;
@@ -248,12 +249,12 @@
     @Test
     public void testGetPOJOFromFQCN() {
         Map<String, String> expectedScriptNames = new HashMap<String, String>() {{
-            put("/apps/a_b_c/d_e_f/Pojo.java", "apps.a_b_c.d_e_f.Pojo");
-            put("/apps/a-b-c/d.e.f/Pojo.java", "apps.a_b_c.d_e_f.Pojo");
-            put("/apps/a-b-c/d-e.f/Pojo.java", "apps.a_b_c.d_e_f.Pojo");
-            put("/apps/a-b-c/d.e_f/Pojo.java", "apps.a_b_c.d_e_f.Pojo");
-            put("/apps/a-b-c/d-e-f/Pojo.java", "apps.a_b_c.d_e_f.Pojo");
-            put("/apps/a/b/c/Pojo.java", "apps.a.b.c.Pojo");
+            put("/apps/a_b_c/d_e_f/Pojo.java", JavaEscapeHelper.makeJavaPackage("/apps/a_b_c/d_e_f/Pojo"));
+            put("/apps/a-b-c/d.e.f/Pojo.java", JavaEscapeHelper.makeJavaPackage("/apps/a-b-c/d.e.f/Pojo"));
+            put("/apps/a-b-c/d-e.f/Pojo.java", JavaEscapeHelper.makeJavaPackage("/apps/a-b-c/d-e.f/Pojo"));
+            put("/apps/a-b-c/d.e_f/Pojo.java", JavaEscapeHelper.makeJavaPackage("/apps/a-b-c/d.e_f/Pojo"));
+            put("/apps/a-b-c/d-e-f/Pojo.java", JavaEscapeHelper.makeJavaPackage("/apps/a-b-c/d-e-f/Pojo"));
+            put("/apps/a/b/c/Pojo.java", JavaEscapeHelper.makeJavaPackage("/apps/a/b/c/Pojo"));
         }};
         for (Map.Entry<String, String> scriptEntry : expectedScriptNames.entrySet()) {
             ResourceResolver resolver = Mockito.mock(ResourceResolver.class);
