SLING-10493 review and resolve code quality warnings and issues (#16)

reported by sonar
diff --git a/pom.xml b/pom.xml
index bbba837..a5c9899 100644
--- a/pom.xml
+++ b/pom.xml
@@ -153,6 +153,41 @@
                 </configuration>
             </plugin>
         </plugins>
+        <pluginManagement>
+            <plugins>
+                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>
+                                            com.github.spotbugs
+                                        </groupId>
+                                        <artifactId>
+                                            spotbugs-maven-plugin
+                                        </artifactId>
+                                        <versionRange>
+                                            [3.1.11,)
+                                        </versionRange>
+                                        <goals>
+                                            <goal>check</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore></ignore>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
     </build>
 
     <dependencies>
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java b/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java
index b8c4035..0069e27 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java
@@ -23,11 +23,11 @@
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
 
-import org.apache.commons.lang3.ArrayUtils;
 import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.request.RequestUtil;
 import org.apache.sling.api.servlets.ServletResolverConstants;
-import org.apache.sling.engine.RequestUtil;
 import org.apache.sling.servlets.resolver.internal.resource.SlingServletConfig;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,7 +46,11 @@
     // a valid selector or extension to avoid collisions
     private static final String EMPTY_VALUE = ".EMPTY.";
 
+    private static final String[] EMPTY_STRINGS = new String[0];
+
     static class InvalidPropertyException extends RuntimeException {
+        private static final long serialVersionUID = -119036154771528511L;
+
         InvalidPropertyException(String reason) {
             super(reason);
         }
@@ -79,7 +83,7 @@
 
     private boolean accept(String servletName, SlingServletConfig config, String servicePropertyKey, boolean emptyValueApplies, String ... requestValues) {
         final String [] propValues = toStringArray(config.getServiceProperty(servicePropertyKey));
-        if(propValues == null) {
+        if(propValues.length == 0) {
             LOGGER.debug("Property {} is null or empty, not checking that value for {}", servicePropertyKey, servletName);
             return true;
         }
@@ -109,7 +113,7 @@
         return accepted;
     }
 
-    private static String [] toStringArray(final Object value) {
+    private static @NotNull String [] toStringArray(final Object value) {
         if(value instanceof String) {
             return new String[] { (String)value };
         } else if(value instanceof String []) {
@@ -118,6 +122,6 @@
             final Object [] objArray = (Object[])value;
             return Arrays.copyOf(objArray, objArray.length, String[].class);
         }
-        return null;
+        return EMPTY_STRINGS;
     }
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
index 21941d8..330f115 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
@@ -42,25 +42,25 @@
             + "or a number which specifies the resource resolver's search path entry index. The default value "
             + "is 0 (usually stands for \"/apps\" in the search paths). The number can be -1 which always "
             + "points to the last search path entry.")
-    String servletresolver_servletRoot() default "0";
+    String servletresolver_servletRoot() default "0"; // NOSONAR
 
     /** The default cache size for the script resolution. */
     @AttributeDefinition(name = "Cache Size", description = "This property configures the size of the "
             + "cache used for script resolution. A value lower than 5 disables the cache.")
-    int servletresolver_cacheSize() default 200;
+    int servletresolver_cacheSize() default 200; // NOSONAR
 
     @AttributeDefinition(name = "Execution Paths", description = "The paths to search for executable scripts. If no path is configured "
             + "this is treated like the default (/ = root) which allows to execute all scripts. By configuring some "
             + "paths the execution of scripts can be limited. If a configured value ends with a slash, the whole sub tree "
             + "is allowed. Without a slash an exact matching script is allowed.")
-    String[] servletresolver_paths() default "/";
+    String[] servletresolver_paths() default "/"; // NOSONAR
 
     @AttributeDefinition(name = "Default Extensions", description = "The list of extensions for which the default behavior "
             + "will be used. This means that the last path segment of the resource type can be used as the script name.")
-    String[] servletresolver_defaultExtensions() default "html";
+    String[] servletresolver_defaultExtensions() default "html"; // NOSONAR
 
     @AttributeDefinition(name = "Mount Providers", description = "Should servlets be mounted as resource providers?" +
         " If true (the default), servlets will be represented in the content tree using resource provider -" +
         " otherwise, servlets will be decorated back into the content tree using a decorator.")
-    boolean servletresolver_mountProviders() default true;
+    boolean servletresolver_mountProviders() default true; // NOSONAR
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
index c5a75ce..f1a4597 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
@@ -19,6 +19,7 @@
 package org.apache.sling.servlets.resolver.internal;
 
 import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 
 import javax.servlet.Servlet;
@@ -44,7 +45,7 @@
  */
 public class ScriptResource extends AbstractResource {
 
-    private volatile Resource sharedResource;
+    private AtomicReference<Resource> sharedResource = new AtomicReference<>();
 
     private final ResourceResolver sharedResourceResolver;
 
@@ -65,10 +66,12 @@
         if ( perThreadResolver != null && perThreadResolver.isLive() ) {
             return perThreadResolver.getResource(this.path);
         }
-        if ( this.sharedResource == null ) {
-            this.sharedResource = this.sharedResourceResolver.getResource(this.path);
+        Resource resource = this.sharedResource.get();
+        if ( resource == null ) {
+            resource = this.sharedResourceResolver.getResource(this.path);
+            this.sharedResource.set(resource);
         }
-        return this.sharedResource;
+        return resource;
     }
 
     /**
@@ -100,7 +103,7 @@
      */
     @SuppressWarnings("unchecked")
     @Override
-    public <AdapterType> AdapterType adaptTo(final Class<AdapterType> type) {
+    public <T> T adaptTo(final Class<T> type) {
         if ( type == Servlet.class ) {
             Resource activeResource = this.getActiveResource();
             while (activeResource instanceof ResourceWrapper) {
@@ -109,13 +112,13 @@
             if (! (activeResource instanceof ServletResource)) {
                 final Servlet s = (Servlet) super.adaptTo(type);
                 if ( s != null ) {
-                    return (AdapterType)s;
+                    return (T)s;
                 }
             }
         } else if ( type == SlingScript.class ) {
             final SlingScript s = (SlingScript)super.adaptTo(type);
             if ( s != null ) {
-                return (AdapterType)s;
+                return (T)s;
             }
         }
         return this.getActiveResource().adaptTo(type);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
index 46382c0..5ac8eb0 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
@@ -36,12 +36,12 @@
 
 public class ScriptResourceResolver extends ResourceResolverWrapper {
     private final ResourceResolver resolver;
-    private final Supplier<MergingServletResourceProvider> provider;
+    private final Supplier<MergingServletResourceProvider> providerSupplier;
 
     public ScriptResourceResolver(ResourceResolver resolver, Supplier<MergingServletResourceProvider> provider) {
         super(resolver);
         this.resolver = resolver;
-        this.provider = provider;
+        this.providerSupplier = provider;
     }
 
     public static ScriptResourceResolver wrap(ResourceResolver scriptResourceResolver, Supplier<MergingServletResourceProvider> provider) {
@@ -53,14 +53,15 @@
         return () -> listChildren(parent);
     }
 
+    @Override
     public Resource getResource(String scriptPath) {
-        MergingServletResourceProvider provider = this.provider.get();
+        MergingServletResourceProvider provider = this.providerSupplier.get();
 
         if (provider == null) {
             return super.getResource(scriptPath);
         }
         else {
-            return wrap(provider.getResource(new ResolveContext() {
+            return wrap(provider.getResource(new ResolveContext<Object>() {
                 @Override
                 public ResourceResolver getResourceResolver() {
                     return ScriptResourceResolver.this;
@@ -78,14 +79,14 @@
 
                 @Override
                 public ResourceProvider<?> getParentResourceProvider() {
-                    return new ResourceProvider() {
+                    return new ResourceProvider<Object>() {
                         @Override
-                        public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
+                        public Resource getResource(ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
                             return resolver.getResource(path);
                         }
 
                         @Override
-                        public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
+                        public Iterator<Resource> listChildren(ResolveContext<Object> ctx, Resource parent) {
                             return resolver.listChildren(parent);
                         }
                     };
@@ -97,19 +98,19 @@
     @Override
     public Resource getResource(Resource base, @NotNull String path) {
         if (!path.startsWith("/") && base != null) {
-            path = base.getPath() + "/" + path;
+            path = String.format("%s/%s", base.getPath(), path);
         }
         return getResource(path);
     }
 
     @Override
     public Iterator<Resource> listChildren(Resource parent) {
-        MergingServletResourceProvider provider = this.provider.get();
+        MergingServletResourceProvider provider = this.providerSupplier.get();
         if (provider == null) {
             return super.listChildren(parent);
         }
         else {
-            return wrap(provider.listChildren(new ResolveContext() {
+            return wrap(provider.listChildren(new ResolveContext<Object>() {
                 @Override
                 public ResourceResolver getResourceResolver() {
                     return ScriptResourceResolver.this;
@@ -125,14 +126,14 @@
                 }
 
                 public ResourceProvider<?> getParentResourceProvider() {
-                    return new ResourceProvider() {
+                    return new ResourceProvider<Object>() {
                         @Override
-                        public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
+                        public Resource getResource(ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
                             return resolver.getResource(path);
                         }
 
                         @Override
-                        public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
+                        public Iterator<Resource> listChildren(ResolveContext<Object> ctx, Resource parent) {
                             return resolver.listChildren(parent);
                         }
                     };
@@ -167,8 +168,9 @@
         return resource;
     }
 
-    public ScriptResourceResolver clone(Map o) throws LoginException {
-        return ScriptResourceResolver.wrap(resolver.clone(o), provider);
+    @Override
+    public ScriptResourceResolver clone(Map<String, Object> o) throws LoginException {
+        return ScriptResourceResolver.wrap(resolver.clone(o), providerSupplier);
     }
 
     private class ScriptResourceResolverResourceWrapper extends ResourceWrapper {
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
index 7318608..3b23e07 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
@@ -27,7 +27,7 @@
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.function.Supplier;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
@@ -113,25 +113,25 @@
 
     // the default servlet if no other servlet applies for a request. This
     // field is set on demand by getDefaultServlet()
-    private volatile Servlet defaultServlet;
+    private AtomicReference<Servlet> defaultServlet = new AtomicReference<>();
 
     // the default error handler servlet if no other error servlet applies for
     // a request. This field is set on demand by getDefaultErrorServlet()
-    private volatile Servlet fallbackErrorServlet;
+    private AtomicReference<Servlet> fallbackErrorServlet = new AtomicReference<>();
 
-    private volatile ResourceResolver sharedScriptResolver;
+    private AtomicReference<ResourceResolver> sharedScriptResolver = new AtomicReference<>();
 
     private final ThreadLocal<ResourceResolver> perThreadScriptResolver = new ThreadLocal<>();
 
     /**
      * The allowed execution paths.
      */
-    private volatile String[] executionPaths;
+    private AtomicReference<String[]> executionPaths = new AtomicReference<>();
 
     /**
      * The default extensions
      */
-    private volatile String[] defaultExtensions;
+    private AtomicReference<String[]> defaultExtensions = new AtomicReference<>();
 
     private final PathBasedServletAcceptor pathBasedServletAcceptor = new PathBasedServletAcceptor();
 
@@ -154,9 +154,9 @@
         final Resource resource = request.getResource();
 
         // start tracking servlet resolution
-        final RequestProgressTracker tracker = request.getRequestProgressTracker();
+        final RequestProgressTracker progressTracker = request.getRequestProgressTracker();
         final String timerName = "resolveServlet(" + resource.getPath() + ")";
-        tracker.startTimer(timerName);
+        progressTracker.startTimer(timerName);
 
         final String resourceType = resource.getResourceType();
         if (LOGGER.isDebugEnabled()) {
@@ -166,7 +166,7 @@
         final ResourceResolver scriptResolver = this.getScriptResourceResolver();
         Servlet servlet = null;
 
-        if ( resourceType != null && resourceType.length() > 0 ) {
+        if ( resourceType.length() > 0 ) {
             servlet = resolveServletInternal(request, null, resourceType, scriptResolver);
         }
 
@@ -179,19 +179,11 @@
         }
 
         // track servlet resolution termination
-        if (servlet == null) {
-            tracker.logTimer(timerName, "Servlet resolution failed. See log for details");
-        } else {
-            tracker.logTimer(timerName, "Using servlet {0}", RequestUtil.getServletName(servlet));
-        }
+        progressTracker.logTimer(timerName, "Using servlet {0}", RequestUtil.getServletName(servlet));
 
         // log the servlet found
         if (LOGGER.isDebugEnabled()) {
-            if (servlet != null) {
-                LOGGER.debug("Servlet {} found for resource={}", RequestUtil.getServletName(servlet), resource);
-            } else {
-                LOGGER.debug("No servlet found for resource={}", resource);
-            }
+            LOGGER.debug("Servlet {} found for resource={}", RequestUtil.getServletName(servlet), resource);
         }
 
         return servlet;
@@ -215,7 +207,7 @@
         // log the servlet found
         if (LOGGER.isDebugEnabled()) {
             if (servlet != null) {
-                LOGGER.debug("Servlet {} found for resource {} and script name {}", new Object[] {RequestUtil.getServletName(servlet), resource, scriptName});
+                LOGGER.debug("Servlet {} found for resource {} and script name {}", RequestUtil.getServletName(servlet), resource, scriptName);
             } else {
                 LOGGER.debug("No servlet found for resource {} and script name {}", resource, scriptName);
             }
@@ -268,7 +260,7 @@
         // return a resource wrapper to make sure the implementation
         // switches from the per thread resource resolver to the shared once
         // the per thread resource resolver is closed
-        return new ScriptResource(scriptResource, perThreadScriptResolver::get, this.sharedScriptResolver).adaptTo(Servlet.class);
+        return new ScriptResource(scriptResource, perThreadScriptResolver::get, this.sharedScriptResolver.get()).adaptTo(Servlet.class);
     }
 
     // ---------- ErrorHandler interface --------------------------------------
@@ -285,14 +277,14 @@
 
         // do not handle, if already handling ....
         if (request.getAttribute(SlingConstants.ERROR_REQUEST_URI) != null) {
-            LOGGER.error("handleError: Recursive invocation. Not further handling status " + status + "(" + message + ")");
+            LOGGER.error("handleError: Recursive invocation. Not further handling status {}({})", status, message);
             return;
         }
 
         // start tracker
-        RequestProgressTracker tracker = request.getRequestProgressTracker();
+        RequestProgressTracker progressTracker = request.getRequestProgressTracker();
         String timerName = "handleError:status=" + status;
-        tracker.startTimer(timerName);
+        progressTracker.startTimer(timerName);
 
         final ResourceResolver scriptResolver = this.getScriptResourceResolver();
         try {
@@ -303,7 +295,7 @@
             String extension = request.getRequestPathInfo().getExtension();
             ResourceCollector locationUtil = new ResourceCollector(String.valueOf(status),
                     DEFAULT_ERROR_HANDLER_RESOURCE_TYPE, resource,
-                    extension, this.executionPaths);
+                    extension, this.executionPaths.get());
             Servlet servlet = getServletInternal(locationUtil, request, scriptResolver);
 
             // fall back to default servlet if none
@@ -312,7 +304,7 @@
             }
 
             // set the message properties
-            request.setAttribute(ERROR_STATUS, new Integer(status));
+            request.setAttribute(ERROR_STATUS, Integer.valueOf(status));
             request.setAttribute(ERROR_MESSAGE, message);
 
             // the servlet name for a sendError handling is still stored
@@ -323,12 +315,12 @@
             }
 
             // log a track entry after resolution before calling the handler
-            tracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
+            progressTracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
 
             handleError(servlet, request, response);
 
         } finally {
-            tracker.logTimer(timerName, "Error handler finished");
+            progressTracker.logTimer(timerName, "Error handler finished");
         }
     }
 
@@ -345,9 +337,9 @@
         }
 
         // start tracker
-        RequestProgressTracker tracker = request.getRequestProgressTracker();
+        RequestProgressTracker progressTracker = request.getRequestProgressTracker();
         String timerName = "handleError:throwable=" + throwable.getClass().getName();
-        tracker.startTimer(timerName);
+        progressTracker.startTimer(timerName);
 
         final ResourceResolver scriptResolver = this.getScriptResourceResolver();
         try {
@@ -361,7 +353,7 @@
                 String extension = request.getRequestPathInfo().getExtension();
                 ResourceCollector locationUtil = new ResourceCollector(tClass.getSimpleName(),
                         DEFAULT_ERROR_HANDLER_RESOURCE_TYPE, resource,
-                        extension, this.executionPaths);
+                        extension, this.executionPaths.get());
                 servlet = getServletInternal(locationUtil, request, scriptResolver);
 
                 // go to the base class
@@ -378,11 +370,11 @@
             request.setAttribute(SlingConstants.ERROR_MESSAGE, throwable.getMessage());
 
             // log a track entry after resolution before calling the handler
-            tracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
+            progressTracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
 
             handleError(servlet, request, response);
         } finally {
-            tracker.logTimer(timerName, "Error handler finished");
+            progressTracker.logTimer(timerName, "Error handler finished");
         }
     }
 
@@ -393,9 +385,9 @@
         if ( scriptResolver == null ) {
             // no per thread, let's use the shared one
             synchronized ( this.sharedScriptResolver ) {
-                this.sharedScriptResolver.refresh();
+                this.sharedScriptResolver.get().refresh();
             }
-            scriptResolver = this.sharedScriptResolver;
+            scriptResolver = this.sharedScriptResolver.get();
         }
         return scriptResolver;
     }
@@ -407,7 +399,7 @@
     public void onEvent(final SlingRequestEvent event) {
         if ( event.getType() == SlingRequestEvent.EventType.EVENT_INIT ) {
             try {
-                this.perThreadScriptResolver.set(this.sharedScriptResolver.clone(null));
+                this.perThreadScriptResolver.set(this.sharedScriptResolver.get().clone(null));
             } catch (final LoginException e) {
                 LOGGER.error("Unable to create new script resolver clone", e);
             }
@@ -431,7 +423,7 @@
      */
     private Resource getErrorResource(final SlingHttpServletRequest request) {
         Resource res = request.getResource();
-        if (res == null) {
+        if (res == null) { // NOSONAR
             res = new SyntheticResource(request.getResourceResolver(), request.getPathInfo(),
                     DEFAULT_ERROR_HANDLER_RESOURCE_TYPE);
         }
@@ -452,7 +444,7 @@
         // path of a servlet (or script)
         if (scriptNameOrResourceType.charAt(0) == '/') {
             final String scriptPath = ResourceUtil.normalize(scriptNameOrResourceType);
-            if (scriptPath != null &&  isPathAllowed(scriptPath, this.executionPaths) ) {
+            if (scriptPath != null &&  isPathAllowed(scriptPath, this.executionPaths.get()) ) {
                 final Resource res = resolver.getResource(scriptPath);
                 servlet = this.getServlet(res);
                 if (servlet != null && !pathBasedServletAcceptor.accept(request, servlet)) {
@@ -478,9 +470,9 @@
             // the resource type is not absolute, so lets go for the deep search
             final AbstractResourceCollector locationUtil;
             if ( request != null ) {
-                locationUtil = ResourceCollector.create(request, this.executionPaths, this.defaultExtensions);
+                locationUtil = ResourceCollector.create(request, this.executionPaths.get(), this.defaultExtensions.get());
             } else {
-                locationUtil = NamedScriptResourceCollector.create(scriptNameOrResourceType, resource, this.executionPaths);
+                locationUtil = NamedScriptResourceCollector.create(scriptNameOrResourceType, resource, this.executionPaths.get());
             }
             servlet = getServletInternal(locationUtil, request, resolver);
 
@@ -568,17 +560,18 @@
      * be used if the default servlets have not been registered (yet).
      */
     private Servlet getDefaultServlet() {
-        if (defaultServlet == null) {
+        Servlet servlet = defaultServlet.get();
+        if (servlet == null) {
             try {
-                Servlet servlet = new DefaultServlet();
+                servlet = new DefaultServlet();
                 servlet.init(new SlingServletConfig(servletContext, null, "Apache Sling Core Default Servlet"));
-                defaultServlet = servlet;
+                defaultServlet.set(servlet);
             } catch (final ServletException se) {
                 LOGGER.error("Failed to initialize default servlet", se);
             }
         }
 
-        return defaultServlet;
+        return servlet;
     }
 
     /**
@@ -605,7 +598,7 @@
         final ResourceCollector locationUtil = new ResourceCollector(
             ServletResolverConstants.DEFAULT_ERROR_HANDLER_METHOD,
             DEFAULT_ERROR_HANDLER_RESOURCE_TYPE, resource,
-            extension, this.executionPaths);
+            extension, this.executionPaths.get());
         final Servlet servlet = getServletInternal(locationUtil, request, resolver);
         if (servlet != null) {
             return servlet;
@@ -613,19 +606,20 @@
 
         // if no registered default error handler could be found use
         // the DefaultErrorHandlerServlet as an ad-hoc fallback
-        if (fallbackErrorServlet == null) {
+        Servlet fallbackServlet = fallbackErrorServlet.get();
+        if (fallbackServlet == null) {
             // fall back to an adhoc instance of the DefaultErrorHandlerServlet
             // if the actual service is not registered (yet ?)
             try {
-                final Servlet defaultServlet = new DefaultErrorHandlerServlet();
-                defaultServlet.init(new SlingServletConfig(servletContext,
+                fallbackServlet = new DefaultErrorHandlerServlet();
+                fallbackServlet.init(new SlingServletConfig(servletContext,
                     null, "Sling (Ad Hoc) Default Error Handler Servlet"));
-                fallbackErrorServlet = defaultServlet;
+                fallbackErrorServlet.set(fallbackServlet);
             } catch (ServletException se) {
                 LOGGER.error("Failed to initialize error servlet", se);
             }
         }
-        return fallbackErrorServlet;
+        return fallbackServlet;
     }
 
     private void handleError(final Servlet errorHandler, final SlingHttpServletRequest request, final SlingHttpServletResponse response)
@@ -656,7 +650,7 @@
                 // close the response (SLING-2724)
                 wrappedResponse.getWriter().close();
             }
-        } catch (final Throwable t) {
+        } catch (final Throwable t) { // NOSONAR
             LOGGER.error("Calling the error handler resulted in an error", t);
             LOGGER.error("Original error " + request.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE),
                     (Throwable) request.getAttribute(SlingConstants.ERROR_EXCEPTION));
@@ -668,20 +662,21 @@
 
     // ---------- SCR Integration ----------------------------------------------
 
-    private volatile ServiceTracker tracker;
+    private ServiceTracker<MergingServletResourceProvider, MergingServletResourceProvider> tracker;
     /**
      * Activate this component.
      */
     @Activate
     protected void activate(final BundleContext context, final ResolverConfig config) throws LoginException {
-        this.tracker = new ServiceTracker(context, MergingServletResourceProvider.class, null);
+        this.tracker = new ServiceTracker<>(context, MergingServletResourceProvider.class, null);
         this.tracker.open();
-        this.sharedScriptResolver =
+        this.sharedScriptResolver.set(
                 ScriptResourceResolver.wrap(resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object)SERVICE_USER)),
-                    (Supplier) this.tracker::getService);
+                    this.tracker::getService)
+            );
 
-        this.executionPaths = getExecutionPaths(config.servletresolver_paths());
-        this.defaultExtensions = config.servletresolver_defaultExtensions();
+        this.executionPaths.set(getExecutionPaths(config.servletresolver_paths()));
+        this.defaultExtensions.set(config.servletresolver_defaultExtensions());
 
         // setup default servlet
         this.getDefaultServlet();
@@ -701,20 +696,27 @@
         this.tracker.close();
         this.resolutionCache.flushCache();
         // destroy the fallback error handler servlet
-        if (fallbackErrorServlet != null) {
+        Servlet servlet = fallbackErrorServlet.get();
+        if (servlet != null) {
             try {
-                fallbackErrorServlet.destroy();
-            } catch (Throwable t) {
+                servlet.destroy();
+            } catch (Throwable t) { // NOSONAR
                 // ignore
             } finally {
-                fallbackErrorServlet = null;
+                fallbackErrorServlet.set(null);
             }
         }
 
         if (this.sharedScriptResolver != null) {
-            this.sharedScriptResolver.close();
-            this.sharedScriptResolver = null;
+            ResourceResolver rr = this.sharedScriptResolver.get();
+            if (rr != null) {
+                rr.close();
+            }
+            this.sharedScriptResolver.set(null);
         }
+
+        this.executionPaths.set(null);
+        this.defaultExtensions.set(null);
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java
index 4dfa0f2..d6a77d4 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collection;
-import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -39,12 +38,13 @@
 import org.jetbrains.annotations.NotNull;
 
 public class BundledScriptServlet extends GenericServlet {
-    private final BundledRenderUnit executable;
+    private static final long serialVersionUID = 6320375093932073555L;
+    private final BundledRenderUnit executable; // NOSONAR
     private final String servletInfo;
-    private final Set<ResourceType> types;
+    private final Set<ResourceType> types; // NOSONAR
 
 
-    public BundledScriptServlet(@NotNull LinkedHashSet<TypeProvider> wiredTypeProviders,
+    public BundledScriptServlet(@NotNull Set<TypeProvider> wiredTypeProviders,
                          @NotNull BundledRenderUnit executable) {
         this.executable = executable;
         this.servletInfo = "Script " + executable.getPath();
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
index 0b71ba2..251b9c3 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
@@ -36,6 +36,7 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -55,7 +56,6 @@
 import org.apache.sling.api.request.RequestDispatcherOptions;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.type.ResourceType;
-import org.apache.sling.api.servlets.HttpConstants;
 import org.apache.sling.api.servlets.ServletResolverConstants;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.scripting.spi.bundle.BundledRenderUnit;
@@ -110,27 +110,39 @@
     @Reference
     private ServletMounter mounter;
 
-    private volatile BundleContext m_context;
-    private volatile BundleTracker<List<ServiceRegistration<Servlet>>> m_tracker;
-    private volatile Map<Set<String>, ServiceRegistration<Servlet>> m_dispatchers = new HashMap<>();
+    private AtomicReference<BundleContext> bundleContext = new AtomicReference<>();
+    private AtomicReference<BundleTracker<List<ServiceRegistration<Servlet>>>> tracker = new AtomicReference<>();
+    private AtomicReference<Map<Set<String>, ServiceRegistration<Servlet>>> dispatchers = new AtomicReference<>();
 
     @Activate
     protected void activate(BundleContext context) {
-        m_context = context;
-        m_tracker = new BundleTracker<>(context, Bundle.ACTIVE, this);
-        m_tracker.open();
+        bundleContext.set(context);
+        dispatchers.set(new HashMap<>());
+        BundleTracker<List<ServiceRegistration<Servlet>>> bt = new BundleTracker<>(context, Bundle.ACTIVE, this);
+        tracker.set(bt);
+        bt.open();
     }
 
     @Deactivate
     protected void deactivate() {
-        m_tracker.close();
+        BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.getAndSet(null);
+        if (bt != null) {
+            bt.close();
+        }
+        bundleContext.set(null);
+        dispatchers.set(null);
     }
 
     @Override
     public List<ServiceRegistration<Servlet>> addingBundle(Bundle bundle, BundleEvent event) {
         BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
+        Bundle bcBundle = null;
+        BundleContext bc = bundleContext.get();
+        if (bc != null) {
+            bcBundle = bc.getBundle();
+        }
         if (bundleWiring.getRequiredWires("osgi.extender").stream().map(BundleWire::getProvider).map(BundleRevision::getBundle)
-                .anyMatch(m_context.getBundle()::equals)) {
+                .anyMatch(bcBundle::equals)) {
             LOGGER.debug("Inspecting bundle {} for {} capability.", bundle.getSymbolicName(), NS_SLING_SERVLET);
             List<BundleCapability> capabilities = bundleWiring.getCapabilities(NS_SLING_SERVLET);
             Map<BundleCapability, BundledRenderUnitCapability> cache = new HashMap<>();
@@ -270,7 +282,8 @@
 
     private final AtomicLong idCounter = new AtomicLong(0);
 
-    private ServiceRegistration<Servlet> register(BundleContext context, Servlet servlet, Hashtable<String, Object> properties) {
+    private ServiceRegistration<Servlet> register(BundleContext context, Servlet servlet, 
+            Hashtable<String, Object> properties) { // NOSONAR
         if (mounter.mountProviders()) {
             return context.registerService(Servlet.class, servlet, properties);
         }
@@ -278,6 +291,7 @@
             final Long id = idCounter.getAndIncrement();
             properties.put(Constants.SERVICE_ID, id);
             properties.put(BundledHooks.class.getName(), "true");
+            @SuppressWarnings("unchecked")
             final ServiceReference<Servlet> reference = (ServiceReference<Servlet>) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ServiceReference.class}, new InvocationHandler() {
                 @Override
                 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
@@ -291,7 +305,12 @@
                         return context.getBundle();
                     }
                     else if (method.equals(ServiceReference.class.getMethod("getUsingBundles"))) {
-                        return new Bundle[]{ m_context.getBundle() };
+                        BundleContext bc = bundleContext.get();
+                        if (bc != null) {
+                            return new Bundle[] { bc.getBundle() };
+                        } else {
+                            return new Bundle[0];
+                        }
                     }
                     else if (method.equals(ServiceReference.class.getMethod("isAssignableTo", Bundle.class, String.class))) {
                         return Servlet.class.getName().equals(args[1]);
@@ -313,7 +332,7 @@
                 }
 
                 private int compareTo(Object arg) {
-                    ServiceReference other = (ServiceReference) arg;
+                    ServiceReference<?> other = (ServiceReference<?>) arg;
                     Long id;
                     if ("true".equals(other.getProperty(BundledHooks.class.getName()))) {
                         id = (Long) properties.get(Constants.SERVICE_ID);
@@ -356,7 +375,8 @@
 
             mounter.bindServlet(servlet, reference);
 
-            return (ServiceRegistration<Servlet>) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ServiceRegistration.class}, new InvocationHandler(){
+            @SuppressWarnings("unchecked")
+            ServiceRegistration<Servlet> newProxyInstance = (ServiceRegistration<Servlet>) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ServiceRegistration.class}, new InvocationHandler(){
                 @Override
                 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                     if (method.equals(ServiceRegistration.class.getMethod("getReference"))) {
@@ -370,7 +390,7 @@
                         return null;
                     }
                     else if (method.getName().equals("equals") && Arrays.equals(method.getParameterTypes(), new Class[]{Object.class})) {
-                        return args[0] instanceof ServiceRegistration && reference.compareTo(((ServiceRegistration) args[0]).getReference()) == 0;
+                        return args[0] instanceof ServiceRegistration && reference.compareTo(((ServiceRegistration<?>) args[0]).getReference()) == 0;
                     }
                     else if (method.getName().equals("hashCode") && method.getParameterCount() == 0) {
                         return id.intValue();
@@ -382,16 +402,26 @@
                     }
                 }
             });
+            return newProxyInstance;
         }
     }
 
     private void refreshDispatcher(List<ServiceRegistration<Servlet>> regs) {
-        Map<Set<String>, ServiceRegistration<Servlet>> dispatchers = new HashMap<>();
-        Stream.concat(m_tracker.getTracked().values().stream(), Stream.of(regs)).flatMap(List::stream)
+        BundleContext bc = bundleContext.get();
+        Map<Bundle, List<ServiceRegistration<Servlet>>> tracked;
+        BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.get();
+        if (bt != null) {
+            tracked = bt.getTracked();
+        } else {
+            tracked = Collections.emptyMap();
+        }
+        Map<Set<String>, ServiceRegistration<Servlet>> oldDispatchers = dispatchers.get();
+        Map<Set<String>, ServiceRegistration<Servlet>> newDispatchers = new HashMap<>();
+        Stream.concat(tracked.values().stream(), Stream.of(regs)).flatMap(List::stream)
             .filter(ref -> getResourceTypeVersion(ref.getReference()) != null)
             .map(this::toProperties)
             .collect(Collectors.groupingBy(BundledScriptTracker::getResourceTypes)).forEach((rt, propList) -> {
-            Hashtable<String, Object> properties = new Hashtable<>();
+            Hashtable<String, Object> properties = new Hashtable<>(); // NOSONAR
             properties.put(ServletResolverConstants.SLING_SERVLET_NAME, String.format("%s (%s)", DispatcherServlet.class.getSimpleName(),
                     rt));
             properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, rt.toArray());
@@ -405,7 +435,8 @@
             if (!methods.equals(new HashSet<>(Arrays.asList("GET", "HEAD")))) {
                 properties.put(ServletResolverConstants.SLING_SERVLET_METHODS, methods.toArray(new String[0]));
             }
-            ServiceRegistration<Servlet> reg = m_dispatchers.remove(rt);
+
+            ServiceRegistration<Servlet> reg = oldDispatchers.remove(rt);
             if (reg == null) {
                 Optional<BundleContext> registeringBundle = propList.stream().map(props -> {
                     Bundle bundle = (Bundle) props.get(REGISTERING_BUNDLE);
@@ -421,7 +452,7 @@
                         ServletResolverConstants.SLING_SERVLET_METHODS + "=" + methods  + "}");
                 properties.put(BundledHooks.class.getName(), "true");
 
-                reg = register(registeringBundle.orElse(m_context), new DispatcherServlet(rt), properties);
+                reg = register(registeringBundle.orElse(bc), new DispatcherServlet(rt), properties);
             } else {
                 if (!new HashSet<>(Arrays.asList(PropertiesUtil
                         .toStringArray(reg.getReference().getProperty(ServletResolverConstants.SLING_SERVLET_METHODS), new String[0])))
@@ -429,14 +460,14 @@
                     reg.setProperties(properties);
                 }
             }
-            dispatchers.put(rt, reg);
+            newDispatchers.put(rt, reg);
         });
-        m_dispatchers.values().forEach(ServiceRegistration::unregister);
-        m_dispatchers = dispatchers;
+        oldDispatchers.values().forEach(ServiceRegistration::unregister);
+        dispatchers.set(newDispatchers);
     }
 
-    private Hashtable<String, Object> toProperties(ServiceRegistration<?> reg) {
-        Hashtable<String, Object> result = new Hashtable<>();
+    private Map<String, Object> toProperties(ServiceRegistration<?> reg) {
+        Map<String, Object> result = new HashMap<>();
         ServiceReference<?> ref = reg.getReference();
 
         set(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, ref, result);
@@ -448,7 +479,7 @@
         return result;
     }
 
-    private void set(String key, ServiceReference<?> ref, Hashtable<String, Object> props) {
+    private void set(String key, ServiceReference<?> ref, Map<String, Object> props) {
         Object value = ref.getProperty(key);
         if (value != null) {
             props.put(key, value);
@@ -468,10 +499,11 @@
     }
 
     private class DispatcherServlet extends GenericServlet {
-        private final Set<String> m_rt;
+        private static final long serialVersionUID = -1917128676758775458L;
+        private final Set<String> resourceType;
 
         DispatcherServlet(Set<String> rt) {
-            m_rt = rt;
+            this.resourceType = rt;
         }
 
         @Override
@@ -479,15 +511,25 @@
 
             SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) req;
 
-            Optional<ServiceRegistration<Servlet>> target = m_tracker.getTracked().values().stream().flatMap(List::stream)
+            Map<Bundle, List<ServiceRegistration<Servlet>>> tracked;
+            BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.get();
+            if (bt != null) {
+                tracked = bt.getTracked();
+            } else {
+                tracked = Collections.emptyMap();
+            }
+            BundleContext bc = bundleContext.get();
+            final Bundle bcBundle = bc == null ? null : bc.getBundle();
+
+            Optional<ServiceRegistration<Servlet>> target = tracked.values().stream().flatMap(List::stream)
                     .filter(
-                            reg -> !reg.getReference().getBundle().equals(m_context.getBundle())
+                            reg -> !reg.getReference().getBundle().equals(bcBundle)
                     )
                     .filter(reg -> getResourceTypeVersion(reg.getReference()) != null)
                     .filter(reg ->
                     {
-                        Hashtable<String, Object> props = toProperties(reg);
-                        return getResourceTypes(props).equals(m_rt) &&
+                        Map<String, Object> props = toProperties(reg);
+                        return getResourceTypes(props).equals(resourceType) &&
                                 Arrays.asList(PropertiesUtil
                                         .toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_METHODS),
                                                 new String[]{"GET", "HEAD"}))
@@ -564,7 +606,7 @@
         return null;
     }
 
-    private static Set<String> getResourceTypes(Hashtable<String, Object> props) {
+    private static Set<String> getResourceTypes(Map<String, Object> props) {
         Set<String> resourceTypes = new HashSet<>();
         String[] values = PropertiesUtil.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
         for (String resourceTypeValue : values) {
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java b/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java
index c3ee850..542a3c5 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java
@@ -25,6 +25,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.Servlet;
 import javax.servlet.ServletException;
@@ -75,23 +76,23 @@
     private static final String SERVICE_USER_CONSOLE = "console";
 
     @Reference(target="("+ServiceUserMapped.SUBSERVICENAME+"=" + SERVICE_USER_CONSOLE + ")")
-    private ServiceUserMapped consoleServiceUserMapped;
+    private ServiceUserMapped consoleServiceUserMapped; // NOSONAR
 
     @Reference
-    private ResourceResolverFactory resourceResolverFactory;
+    private ResourceResolverFactory resourceResolverFactory; // NOSONAR
 
     @Reference
-    private ResolutionCache resolutionCache;
+    private ResolutionCache resolutionCache; // NOSONAR
 
     /**
      * The allowed execution paths.
      */
-    private volatile String[] executionPaths;
+    private AtomicReference<String[]> executionPaths = new AtomicReference<>(); // NOSONAR
 
     /**
      * The default extensions
      */
-    private volatile String[] defaultExtensions;
+    private AtomicReference<String[]> defaultExtensions = new AtomicReference<>(); // NOSONAR
 
     /**
      * Activate this component.
@@ -99,8 +100,8 @@
     @Activate
     @Modified
     protected void activate(final ResolverConfig config) {
-        this.executionPaths = SlingServletResolver.getExecutionPaths(config.servletresolver_paths());
-        this.defaultExtensions = config.servletresolver_defaultExtensions();
+        this.executionPaths.set(SlingServletResolver.getExecutionPaths(config.servletresolver_paths()));
+        this.defaultExtensions.set(config.servletresolver_defaultExtensions());
     }
 
     @Override
@@ -169,13 +170,13 @@
                 tdContent(pw);
                 pw.println("<dl>");
                 pw.println("<dt>Path</dt>");
-                pw.print("<dd>");
+                dd(pw);
                 pw.print(ResponseUtil.escapeXml(requestPathInfo.getResourcePath()));
                 pw.print("<br/>");
                 pw.print(CONSOLE_PATH_WARNING);
-                pw.println("</dd>");
+                closeDd(pw);
                 pw.println("<dt>Selectors</dt>");
-                pw.print("<dd>");
+                dd(pw);
                 if (requestPathInfo.getSelectors().length == 0) {
                     pw.print("&lt;none&gt;");
                 } else {
@@ -183,17 +184,17 @@
                     pw.print(ResponseUtil.escapeXml(StringUtils.join(requestPathInfo.getSelectors(), ", ")));
                     pw.print("]");
                 }
-                pw.println("</dd>");
+                closeDd(pw);
                 pw.println("<dt>Extension</dt>");
-                pw.print("<dd>");
+                dd(pw);
                 pw.print(ResponseUtil.escapeXml(requestPathInfo.getExtension()));
-                pw.println("</dd>");
+                closeDd(pw);
                 pw.println("</dl>");
-                pw.println("</dd>");
+                closeDd(pw);
                 pw.println("<dt>Suffix</dt>");
-                pw.print("<dd>");
+                dd(pw);
                 pw.print(ResponseUtil.escapeXml(requestPathInfo.getSuffix()));
-                pw.println("</dd>");
+                closeDd(pw);
                 pw.println("</dl>");
                 closeTd(pw);
                 closeTr(pw);
@@ -208,8 +209,8 @@
                     final ResourceCollector locationUtil = ResourceCollector.create(
                             resource,
                             requestPathInfo.getExtension(),
-                            executionPaths,
-                            defaultExtensions,
+                            executionPaths.get(),
+                            defaultExtensions.get(),
                             method,
                             requestPathInfo.getSelectors());
                     servlets = locationUtil.getServlets(resourceResolver, resolutionCache.getScriptEngineExtensions());
@@ -234,7 +235,7 @@
                     outputServlets(pw, servlets.iterator());
                     pw.println("</ol>");
                 }
-                pw.println("</td>");
+                closeTd(pw);
                 closeTr(pw);
             }
 
@@ -253,6 +254,13 @@
         pw.print("</td>");
     }
 
+    private void dd(final PrintWriter pw) {
+        pw.println("<dd>");
+    }
+    private void closeDd(final PrintWriter pw) {
+        pw.print("</dd>");
+    }
+
     @SuppressWarnings("unused")
     private URL getResource(final String path) {
         if (path.startsWith("/servletresolver/res/ui")) {
@@ -281,7 +289,7 @@
             Resource candidateResource = iterator.next();
             Servlet candidate = candidateResource.adaptTo(Servlet.class);
             if (candidate != null) {
-                final boolean allowed = SlingServletResolver.isPathAllowed(candidateResource.getPath(), this.executionPaths);
+                final boolean allowed = SlingServletResolver.isPathAllowed(candidateResource.getPath(), this.executionPaths.get());
                 pw.print("<li>");
                 if ( !allowed ) {
                     pw.print("<del>");
@@ -333,14 +341,16 @@
             try {
                 fullPath = new URL(urlString).getPath();
             } catch(MalformedURLException ignore) {
+                // ignored
             }
         }
         final int firstDot = fullPath.indexOf(".");
 
         final ResourceMetadata metadata = new ResourceMetadata();
-        final Resource r = new SyntheticResource(null, metadata, null);
+        final Resource r = new SyntheticResource(null, metadata, null); // NOSONAR
         metadata.setResolutionPath(firstDot < 0 ? fullPath : fullPath.substring(0, firstDot));
         metadata.setResolutionPathInfo(firstDot < 0 ? null : fullPath.substring(firstDot));
         return new SlingRequestPathInfo(r);
     }
+
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
index 0d410ef..12044bb 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
@@ -60,7 +60,7 @@
     private static final String HTML_CONTENT_TYPE = "text/html";
 
     /** default log */
-    private final Logger log = LoggerFactory.getLogger(DefaultErrorHandlerServlet.class);
+    private final transient Logger log = LoggerFactory.getLogger(DefaultErrorHandlerServlet.class);
 
     @Override
     public void service(ServletRequest req, ServletResponse res)
@@ -298,7 +298,7 @@
     }
 
     public static String statusToString(int statusCode) {
-        switch (statusCode) {
+        switch (statusCode) { // NOSONAR
             case 100:
                 return "Continue";
             case 101:
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
index 9384957..03c0535 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
@@ -20,7 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -56,7 +55,7 @@
 
     protected final String[] executionPaths;
 
-    public AbstractResourceCollector(final String baseResourceType,
+    protected AbstractResourceCollector(final String baseResourceType,
             final String resourceType,
             final String resourceSuperType,
             final String extension,
@@ -70,34 +69,31 @@
 
     public final Collection<Resource> getServlets(final ResourceResolver resolver, final List<String> scriptExtensions) {
 
-        final SortedSet<WeightedResource> resources = new TreeSet<>(new Comparator<WeightedResource>() {
-            @Override
-            public int compare(WeightedResource o1, WeightedResource o2) {
-                String o1Parent = ResourceUtil.getParent(o1.getPath());
-                String o2Parent = ResourceUtil.getParent(o2.getPath());
-                if (o1Parent != null && o2Parent != null && o1Parent.equals(o2Parent)) {
-                    String o1ScriptName = o1.getName();
-                    String o2ScriptName = o2.getName();
-                    String o1Extension = getScriptExtension(o1ScriptName);
-                    String o2Extension = getScriptExtension(o2ScriptName);
-                    if (StringUtils.isNotEmpty(o1Extension) && StringUtils.isNotEmpty(o2Extension)) {
-                        String o1ScriptWithoutExtension = o1ScriptName.substring(0, o1ScriptName.lastIndexOf("." + o1Extension));
-                        String o2ScriptWithoutExtension = o2ScriptName.substring(0, o2ScriptName.lastIndexOf("." + o2Extension));
-                        if (o1ScriptWithoutExtension.equals(o2ScriptWithoutExtension)) {
-                            int o1ExtensionIndex = scriptExtensions.indexOf(o1Extension);
-                            int o2ExtensionIndex = scriptExtensions.indexOf(o2Extension);
-                            if (o1ExtensionIndex == o2ExtensionIndex || o1ExtensionIndex == -1 || o2ExtensionIndex == -1) {
-                                return o1.compareTo(o2);
-                            } else if (o1ExtensionIndex > o2ExtensionIndex) {
-                                return -1;
-                            } else {
-                                return 1;
-                            }
+        final SortedSet<WeightedResource> resources = new TreeSet<>((o1, o2) -> {
+            String o1Parent = ResourceUtil.getParent(o1.getPath());
+            String o2Parent = ResourceUtil.getParent(o2.getPath());
+            if (o1Parent != null && o2Parent != null && o1Parent.equals(o2Parent)) {
+                String o1ScriptName = o1.getName();
+                String o2ScriptName = o2.getName();
+                String o1Extension = getScriptExtension(o1ScriptName);
+                String o2Extension = getScriptExtension(o2ScriptName);
+                if (StringUtils.isNotEmpty(o1Extension) && StringUtils.isNotEmpty(o2Extension)) {
+                    String o1ScriptWithoutExtension = o1ScriptName.substring(0, o1ScriptName.lastIndexOf("." + o1Extension));
+                    String o2ScriptWithoutExtension = o2ScriptName.substring(0, o2ScriptName.lastIndexOf("." + o2Extension));
+                    if (o1ScriptWithoutExtension.equals(o2ScriptWithoutExtension)) {
+                        int o1ExtensionIndex = scriptExtensions.indexOf(o1Extension);
+                        int o2ExtensionIndex = scriptExtensions.indexOf(o2Extension);
+                        if (o1ExtensionIndex == o2ExtensionIndex || o1ExtensionIndex == -1 || o2ExtensionIndex == -1) {
+                            return o1.compareTo(o2);
+                        } else if (o1ExtensionIndex > o2ExtensionIndex) {
+                            return -1;
+                        } else {
+                            return 1;
                         }
                     }
                 }
-                return o1.compareTo(o2);
             }
+            return o1.compareTo(o2);
         });
         final Iterator<String> locations = new LocationIterator(resourceType, resourceSuperType,
                                                                 baseResourceType, resolver);
@@ -122,7 +118,7 @@
         return result;
     }
 
-    abstract protected void getWeightedResources(final Set<WeightedResource> resources,
+    protected abstract void getWeightedResources(final Set<WeightedResource> resources,
                                                  final Resource location);
 
     /**
@@ -183,13 +179,10 @@
             return true;
         }
         final AbstractResourceCollector o = (AbstractResourceCollector)obj;
-        if ( stringEquals(resourceType, o.resourceType)
+        return stringEquals(resourceType, o.resourceType)
              && stringEquals(resourceSuperType, o.resourceSuperType)
              && stringEquals(extension, o.extension)
-             && stringEquals(baseResourceType, o.baseResourceType)) {
-            return true;
-        }
-        return false;
+             && stringEquals(baseResourceType, o.baseResourceType);
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
index 56e1a2c..f7fdc3c 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
@@ -49,10 +49,6 @@
  */
 public class LocationIterator implements Iterator<String> {
 
-    // The resource for which this iterator is created. This resource
-    // gives the initial resource type and the first resource super type
-    //private final Resource resource;
-
     // The resource resolver used to find resource super types of
     // resource types
     private final ResourceResolver resolver;
@@ -85,7 +81,7 @@
     private String nextLocation;
 
     /** Set of used resource types to detect a circular resource type hierarchy. */
-    private final Set<String> usedResourceTypes = new HashSet<String>();
+    private final Set<String> usedResourceTypes = new HashSet<>();
 
     /**
      * Creates an instance of this iterator starting with a location built from
@@ -103,7 +99,7 @@
         this.baseResourceType = baseResourceType;
 
         String[] tmpPath = resolver.getSearchPath();
-        if (tmpPath == null || tmpPath.length == 0) {
+        if (tmpPath.length == 0) {
             tmpPath = new String[] { "/" };
         }
         searchPath = tmpPath;
@@ -144,6 +140,7 @@
     /**
      * @throws UnsupportedOperationException
      */
+    @Override
     public void remove() {
         throw new UnsupportedOperationException();
     }
@@ -230,7 +227,7 @@
         // get the resource type resource and check its super type
         String resourceSuperType = null;
         // if the path is absolute, use it directly
-        if ( rtPath != null && rtPath.startsWith("/") ) {
+        if ( rtPath.startsWith("/") ) {
             final String candidatePath = rtPath;
 
             final Resource rtResource = resourceResolver.getResource(candidatePath);
@@ -240,8 +237,8 @@
 
         } else {
             // if the path is relative we use the search paths
-            for(final String searchPath : this.searchPath) {
-                final String candidatePath = searchPath + rtPath;
+            for (final String path : this.searchPath) {
+                final String candidatePath = path + rtPath;
                 final Resource rtResource = resourceResolver.getResource(candidatePath);
                 if ( rtResource != null && rtResource.getResourceSuperType() != null ) {
                     resourceSuperType = rtResource.getResourceSuperType();
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
index 0ed8a9b..c39e86a 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
@@ -114,36 +114,44 @@
         while (children.hasNext()) {
             final Resource child = children.next();
 
-            if ( !SlingServletResolver.isPathAllowed(child.getPath(), this.executionPaths) ) {
-                continue;
-            }
-            final String currentScriptName = child.getName();
-            final int lastDot = currentScriptName.lastIndexOf('.');
-            if (lastDot < 0) {
-                // no extension in the name, this is not a script
-                continue;
-            }
+            if ( SlingServletResolver.isPathAllowed(child.getPath(), this.executionPaths) ) {
+                final String currentScriptName = child.getName();
+                final int lastDot = currentScriptName.lastIndexOf('.');
+                if (lastDot < 0) {
+                    // no extension in the name, this is not a script
+                    continue;
+                }
 
-            if ( currentScriptName.substring(0, lastDot).equals(name) ) {
-                this.addWeightedResource(resources, child, 0, WeightedResource.WEIGHT_PREFIX);
+                if ( currentScriptName.substring(0, lastDot).equals(name) ) {
+                    this.addWeightedResource(resources, child, 0, WeightedResource.WEIGHT_PREFIX);
+                }
             }
         }
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if ( !(obj instanceof NamedScriptResourceCollector) ) {
-            return false;
-        }
-        if ( obj == this ) {
-            return true;
-        }
-        if ( super.equals(obj) ) {
-            final NamedScriptResourceCollector o = (NamedScriptResourceCollector)obj;
-            if ( stringEquals(scriptName, o.scriptName)) {
-                return true;
-            }
-        }
-        return false;
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((scriptName == null) ? 0 : scriptName.hashCode());
+        return result;
     }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        NamedScriptResourceCollector other = (NamedScriptResourceCollector) obj;
+        if (scriptName == null) {
+            if (other.scriptName != null)
+                return false;
+        } else if (!scriptName.equals(other.scriptName))
+            return false;
+        return true;
+    }
+
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
index 4ff7104..6a10661 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.servlets.resolver.internal.helper;
 
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Set;
 
@@ -225,7 +226,7 @@
                     : null;
 
             Iterator<Resource> children = resolver.listChildren(current);
-            while (children.hasNext()) {
+            while (children.hasNext()) { // NOSONAR
                 Resource child = children.next();
 
                 if (!SlingServletResolver.isPathAllowed(child.getPath(), this.executionPaths)) {
@@ -265,7 +266,6 @@
                 if (scriptName.equals(methodName)) {
                     addWeightedResource(resources, child, selIdx,
                         WeightedResource.WEIGHT_NONE);
-                    continue;
                 }
             }
 
@@ -325,7 +325,7 @@
             return true;
         }
 
-        if (scriptName.equals(suffix.substring(1))) {
+        if (suffix != null && !suffix.isEmpty() && scriptName.equals(suffix.substring(1))) {
             addWeightedResource(resources, child, selIdx,
                 WeightedResource.WEIGHT_EXTENSION + ((htmlSuffix != null) ? WeightedResource.WEIGHT_METHOD : WeightedResource.WEIGHT_NONE));
             return true;
@@ -375,28 +375,38 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof ResourceCollector)) {
-            return false;
-        }
-        if (obj == this) {
-            return true;
-        }
-        if (super.equals(obj)) {
-            final ResourceCollector o = (ResourceCollector) obj;
-            if (isGet == o.isGet && isDefaultExtension == o.isDefaultExtension
-                && numRequestSelectors == o.numRequestSelectors
-                && stringEquals(methodName, o.methodName)) {
-                // now compare selectors
-                for (int i = 0; i < numRequestSelectors; i++) {
-                    if (!stringEquals(requestSelectors[i],
-                        o.requestSelectors[i])) {
-                        return false;
-                    }
-                }
-                return true;
-            }
-        }
-        return false;
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + (isDefaultExtension ? 1231 : 1237);
+        result = prime * result + (isGet ? 1231 : 1237);
+        result = prime * result + ((methodName == null) ? 0 : methodName.hashCode());
+        result = prime * result + numRequestSelectors;
+        result = prime * result + Arrays.hashCode(requestSelectors);
+        return result;
     }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ResourceCollector other = (ResourceCollector) obj;
+        if (isDefaultExtension != other.isDefaultExtension)
+            return false;
+        if (isGet != other.isGet)
+            return false;
+        if (methodName == null) {
+            if (other.methodName != null)
+                return false;
+        } else if (!methodName.equals(other.methodName))
+            return false;
+        if (numRequestSelectors != other.numRequestSelectors)
+            return false;
+        return Arrays.equals(requestSelectors, other.requestSelectors);
+    }
+
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
index a93a3e7..e84c6eb 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
@@ -89,36 +89,36 @@
         this.methodPrefixWeight = methodPrefixWeight;
     }
 
-    final public int getOrdinal() {
+    public final int getOrdinal() {
         return ordinal;
     }
 
-    final public int getNumSelectors() {
+    public final int getNumSelectors() {
         return numSelectors;
     }
 
-    final public int getMethodPrefixWeight() {
+    public final int getMethodPrefixWeight() {
         return methodPrefixWeight;
     }
 
     @Override
-    final public int hashCode() {
+    public final int hashCode() {
         return ordinal;
     }
 
     @Override
-    final public boolean equals(Object obj) {
+    public final boolean equals(Object obj) {
         return obj == this;
     }
 
     @Override
-    final public String toString() {
+    public final String toString() {
         return getClass().getSimpleName() + "[" + getOrdinal() + "]: "
             + getResource() + ", #selectors=" + getNumSelectors()
             + ", methodPrefixWeight=" + getMethodPrefixWeight();
     }
 
-    final public int compareTo(WeightedResource o) {
+    public final int compareTo(WeightedResource o) {
         if (equals(o)) {
             return 0;
         }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java
index f954f6b..5ae49b5 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
@@ -32,7 +33,6 @@
 import javax.script.ScriptEngineManager;
 import javax.servlet.Servlet;
 
-import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.observation.ExternalResourceChangeListener;
 import org.apache.sling.api.resource.observation.ResourceChange;
 import org.apache.sling.api.resource.observation.ResourceChangeListener;
@@ -68,10 +68,10 @@
     @Reference
     private ScriptEngineManager scriptEngineManager;
 
-    private volatile List<String> scriptEnginesExtensions = Collections.emptyList();
+    private AtomicReference<List<String>> scriptEnginesExtensions = new AtomicReference<>(Collections.emptyList());
 
     /** The script resolution cache. */
-    private volatile Map<AbstractResourceCollector, Servlet> cache;
+    private AtomicReference<Map<AbstractResourceCollector, Servlet>> cache = new AtomicReference<>();
 
     /** The cache size. */
     private volatile int cacheSize;
@@ -80,39 +80,39 @@
     private volatile boolean logCacheSizeWarning;
 
     /** Registration as event handler. */
-    private volatile ServiceRegistration<EventHandler> eventHandlerRegistration;
+    private AtomicReference<ServiceRegistration<EventHandler>> eventHandlerRegistration = new AtomicReference<>();
 
-    private volatile ServiceRegistration<ResourceChangeListener> resourceListenerRegistration;
+    private AtomicReference<ServiceRegistration<ResourceChangeListener>> resourceListenerRegistration = new AtomicReference<>();
 
-    private volatile ServiceRegistration<SlingServletResolverCacheMBean> mbeanRegistration;
+    private AtomicReference<ServiceRegistration<SlingServletResolverCacheMBean>> mbeanRegistration = new AtomicReference<>();
 
     /**
      * Activate this component.
      */
     @Activate
     protected void activate(final BundleContext context,
-            final ResolverConfig config) throws LoginException {
+            final ResolverConfig config) {
         // create cache - if a cache size is configured
         this.cacheSize = config.servletresolver_cacheSize();
         if (this.cacheSize > 5) {
-            this.cache = new ConcurrentHashMap<>(cacheSize);
+            this.cache.set(new ConcurrentHashMap<>(cacheSize));
             this.logCacheSizeWarning = true;
 
             // register MBean
             try {
-                Dictionary<String, String> mbeanProps = new Hashtable<>();
+                Dictionary<String, String> mbeanProps = new Hashtable<>(); // NOSONAR
                 mbeanProps.put("jmx.objectname", "org.apache.sling:type=servletResolver,service=SlingServletResolverCache");
 
                 ServletResolverCacheMBeanImpl mbean = new ServletResolverCacheMBeanImpl();
-                mbeanRegistration = context.registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps);
-            } catch (final Throwable t) {
+                mbeanRegistration.set(context.registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps));
+            } catch (final Throwable t) { // NOSONAR
                 logger.warn("Unable to register servlets resolver cache MBean", t);
             }
         }
 
         // and finally register as event listener
         // to invalidate cache and script extensions
-        final Dictionary<String, Object> props = new Hashtable<>();
+        final Dictionary<String, Object> props = new Hashtable<>(); // NOSONAR
         props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Servlet Resolver Event Handler");
         props.put(Constants.SERVICE_VENDOR,"The Apache Software Foundation");
 
@@ -122,7 +122,7 @@
                 "org/apache/sling/api/adapter/AdapterFactory/*",
                 "org/apache/sling/scripting/core/BindingsValuesProvider/*" });
 
-        this.eventHandlerRegistration = context.registerService(EventHandler.class, this, props);
+        this.eventHandlerRegistration.set(context.registerService(EventHandler.class, this, props));
 
         // we need a resource change listener to invalidate the cache
         if ( this.cache != null ) {
@@ -132,11 +132,11 @@
                 listenerPaths[i] = p.getPath();
             }
 
-            final Dictionary<String, Object> listenerProps = new Hashtable<>();
+            final Dictionary<String, Object> listenerProps = new Hashtable<>(); // NOSONAR
             listenerProps.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Servlet Resolver Resource Listener");
             listenerProps.put(Constants.SERVICE_VENDOR,"The Apache Software Foundation");
             listenerProps.put(ResourceChangeListener.PATHS, listenerPaths);
-            this.resourceListenerRegistration = context.registerService(ResourceChangeListener.class, this, listenerProps);
+            this.resourceListenerRegistration.set(context.registerService(ResourceChangeListener.class, this, listenerProps));
         }
 
         updateScriptEngineExtensions();
@@ -144,7 +144,7 @@
 
     @Modified
     protected void modified(final BundleContext context,
-            final ResolverConfig config) throws LoginException {
+            final ResolverConfig config) {
         this.deactivate();
         this.activate(context, config);
     }
@@ -157,21 +157,24 @@
         this.cache = null;
 
         // unregister mbean
-        if ( this.mbeanRegistration != null ) {
-            this.mbeanRegistration.unregister();
-            this.mbeanRegistration = null;
+        ServiceRegistration<SlingServletResolverCacheMBean> mbRegistration = this.mbeanRegistration.get();
+        if ( mbRegistration != null ) {
+            mbRegistration.unregister();
+            this.mbeanRegistration.set(null);
         }
 
         // unregister event handler
-        if (this.eventHandlerRegistration != null) {
-            this.eventHandlerRegistration.unregister();
-            this.eventHandlerRegistration = null;
+        ServiceRegistration<EventHandler> ehRegistration = this.eventHandlerRegistration.get();
+        if (ehRegistration != null) {
+            ehRegistration.unregister();
+            this.eventHandlerRegistration.set(null);
         }
 
         // unregister event handler
-        if (this.resourceListenerRegistration != null) {
-            this.resourceListenerRegistration.unregister();
-            this.resourceListenerRegistration = null;
+        ServiceRegistration<ResourceChangeListener> rlRegistration = this.resourceListenerRegistration.get();
+        if (rlRegistration != null) {
+            rlRegistration.unregister();
+            this.resourceListenerRegistration.set(null);
         }
     }
 
@@ -180,18 +183,18 @@
      * @return The list of script engine extensions
      */
     public List<String> getScriptEngineExtensions() {
-        return this.scriptEnginesExtensions;
+        return this.scriptEnginesExtensions.get();
     }
 
     private void updateScriptEngineExtensions() {
         final ScriptEngineManager localScriptEngineManager = scriptEngineManager;
         // use local variable to avoid racing with deactivate
         if ( localScriptEngineManager != null ) {
-            final List<String> scriptEnginesExtensions = new ArrayList<>();
+            final List<String> newScriptEnginesExtensions = new ArrayList<>();
             for (ScriptEngineFactory factory : localScriptEngineManager.getEngineFactories()) {
-                scriptEnginesExtensions.addAll(factory.getExtensions());
+                newScriptEnginesExtensions.addAll(factory.getExtensions());
             }
-            this.scriptEnginesExtensions = Collections.unmodifiableList(scriptEnginesExtensions);
+            this.scriptEnginesExtensions.set(Collections.unmodifiableList(newScriptEnginesExtensions));
         }
     }
 
@@ -210,7 +213,7 @@
 
     public void flushCache() {
         // use local variable to avoid racing with deactivate
-        final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
+        final Map<AbstractResourceCollector, Servlet> localCache = this.cache.get();
         if ( localCache != null ) {
             localCache.clear();
             this.logCacheSizeWarning = true;
@@ -236,7 +239,7 @@
         @Override
         public int getCacheSize() {
             // use local variable to avoid racing with deactivate
-            final Map<AbstractResourceCollector, Servlet> localCache = cache;
+            final Map<AbstractResourceCollector, Servlet> localCache = cache.get();
             return localCache != null ? localCache.size() : 0;
         }
 
@@ -253,7 +256,7 @@
     }
 
     public Servlet get(final AbstractResourceCollector context) {
-        final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
+        final Map<AbstractResourceCollector, Servlet> localCache = this.cache.get();
         if ( localCache != null ) {
             return localCache.get(context);
         }
@@ -261,7 +264,7 @@
     }
 
     public void put(final AbstractResourceCollector context, final Servlet candidate) {
-        final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
+        final Map<AbstractResourceCollector, Servlet> localCache = this.cache.get();
         if ( localCache != null ) {
             if ( localCache.size() < this.cacheSize ) {
                 localCache.put(context, candidate);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
index df8ccb4..8f2dcf9 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
@@ -35,6 +35,7 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.spi.resource.provider.ResolveContext;
+import org.apache.sling.spi.resource.provider.ResourceContext;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
@@ -52,7 +53,7 @@
         index(localTree, localProvs, Arrays.asList(registrations.get(registrations.size() - 1)));
     }
 
-    synchronized boolean remove(ServletResourceProvider provider, ServiceReference<?> reference) {
+    synchronized boolean remove(ServletResourceProvider provider) {
         boolean found = false;
         for (Iterator<Pair<ServletResourceProvider, ServiceReference<?>>> regIter = registrations.iterator(); regIter.hasNext(); ) {
             Pair<ServletResourceProvider, ServiceReference<?>> reg = regIter.next();
@@ -87,17 +88,16 @@
     private void index(ConcurrentHashMap<String, Set<String>> tree, ConcurrentHashMap<String, Pair<ServletResourceProvider, ServiceReference<?>>> providers, List<Pair<ServletResourceProvider, ServiceReference<?>>> registrations) {
         for (Pair<ServletResourceProvider, ServiceReference<?>> reference : registrations) {
             for (String path : reference.getLeft().getServletPaths()) {
-                String current = "";
+                StringBuilder currentBuilder = new StringBuilder();
                 for (String part : path.split("/")) {
-                    Set<String> childs = tree.get(current);
-                    if (childs == null) {
-                        childs = Collections.synchronizedSet(new LinkedHashSet<>());
-                        tree.put(current, childs);
-                    }
-                    current += "/" + part;
-                    current = current.trim().replace("//", "/");
+                    Set<String> childs = tree.computeIfAbsent(currentBuilder.toString(), k -> Collections.synchronizedSet(new LinkedHashSet<>()));
+                    currentBuilder.append("/").append(part);
+                    String cleanedCurrent = currentBuilder.toString().trim().replace("//", "/");
+                    // replace the buffer with the cleaned string
+                    currentBuilder.setLength(0);
+                    currentBuilder.append(cleanedCurrent);
 
-                    childs.add(current);
+                    childs.add(currentBuilder.toString());
                 }
 
                 Pair<ServletResourceProvider, ServiceReference<?>> old = providers.get(path);
@@ -126,11 +126,12 @@
         }
     }
 
-    public Resource getResource(ResolveContext resolveContext, String path) {
+    @SuppressWarnings("unchecked")
+    public Resource getResource(@SuppressWarnings("rawtypes") ResolveContext resolveContext, String path) {
         Resource wrapped = null;
-        final ResourceProvider parentProvider = resolveContext.getParentResourceProvider();
+        final ResourceProvider<?> parentProvider = resolveContext.getParentResourceProvider();
         if (parentProvider != null) {
-            wrapped = parentProvider.getResource(resolveContext.getParentResolveContext(), path, null, null);
+            wrapped = parentProvider.getResource(resolveContext.getParentResolveContext(), path, ResourceContext.EMPTY_CONTEXT, null);
         }
         Resource result;
         Pair<ServletResourceProvider, ServiceReference<?>> provider = providers.get().get(path);
@@ -157,10 +158,11 @@
         return result;
     }
 
-    public Iterator<Resource> listChildren(final ResolveContext ctx, final Resource parent) {
+    @SuppressWarnings("unchecked")
+    public Iterator<Resource> listChildren(@SuppressWarnings("rawtypes") final ResolveContext ctx, final Resource parent) {
         Map<String, Resource> result = new LinkedHashMap<>();
 
-        final ResourceProvider parentProvider = ctx.getParentResourceProvider();
+        final ResourceProvider<?> parentProvider = ctx.getParentResourceProvider();
         if (parentProvider != null) {
             for (Iterator<Resource> iter = parentProvider.listChildren(ctx.getParentResolveContext(), parent); iter != null && iter.hasNext(); ) {
                 Resource resource = iter.next();
@@ -181,9 +183,9 @@
                             ((ServletResource) resource).setWrappedResource(wrapped);
                         }
                     }
-                }
-                else if (!result.containsKey(path)) {
-                    result.put(path, new SyntheticResource(ctx.getResourceResolver(), path, ResourceProvider.RESOURCE_TYPE_SYNTHETIC));
+                } else {
+                    result.computeIfAbsent(path, key -> new SyntheticResource(ctx.getResourceResolver(), key, 
+                            ResourceProvider.RESOURCE_TYPE_SYNTHETIC));
                 }
             }
         }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
index 873d670..f7c9ba0 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
@@ -181,8 +181,8 @@
         final String name = getName(reference);
 
         // check for Sling properties in the service registration
-        final ServletResourceProvider provider = servletResourceProviderFactory.create(reference, servlet);
-        if (provider == null) {
+        final ServletResourceProvider srProvider = servletResourceProviderFactory.create(reference, servlet);
+        if (srProvider == null) {
             // this is expected if the servlet is not destined for Sling
             return false;
         }
@@ -194,7 +194,7 @@
         } catch (final ServletException ce) {
             logger.error("bindServlet: Servlet " + ServletResourceProviderFactory.getServiceReferenceInfo(reference) + " failed to initialize", ce);
             return false;
-        } catch (final Throwable t) {
+        } catch (final Throwable t) { // NOSONAR
             logger.error("bindServlet: Unexpected problem initializing servlet " + ServletResourceProviderFactory.getServiceReferenceInfo(reference), t);
             return false;
         }
@@ -207,14 +207,14 @@
                 final List<ServiceRegistration<ResourceProvider<Object>>> regs = new ArrayList<>();
                 try {
                     if (this.provider != null) {
-                        this.provider.add(provider, reference);
+                        this.provider.add(srProvider, reference);
                         resolutionCaches.values().forEach(ResolutionCache::flushCache);
                     }
                     else {
-                        for (final String root : provider.getServletPaths()) {
+                        for (final String root : srProvider.getServletPaths()) {
                             @SuppressWarnings("unchecked") final ServiceRegistration<ResourceProvider<Object>> reg = (ServiceRegistration<ResourceProvider<Object>>) bundleContext.registerService(
                                 ResourceProvider.class.getName(),
-                                provider,
+                                srProvider,
                                 createServiceProperties(reference, root));
                             regs.add(reg);
                         }
@@ -225,10 +225,10 @@
                 }
                 if ( registered ) {
                     if ( logger.isDebugEnabled() ) {
-                        logger.debug("Registered {}", provider);
+                        logger.debug("Registered {}", srProvider);
                     }
                     synchronized (this.servletsByReference) {
-                        servletsByReference.put(reference, new ServletReg(servlet, regs, provider));
+                        servletsByReference.put(reference, new ServletReg(servlet, regs, srProvider));
                     }
                 }
             }
@@ -243,7 +243,7 @@
     private Dictionary<String, Object> createServiceProperties(final ServiceReference<Servlet> reference,
             final String root) {
 
-        final Dictionary<String, Object> params = new Hashtable<>();
+        final Dictionary<String, Object> params = new Hashtable<>(); // NOSONAR
         params.put(ResourceProvider.PROPERTY_ROOT, root);
         params.put(Constants.SERVICE_DESCRIPTION,
             "ServletResourceProvider for Servlet at " + root);
@@ -277,17 +277,16 @@
                     // this might happen on shutdown
                 }
             }
-            if (registration.provider != null && provider != null) {
-                if (provider.remove(registration.provider, reference)) {
-                    resolutionCaches.values().forEach(ResolutionCache::flushCache);
-                }
+            if (registration.provider != null && provider != null &&
+                    provider.remove(registration.provider)) {
+                resolutionCaches.values().forEach(ResolutionCache::flushCache);
             }
             final String name = RequestUtil.getServletName(registration.servlet);
             logger.debug("unbindServlet: Servlet {} removed", name);
 
             try {
                 registration.servlet.destroy();
-            } catch (Throwable t) {
+            } catch (Throwable t) { // NOSONAR
                 logger.error("unbindServlet: Unexpected problem destroying servlet " + name, t);
             }
         }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
index 19884d5..5d61cd1 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
@@ -21,6 +21,7 @@
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.Servlet;
 
@@ -49,7 +50,7 @@
 
     private final ResourceMetadata metadata;
 
-    private volatile Resource wrapped;
+    private AtomicReference<Resource> wrapped = new AtomicReference<>();
 
     public ServletResource(ResourceResolver resourceResolver, Servlet servlet, String path) {
         this(resourceResolver, servlet, path, null);
@@ -70,7 +71,7 @@
 
     void setWrappedResource(Resource wrapped) {
         if (wrapped != null && !RESOURCE_TYPE_NON_EXISTING.equals(wrapped.getResourceType())) {
-            this.wrapped = wrapped;
+            this.wrapped.set(wrapped);
         }
     }
 
@@ -117,24 +118,24 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-        Resource wrapped = this.wrapped;
+    public <T> T adaptTo(Class<T> type) {
+        Resource wrappedResource = this.wrapped.get();
         if (type == Servlet.class && servlet != null) {
-            return (AdapterType) servlet; // unchecked cast
+            return (T) servlet; // unchecked cast
         }
         if (type == InputStream.class && servlet instanceof BundledScriptServlet) {
             InputStream result = ((BundledScriptServlet) servlet).getInputStream();
             if (result != null) {
-                return (AdapterType) result;
+                return (T) result;
             }
         }
 
         if (type == BundledRenderUnit.class && servlet instanceof BundledScriptServlet) {
-            return (AdapterType) ((BundledScriptServlet) servlet).getBundledRenderUnit();
+            return (T) ((BundledScriptServlet) servlet).getBundledRenderUnit();
         }
 
-        if (wrapped != null) {
-            AdapterType result = wrapped.adaptTo(type);
+        if (wrappedResource != null) {
+            T result = wrappedResource.adaptTo(type);
             if (result != null) {
                 return result;
             }
@@ -149,7 +150,7 @@
                 props.put("servletClass", this.servlet.getClass().getName());
             }
 
-            return (AdapterType) new ValueMapDecorator(props); // unchecked cast
+            return (T) new ValueMapDecorator(props); // unchecked cast
         }
 
         return super.adaptTo(type);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
index a7881d4..169066f 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
@@ -372,7 +372,6 @@
                 }
                 sb.append("component=");
                 sb.append(componentName);
-                needsComma = true;
             }
             sb.append(")");
         }
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java
index 0e4bd23..c802238 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java
@@ -92,6 +92,7 @@
         void assertAccept(boolean expected) {
 
             // Stub the ServiceReference with our service properties
+            @SuppressWarnings("unchecked")
             final ServiceReference<Servlet> reference = mock(ServiceReference.class);
             final String [] keys = Collections.list(serviceProperties.keys()).toArray(STRING_ARRAY);
             when(reference.getPropertyKeys()).thenReturn(keys);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java
index 1448856..2d3713f 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java
@@ -18,6 +18,11 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.servlets.resolver.internal;
 
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import javax.servlet.Servlet;
 
 import org.apache.sling.api.adapter.AdapterManager;
@@ -29,12 +34,6 @@
 import org.apache.sling.servlets.resolver.internal.resource.ServletResource;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
 public class ScriptResourceTest {
 
     @Test
@@ -55,7 +54,7 @@
         ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
 
         AdapterManager adapterManager = mock(AdapterManager.class);
-        when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(mock(Servlet.class));
+        when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(mock(Servlet.class));
         SlingAdaptable.setAdapterManager(adapterManager);
 
         Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -81,7 +80,7 @@
         ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
 
         AdapterManager adapterManager = mock(AdapterManager.class);
-        when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(mock(Servlet.class));
+        when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(mock(Servlet.class));
         SlingAdaptable.setAdapterManager(adapterManager);
 
         Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -107,7 +106,7 @@
         ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
 
         AdapterManager adapterManager = mock(AdapterManager.class);
-        when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(mock(Servlet.class));
+        when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(mock(Servlet.class));
         SlingAdaptable.setAdapterManager(adapterManager);
 
         Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -131,7 +130,7 @@
         ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
 
         AdapterManager adapterManager = mock(AdapterManager.class);
-        when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(servlet);
+        when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(servlet);
         SlingAdaptable.setAdapterManager(adapterManager);
 
         Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -155,7 +154,7 @@
         ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
 
         AdapterManager adapterManager = mock(AdapterManager.class);
-        when(adapterManager.getAdapter(eq(scriptResource), eq(SlingScript.class))).thenReturn(script);
+        when(adapterManager.getAdapter(scriptResource, SlingScript.class)).thenReturn(script);
         SlingAdaptable.setAdapterManager(adapterManager);
 
         SlingScript adaptedScript = scriptResource.adaptTo(SlingScript.class);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
index aab277b..31bc1e6 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
@@ -18,8 +18,8 @@
  */
 package org.apache.sling.servlets.resolver.internal;
 
-import static junit.framework.TestCase.assertTrue;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,7 +34,6 @@
 import org.apache.sling.api.servlets.ServletResolverConstants;
 import org.apache.sling.commons.testing.osgi.MockServiceReference;
 import org.apache.sling.commons.testing.sling.MockResource;
-import org.apache.sling.commons.testing.sling.MockResourceResolver;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
 import org.apache.sling.servlets.resolver.internal.resource.MockServletResource;
 import org.junit.Test;
@@ -90,8 +89,8 @@
         insecureRequest.setResourceResolver(mockResourceResolver);
         insecureRequest.setSecure(false);
         Servlet result = servletResolver.resolveServlet(insecureRequest);
-        assertTrue("Expecting a different servlet than our own",
-            result.getClass() != SecureRequestsOptingServlet.class);
+        assertNotSame("Expecting a different servlet than our own",
+            result.getClass(), SecureRequestsOptingServlet.class);
     }
 
     @SuppressWarnings("serial")
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java
index 1b2f8ee..1795134 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java
@@ -18,6 +18,9 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.servlets.resolver.internal.bundle;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -25,7 +28,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.sling.servlets.resolver.internal.bundle.BundledHooks;
 import org.junit.Assert;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
@@ -33,8 +35,6 @@
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.hooks.service.ListenerHook;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 public class BundledHooksTest {
     @Test
@@ -75,6 +75,7 @@
         Assert.assertEquals(1, services.size());
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testEventHookFiltersOther() {
         BundledHooks hooks = new BundledHooks();
@@ -83,6 +84,7 @@
 
         BundleContext context = mock(BundleContext.class);
         Bundle bundle = mock(Bundle.class);
+        @SuppressWarnings("rawtypes")
         ServiceReference ref = mock(ServiceReference.class);
 
         when(event.getServiceReference()).thenReturn(ref);
@@ -101,6 +103,7 @@
         Assert.assertTrue(listeners.isEmpty());
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testEventHookDoesNotFilterResolver() {
         BundledHooks hooks = new BundledHooks();
@@ -109,6 +112,7 @@
 
         BundleContext context = mock(BundleContext.class);
         Bundle bundle = mock(Bundle.class);
+        @SuppressWarnings("rawtypes")
         ServiceReference ref = mock(ServiceReference.class);
 
         when(event.getServiceReference()).thenReturn(ref);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java
index 198d04c..13e19c8 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java
@@ -18,21 +18,20 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.servlets.resolver.internal.bundle;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
 import java.util.ArrayList;
 import java.util.List;
 
 import javax.servlet.Servlet;
 
-import org.apache.sling.servlets.resolver.internal.bundle.BundledScriptTracker;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.ServiceRegistration;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
 public class BundledScriptTrackerTest {
 
     @Test
@@ -40,6 +39,7 @@
         BundledScriptTracker tracker = new BundledScriptTracker();
         tracker.activate(mock(BundleContext.class));
         List<ServiceRegistration<Servlet>> registrations = new ArrayList<>();
+        @SuppressWarnings("unchecked")
         ServiceRegistration<Servlet> registration = mock(ServiceRegistration.class);
         registrations.add(registration);
         tracker.removedBundle(mock(Bundle.class), mock(BundleEvent.class), registrations);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
index 317f0ce..faf664c 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
@@ -19,7 +19,6 @@
 package org.apache.sling.servlets.resolver.internal.helper;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -177,7 +176,9 @@
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
         int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
 
-        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+            private static final long serialVersionUID = -2278401285444759128L;
+        {
             add("esp");
             add("js");
             add("jsp");
@@ -208,7 +209,9 @@
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
         int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
 
-        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+            private static final long serialVersionUID = 4918721764309621104L;
+        {
             add("esp");
             add("js");
         }});
@@ -237,7 +240,9 @@
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
         int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
 
-        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+            private static final long serialVersionUID = 1527098044127506711L;
+        {
             add("esp");
             add("js");
         }});
@@ -384,7 +389,9 @@
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
         int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
 
-        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+        effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+            private static final long serialVersionUID = 3909592432283252117L;
+        {
             add("esp");
             add("js");
             add("jsp");
@@ -416,7 +423,7 @@
         if (scriptEngineExtensions != null) {
             res = lu.getServlets(request.getResourceResolver(), scriptEngineExtensions);
         } else {
-            res = lu.getServlets(request.getResourceResolver(), Collections.EMPTY_LIST);
+            res = lu.getServlets(request.getResourceResolver(), Collections.emptyList());
         }
         Iterator<Resource> rIter = res.iterator();
 
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java
index 81a7f23..674b41e 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java
@@ -80,7 +80,7 @@
                 ResourceResolver.PROPERTY_RESOURCE_TYPE, "test");
 
         // /content/test.html (sling:resourceType=test) --> /apps/test/test.html
-        assertScript(contentResource, "GET", null, "html", Collections.EMPTY_LIST,
+        assertScript(contentResource, "GET", null, "html", Collections.emptyList(),
                 "/apps/test/test.html",
                 "/libs/test/test.jsp"
         );
@@ -96,7 +96,7 @@
                 JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
                 ResourceResolver.PROPERTY_RESOURCE_TYPE, "test2");
         // /content/test.html (sling:resourceType=test2) --> /apps/test2/test2.jsp
-        assertScript(contentResource, "GET", null, "html", Collections.EMPTY_LIST,
+        assertScript(contentResource, "GET", null, "html", Collections.emptyList(),
                 "/apps/test2/test2.jsp",
                 "/apps/test/test.html",
                 "/libs/test/test.jsp"
@@ -147,7 +147,7 @@
         );
 
         // /content/test.sel.html (sling:resourceType=test2) --> /apps/test/sel.html
-        assertScript(contentResource, "GET", "sel", "html", Collections.EMPTY_LIST,
+        assertScript(contentResource, "GET", "sel", "html", Collections.emptyList(),
                 "/apps/test/sel.html",
                 "/libs/test/sel.jsp",
                 "/apps/test2/test2.jsp",
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
index d084127..6017c9d 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
@@ -70,7 +70,7 @@
         // Create mock request and get scripts from ResourceCollector
         final MockSlingHttpServletRequest req = makeRequest(method, selectors, extension);
         final ResourceCollector u = ResourceCollector.create(req, null, new String[] {"html"});
-        final Collection<Resource> s = u.getServlets(req.getResourceResolver(), Collections.EMPTY_LIST);
+        final Collection<Resource> s = u.getServlets(req.getResourceResolver(), Collections.emptyList());
 
         if(expectedScript == null) {
             assertFalse("No script must be found", s.iterator().hasNext());
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
index db50e84..d40928f 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.servlets.resolver.internal.helper;
 
+import static org.junit.Assert.assertNotEquals;
+
 import junit.framework.TestCase;
 
 public class WeightedResourceTest extends TestCase {
@@ -27,13 +29,13 @@
         WeightedResource lr2 = new WeightedResource(0, null, 0, WeightedResource.WEIGHT_NONE);
         
         // expect same objects to be equal
-        assertTrue(lr1.equals(lr1));
+        assertEquals(lr1, lr1);
         
         // expect different instances to not be equal
-        assertFalse(lr1.equals(lr2));
-        assertFalse(lr2.equals(lr1));
-        assertFalse(lr1.equals(null));
-        assertFalse(lr2.equals(null));
+        assertNotEquals(lr1, lr2);
+        assertNotEquals(lr2, lr1);
+        assertNotNull(lr1);
+        assertNotNull(lr2);
     }
     
     public void testCompareToSelectors() {
diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java
index 13d8f30..1c477ad 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java
@@ -57,6 +57,7 @@
     @Inject
     protected BundleContext bundleContext;
 
+    @SuppressWarnings("unused")
     @Inject
     private SlingRequestProcessor slingRequestProcessor;