diff --git a/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java b/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
index ce6b8f1..fa7024a 100644
--- a/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
+++ b/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
@@ -21,7 +21,7 @@
 import java.io.IOException;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -77,7 +77,7 @@
      * The list of references - we don't need to synchronize this as we are
      * running in one single request.
      */
-    protected List<ServiceReference> references;
+    protected List<ServiceReference<?>> references;
 
     /** A map of found services. */
     protected Map<String, Object> services;
@@ -192,6 +192,7 @@
 
     /**
      * @see org.apache.sling.api.scripting.SlingScriptHelper#dispose()
+     * @deprecated This method is deprecated and should never be called by clients!
      */
     @Deprecated
     public void dispose() {
@@ -202,18 +203,18 @@
      * @see org.apache.sling.api.scripting.SlingScriptHelper#getService(java.lang.Class)
      */
     @SuppressWarnings("unchecked")
-    public <ServiceType> ServiceType getService(Class<ServiceType> type) {
-        ServiceType service = (this.services == null ? null : (ServiceType) this.services.get(type.getName()));
+    public <T> T getService(Class<T> type) {
+        T service = (this.services == null ? null : (T) this.services.get(type.getName()));
         if (service == null) {
-            final ServiceReference ref = this.bundleContext.getServiceReference(type.getName());
+            final ServiceReference<T> ref = this.bundleContext.getServiceReference(type);
             if (ref != null) {
-                service = (ServiceType) this.bundleContext.getService(ref);
+                service = this.bundleContext.getService(ref);
                 if ( service != null ) {
                     if ( this.services == null ) {
-                        this.services = new HashMap<String, Object>();
+                        this.services = new HashMap<>();
                     }
                     if ( this.references == null ) {
-                        this.references = new ArrayList<ServiceReference>();
+                        this.references = new ArrayList<>();
                     }
                     this.references.add(ref);
                     this.services.put(type.getName(), service);
@@ -227,33 +228,33 @@
      * @see org.apache.sling.api.scripting.SlingScriptHelper#getServices(java.lang.Class, java.lang.String)
      */
     @SuppressWarnings("unchecked")
-    public <ServiceType> ServiceType[] getServices(
-            Class<ServiceType> serviceType, String filter)
+    public <T> T[] getServices(
+            Class<T> serviceType, String filter)
     throws InvalidServiceFilterSyntaxException {
         try {
-            final ServiceReference[] refs = this.bundleContext.getServiceReferences(
-                serviceType.getName(), filter);
-            ServiceType[] result = null;
-            if (refs != null) {
+            Collection<ServiceReference<T>> refsCollection = this.bundleContext.getServiceReferences(
+                    serviceType, filter);
+            T[] result = null;
+            if (refsCollection != null) {
                 // sort by service ranking (lowest first) (see ServiceReference#compareTo(Object))
-                List<ServiceReference> references = Arrays.asList(refs);
-                Collections.sort(references);
+                List<ServiceReference<T>> refsList = new ArrayList<>(refsCollection);
+                Collections.sort(refsList);
                 // get the highest ranking first
-                Collections.reverse(references);
+                Collections.reverse(refsList);
                 
-                final List<ServiceType> objects = new ArrayList<ServiceType>();
-                for (ServiceReference reference : references) {
-                    final ServiceType service = (ServiceType) this.bundleContext.getService(reference);
+                final List<T> objects = new ArrayList<>();
+                for (ServiceReference<T> reference : refsList) {
+                    final T service = this.bundleContext.getService(reference);
                     if (service != null) {
                         if ( this.references == null ) {
-                            this.references = new ArrayList<ServiceReference>();
+                            this.references = new ArrayList<>();
                         }
                         this.references.add(reference);
                         objects.add(service);
                     }
                 }
-                if (objects.size() > 0) {
-                    ServiceType[] srv = (ServiceType[]) Array.newInstance(serviceType, objects.size());
+                if (!objects.isEmpty()) {
+                    T[] srv = (T[]) Array.newInstance(serviceType, objects.size());
                     result = objects.toArray(srv);
                 }
             }
@@ -269,9 +270,9 @@
      */
     public void cleanup() {
         if ( this.references != null ) {
-            final Iterator<ServiceReference> i = this.references.iterator();
+            final Iterator<ServiceReference<?>> i = this.references.iterator();
             while (i.hasNext()) {
-                final ServiceReference ref = i.next();
+                final ServiceReference<?> ref = i.next();
                 this.bundleContext.ungetService(ref);
             }
             this.references.clear();
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java b/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
index 850e5b1..9ef85f9 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
@@ -60,7 +60,7 @@
             Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
     }
 )
-public class BindingsValuesProvidersByContextImpl implements BindingsValuesProvidersByContext, ServiceTrackerCustomizer {
+public class BindingsValuesProvidersByContextImpl implements BindingsValuesProvidersByContext {
 
     private final Map<String, ContextBvpCollector> customizers = new HashMap<>();
     public static final String [] DEFAULT_CONTEXT_ARRAY = new String [] { DEFAULT_CONTEXT };
@@ -69,11 +69,12 @@
     private static final String TOPIC_MODIFIED = "org/apache/sling/scripting/core/BindingsValuesProvider/MODIFIED";
     private static final String TOPIC_REMOVED = "org/apache/sling/scripting/core/BindingsValuesProvider/REMOVED";
 
-    private ServiceTracker bvpTracker;
-    private ServiceTracker mapsTracker;
+    private ServiceTracker<BindingsValuesProvider, Object> bvpTracker;
+    @SuppressWarnings("rawtypes")
+    private ServiceTracker<Map, Object> mapsTracker;
     private BundleContext bundleContext;
     private final Logger logger = LoggerFactory.getLogger(getClass());
-    private final List<ServiceReference> pendingRefs = new ArrayList<>();
+    private final List<ServiceReference<?>> pendingRefs = new ArrayList<>();
 
     @Reference
     private SlingScriptEngineManager scriptEngineManager;
@@ -86,7 +87,11 @@
     private volatile EventAdmin eventAdmin;
 
     private abstract class ContextLoop {
-        Object apply(ServiceReference ref) {
+        private String [] getContexts(ServiceReference<?> reference) {
+            return PropertiesUtil.toStringArray(reference.getProperty(CONTEXT), new String[] { DEFAULT_CONTEXT });
+        }
+
+        Object apply(ServiceReference<?> ref) {
             final Object service = bundleContext.getService(ref);
             if(service != null) {
                 for(String context : getContexts(ref)) {
@@ -104,24 +109,26 @@
         }
 
         protected abstract void applyInContext(ContextBvpCollector c);
-    };
+    }
 
     @Activate
     public void activate(ComponentContext ctx) {
         bundleContext = ctx.getBundleContext();
 
         synchronized (pendingRefs) {
-            for(ServiceReference ref : pendingRefs) {
+            for(ServiceReference<?> ref : pendingRefs) {
                 addingService(ref);
             }
             pendingRefs.clear();
         }
 
-        bvpTracker = new ServiceTracker(bundleContext, BindingsValuesProvider.class.getName(), this);
+        bvpTracker = new ServiceTracker<>(bundleContext, BindingsValuesProvider.class,
+                new ProvidersServiceTrackerCustomizer<>());
         bvpTracker.open();
 
         // Map services can also be registered to provide bindings
-        mapsTracker = new ServiceTracker(bundleContext, Map.class.getName(), this);
+        mapsTracker = new ServiceTracker<>(bundleContext, Map.class,
+                new ProvidersServiceTrackerCustomizer<>());
         mapsTracker.open();
     }
 
@@ -155,7 +162,7 @@
         if (factoryProperties != null) {
             String[] compatibleLangs = PropertiesUtil.toStringArray(factoryProperties.get("compatible.javax.script.name"), new String[0]);
             for (final String name : compatibleLangs) {
-                final Map<ServiceReference, BindingsValuesProvider> langProviders = bvpc.getLangBindingsValuesProviders().get(name);
+                final Map<ServiceReference<?>, BindingsValuesProvider> langProviders = bvpc.getLangBindingsValuesProviders().get(name);
                 if (langProviders != null) {
                     results.addAll(langProviders.values());
                 }
@@ -164,7 +171,7 @@
         }
 
         for (final String name : scriptEngineFactory.getNames()) {
-            final Map<ServiceReference, BindingsValuesProvider> langProviders = bvpc.getLangBindingsValuesProviders().get(name);
+            final Map<ServiceReference<?>, BindingsValuesProvider> langProviders = bvpc.getLangBindingsValuesProviders().get(name);
             if (langProviders != null) {
                 results.addAll(langProviders.values());
             }
@@ -174,18 +181,13 @@
         return results;
     }
 
-    private String [] getContexts(ServiceReference reference) {
-        return PropertiesUtil.toStringArray(reference.getProperty(CONTEXT), new String[] { DEFAULT_CONTEXT });
-    }
-
-    private Event newEvent(final String topic, final ServiceReference reference) {
-        Dictionary<String, Object> props = new Hashtable<>();
+    private Event newEvent(final String topic, final ServiceReference<?> reference) {
+        Dictionary<String, Object> props = new Hashtable<>(); // NOSONAR
         props.put("service.id", reference.getProperty(Constants.SERVICE_ID));
         return new Event(topic, props);
     }
 
-    @Override
-    public Object addingService(final ServiceReference reference) {
+    private Object addingService(final ServiceReference<?> reference) {
         if(bundleContext == null) {
             synchronized (pendingRefs) {
                 pendingRefs.add(reference);
@@ -203,35 +205,46 @@
         }.apply(reference);
     }
 
-    @Override
-    public void modifiedService(final ServiceReference reference, final Object service) {
-        new ContextLoop() {
-            @Override
-            protected void applyInContext(ContextBvpCollector c) {
-                c.modifiedService(reference);
-                if (eventAdmin != null) {
-                    eventAdmin.postEvent(newEvent(TOPIC_MODIFIED, reference));
+    private class ProvidersServiceTrackerCustomizer<S, T> implements ServiceTrackerCustomizer<S, T> {
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public T addingService(ServiceReference<S> reference) {
+            return (T)BindingsValuesProvidersByContextImpl.this.addingService(reference);
+        }
+
+        @Override
+        public void modifiedService(ServiceReference<S> reference, T service) {
+            new ContextLoop() {
+                @Override
+                protected void applyInContext(ContextBvpCollector c) {
+                    c.modifiedService(reference);
+                    if (eventAdmin != null) {
+                        eventAdmin.postEvent(newEvent(TOPIC_MODIFIED, reference));
+                    }
                 }
+            }.apply(reference);
+        }
+
+        @Override
+        public void removedService(ServiceReference<S> reference, T service) {
+            if(bundleContext == null) {
+                synchronized (pendingRefs) {
+                    pendingRefs.remove(reference);
+                }
+                return;
             }
-        }.apply(reference);
+            new ContextLoop() {
+                @Override
+                protected void applyInContext(ContextBvpCollector c) {
+                    c.removedService(reference);
+                    if (eventAdmin != null) {
+                        eventAdmin.postEvent(newEvent(TOPIC_REMOVED, reference));
+                    }
+                }
+            }.apply(reference);
+        }
+
     }
 
-    @Override
-    public void removedService(final ServiceReference reference, final Object service) {
-        if(bundleContext == null) {
-            synchronized (pendingRefs) {
-                pendingRefs.remove(reference);
-            }
-            return;
-        }
-        new ContextLoop() {
-            @Override
-            protected void applyInContext(ContextBvpCollector c) {
-                c.removedService(reference);
-                if (eventAdmin != null) {
-                    eventAdmin.postEvent(newEvent(TOPIC_REMOVED, reference));
-                }
-            }
-        }.apply(reference);
-    }
 }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java b/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java
index b2b5071..c77914a 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java
@@ -19,6 +19,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 
@@ -41,21 +42,21 @@
     /**
      * The BindingsValuesProvider impls which apply to all languages. Keys are serviceIds.
      */
-    private final Map<ServiceReference, BindingsValuesProvider> genericBindingsValuesProviders;
+    private final Map<ServiceReference<?>, BindingsValuesProvider> genericBindingsValuesProviders;
 
     /**
      * The BindingsValuesProvider impls which apply to a specific language.
      */
-    private final Map<String, Map<ServiceReference, BindingsValuesProvider>> langBindingsValuesProviders;
+    private final Map<String, Map<ServiceReference<?>, BindingsValuesProvider>> langBindingsValuesProviders;
 
     ContextBvpCollector(BundleContext bc) {
         bundleContext = bc;
-        genericBindingsValuesProviders = new ConcurrentSkipListMap<ServiceReference, BindingsValuesProvider>();
-        langBindingsValuesProviders = new ConcurrentHashMap<String, Map<ServiceReference, BindingsValuesProvider>>();
+        genericBindingsValuesProviders = new ConcurrentSkipListMap<>();
+        langBindingsValuesProviders = new ConcurrentHashMap<>();
     }
 
     @SuppressWarnings("unchecked")
-    public Object addingService(final ServiceReference ref) {
+    public Object addingService(final ServiceReference<?> ref) {
         final String[] engineNames = PropertiesUtil
                 .toStringArray(ref.getProperty(ScriptEngine.NAME), new String[0]);
         Object service = bundleContext.getService(ref);
@@ -69,12 +70,7 @@
                 genericBindingsValuesProviders.put(ref, (BindingsValuesProvider) service);
             } else {
                 for (String engineName : engineNames) {
-                    Map<ServiceReference, BindingsValuesProvider> langProviders = langBindingsValuesProviders.get(engineName);
-                    if (langProviders == null) {
-                        langProviders = new ConcurrentSkipListMap<ServiceReference, BindingsValuesProvider>();
-                        langBindingsValuesProviders.put(engineName, langProviders);
-                    }
-
+                    Map<ServiceReference<?>, BindingsValuesProvider> langProviders = langBindingsValuesProviders.computeIfAbsent(engineName, k -> new ConcurrentSkipListMap<>());
                     langProviders.put(ref, (BindingsValuesProvider) service);
                 }
             }
@@ -82,7 +78,7 @@
         return service;
     }
 
-    public void modifiedService(final ServiceReference ref) {
+    public void modifiedService(final ServiceReference<?> ref) {
         removedService(ref);
         // Note that any calls to our get* methods at this
         // point won't see the service. We could synchronize
@@ -93,19 +89,23 @@
         addingService(ref);
     }
 
-    public void removedService(final ServiceReference ref) {
+    public void removedService(final ServiceReference<?> ref) {
         if (genericBindingsValuesProviders.remove(ref) == null) {
-            for (Map<ServiceReference, BindingsValuesProvider> coll : langBindingsValuesProviders.values()) {
+            for (Map<ServiceReference<?>, BindingsValuesProvider> coll : langBindingsValuesProviders.values()) {
                 coll.remove(ref);
             }
         }
     }
 
-    Map<ServiceReference, BindingsValuesProvider> getGenericBindingsValuesProviders() {
+    // ServiceReference type can be either Map or BindingsValuesProvider so we must use generic type
+    @SuppressWarnings("java:S1452") 
+    Map<ServiceReference<?>, BindingsValuesProvider> getGenericBindingsValuesProviders() {
         return genericBindingsValuesProviders;
     }
 
-    Map<String, Map<ServiceReference, BindingsValuesProvider>> getLangBindingsValuesProviders() {
+    // ServiceReference type can be either Map or BindingsValuesProvider so we must use generic type
+    @SuppressWarnings("java:S1452") 
+    Map<String, Map<ServiceReference<?>, BindingsValuesProvider>> getLangBindingsValuesProviders() {
         return langBindingsValuesProviders;
     }
 
@@ -118,8 +118,8 @@
         }
 
         public void addBindings(Bindings bindings) {
-            for (String key : map.keySet()) {
-                bindings.put(key, map.get(key));
+            for (Entry<String, Object> entry : map.entrySet()) {
+                bindings.put(entry.getKey(), entry.getValue());
             }
         }
 
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java b/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
index 1d6b25c..2fca84b 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
@@ -97,11 +97,11 @@
             "general page rendering performance.";
 
     /** Thread local containing the resource resolver. */
-    private static ThreadLocal<ResourceResolver> requestResourceResolver = new ThreadLocal<ResourceResolver>();
+    private static ThreadLocal<ResourceResolver> requestResourceResolver = new ThreadLocal<>();
 
     /** The set of protected keys. */
     private static final Set<String> PROTECTED_KEYS =
-        new HashSet<String>(Arrays.asList(REQUEST, RESPONSE, READER, SLING, RESOURCE, RESOLVER, OUT, LOG));
+        new HashSet<>(Arrays.asList(REQUEST, RESPONSE, READER, SLING, RESOURCE, RESOLVER, OUT, LOG));
 
     /** The resource pointing to the script. */
 
@@ -243,8 +243,9 @@
                         case SlingScriptConstants.SLING_SCOPE : return slingScope;
                         case 100: return this.engineScope;
                         case 200: return this.globalScope;
+                        default:
+                            throw new IllegalArgumentException("Invalid scope");
                     }
-                    throw new IllegalArgumentException("Invalid scope");
                 }
 
                 /**
@@ -403,9 +404,9 @@
                     throw new ScriptEvaluationException(this.scriptName, "Method " + method + " not found in script.", e);
                 }
             }
-            // optionall flush the output channel
+            // optional flush the output channel
             Object flushObject = bindings.get(FLUSH);
-            if (flushObject instanceof Boolean && (Boolean) flushObject) {
+            if (Boolean.TRUE.equals(flushObject)) {
                 ctx.getWriter().flush();
             }
 
@@ -455,7 +456,7 @@
      */
     public void init(ServletConfig servletConfig) {
         if (servletConfig != null) {
-            final Dictionary<String, String> params = new Hashtable<String, String>();
+            final Dictionary<String, String> params = new Hashtable<>(); // NOSONAR
             for (Enumeration<?> ne = servletConfig.getInitParameterNames(); ne.hasMoreElements();) {
                 String name = String.valueOf(ne.nextElement());
                 String value = servletConfig.getInitParameter(name);
@@ -731,7 +732,7 @@
         }
 
         if (!bindingsValuesProviders.isEmpty()) {
-            Set<String> protectedKeys = new HashSet<String>();
+            Set<String> protectedKeys = new HashSet<>();
             protectedKeys.addAll(PROTECTED_KEYS);
             ProtectedBindings protectedBindings = new ProtectedBindings(bindings, protectedKeys);
             
@@ -747,8 +748,10 @@
                     if (request != null && request.getRequestProgressTracker() != null) {
                         request.getRequestProgressTracker().log(String.format(BINDINGS_THRESHOLD_MESSAGE, provider.getClass().getName(), (stop-start)/1000, WARN_LIMIT_FOR_BVP_NANOS/1000));
                     } else {
-                        LOGGER.info(String.format(BINDINGS_THRESHOLD_MESSAGE, provider.getClass().getName(), (stop-start)/1000,
-                                WARN_LIMIT_FOR_BVP_NANOS/1000));
+                        if (LOGGER.isInfoEnabled()) {
+                            LOGGER.info(String.format(BINDINGS_THRESHOLD_MESSAGE, provider.getClass().getName(), (stop-start)/1000,
+                                    WARN_LIMIT_FOR_BVP_NANOS/1000));
+                        }
                     }
                 }
             }
@@ -795,7 +798,7 @@
      * This ensures that the input stream is only fetched from the repository
      * if it is really used by the script engines.
      */
-    public final static class LazyInputStream extends InputStream {
+    public static final class LazyInputStream extends InputStream {
 
         /** The script resource which is adapted to an inputm stream. */
         private final Resource resource;
@@ -895,7 +898,7 @@
         private Resource delegatee;
 
         public LazyScriptResource(final String path, final String resourceType, final ResourceResolver resolver) {
-            super(null);
+            super(null); // NOSONAR
             this.path = path;
             this.resourceType = resourceType;
             this.resolver = resolver;
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java b/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
index 4b4f95e..737b284 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
@@ -51,12 +51,13 @@
     /**
      * @see org.apache.sling.api.scripting.SlingScriptHelper#getService(java.lang.Class)
      */
-    public <ServiceType> ServiceType getService(Class<ServiceType> type) {
+    @Override
+    public <T> T getService(Class<T> type) {
         return this.serviceCache.getService(type);
     }
 
     @Override
-    public <ServiceType> ServiceType[] getServices(Class<ServiceType> serviceType, String filter)
+    public <T> T[] getServices(Class<T> serviceType, String filter)
             throws InvalidServiceFilterSyntaxException {
         return this.serviceCache.getServices(serviceType, filter);
     }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheConsolePlugin.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheConsolePlugin.java
index 7503515..8285594 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheConsolePlugin.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheConsolePlugin.java
@@ -49,6 +49,8 @@
 )
 public class ScriptCacheConsolePlugin extends AbstractWebConsolePlugin {
 
+    private static final long serialVersionUID = 8073398598702884758L;
+
     public static final String CONSOLE_LABEL = "scriptcache";
     public static final String CONSOLE_TITLE = "Script Cache Status";
     public static final String RESOURCES = CONSOLE_LABEL + "/ui";
@@ -83,7 +85,7 @@
             StringBuilder sb = new StringBuilder();
             sb.append("<script type='text/javascript' src='").append(RESOURCES).append("/").append(SCRIPTCACHE_JS).append("'></script>");
             sb.append("<div id='cached-scripts' class='ui-widget statline'>");
-            if (scripts.size() > 0) {
+            if (!scripts.isEmpty()) {
                 Collections.sort(scripts);
                 sb.append("<p class='ui-widget-header'>Cached Scripts</p>");
                 sb.append("<table class='nicetable ui-widget-content'>");
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImpl.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImpl.java
index c78cef9..579e11f 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImpl.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImpl.java
@@ -34,8 +34,6 @@
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
-import org.apache.sling.api.resource.LoginException;
-import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.api.resource.observation.ExternalResourceChangeListener;
 import org.apache.sling.api.resource.observation.ResourceChange;
@@ -79,7 +77,7 @@
  */
 public class ScriptCacheImpl implements ScriptCache, ResourceChangeListener, ExternalResourceChangeListener, EventHandler {
 
-    private final Logger LOGGER = LoggerFactory.getLogger(ScriptCacheImpl.class);
+    private final Logger logger = LoggerFactory.getLogger(ScriptCacheImpl.class);
 
     public static final int DEFAULT_CACHE_SIZE = 65536;
 
@@ -88,7 +86,6 @@
     private ServiceRegistration<ResourceChangeListener> resourceChangeListener;
     private Set<String> extensions = new HashSet<>();
     private String[] additionalExtensions = new String[]{};
-    private String[] searchPaths = {};
 
     // use a static policy so that we can reconfigure the watched script files if the search paths are changed
     @Reference
@@ -131,7 +128,7 @@
         try {
             SoftReference<CachedScript> reference = new SoftReference<>(script);
             internalMap.put(script.getScriptPath(), reference);
-            LOGGER.debug("Added script {} to script cache.", script.getScriptPath());
+            logger.debug("Added script {} to script cache.", script.getScriptPath());
         } finally {
             writeLock.unlock();
         }
@@ -142,7 +139,7 @@
         writeLock.lock();
         try {
             internalMap.clear();
-            LOGGER.debug("Cleared script cache.");
+            logger.debug("Cleared script cache.");
         } finally {
             writeLock.unlock();
         }
@@ -155,7 +152,7 @@
             SoftReference<CachedScript> reference = internalMap.remove(scriptPath);
             boolean result = reference != null;
             if (result) {
-                LOGGER.debug("Removed script {} from script cache.", scriptPath);
+                logger.debug("Removed script {} from script cache.", scriptPath);
             }
             return result;
         } finally {
@@ -166,30 +163,27 @@
     @Override
     public void onChange(@NotNull List<ResourceChange> list) {
         for (final ResourceChange change : list) {
-            Runnable eventTask = new Runnable() {
-                @Override
-                public void run() {
-                    String path = change.getPath();
-                    writeLock.lock();
-                    try {
-                        final boolean removed = internalMap.remove(path) != null;
-                        LOGGER.debug("Detected script change for {} - removed entry from the cache.", path);
-                        if ( !removed && change.getType() == ChangeType.REMOVED ) {
-                            final String prefix = path + "/";
-                            final Set<String> removal = new HashSet<>();
-                            for(final Map.Entry<String, SoftReference<CachedScript>> entry : internalMap.entrySet()) {
-                                if ( entry.getKey().startsWith(prefix) ) {
-                                    removal.add(entry.getKey());
-                                }
-                            }
-                            for(final String key : removal) {
-                                internalMap.remove(key);
-                                LOGGER.debug("Detected removal for {} - removed entry {} from the cache.", path, key);
+            Runnable eventTask = () -> {
+                String path = change.getPath();
+                writeLock.lock();
+                try {
+                    final boolean removed = internalMap.remove(path) != null;
+                    logger.debug("Detected script change for {} - removed entry from the cache.", path);
+                    if ( !removed && change.getType() == ChangeType.REMOVED ) {
+                        final String prefix = path + "/";
+                        final Set<String> removal = new HashSet<>();
+                        for(final Map.Entry<String, SoftReference<CachedScript>> entry : internalMap.entrySet()) {
+                            if ( entry.getKey().startsWith(prefix) ) {
+                                removal.add(entry.getKey());
                             }
                         }
-                    } finally {
-                        writeLock.unlock();
+                        for(final String key : removal) {
+                            internalMap.remove(key);
+                            logger.debug("Detected removal for {} - removed entry {} from the cache.", path, key);
+                        }
                     }
+                } finally {
+                    writeLock.unlock();
                 }
             };
             threadPool.execute(eventTask);
@@ -238,7 +232,7 @@
                     for (String extension : extensions) {
                         globPatterns.add("glob:**/*." + extension);
                     }
-                    Dictionary<String, Object> resourceChangeListenerProperties = new Hashtable<>();
+                    Dictionary<String, Object> resourceChangeListenerProperties = new Hashtable<>(); // NOSONAR
                     resourceChangeListenerProperties
                             .put(ResourceChangeListener.PATHS, globPatterns.toArray(new String[globPatterns.size()]));
                     resourceChangeListenerProperties.put(ResourceChangeListener.CHANGES,
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImplConfiguration.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImplConfiguration.java
index 7dd865f..2d1ed30 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImplConfiguration.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptCacheImplConfiguration.java
@@ -33,13 +33,13 @@
         name = "Cache Size",
         description = "The Cache Size defines the maximum number of compiled script references that will be stored in the cache's internal map."
     )
-    int org_apache_sling_scripting_cache_size() default DEFAULT_CACHE_SIZE;
+    int org_apache_sling_scripting_cache_size() default DEFAULT_CACHE_SIZE; // NOSONAR
 
     @AttributeDefinition(
         name = "Additional Extensions",
         description = "Scripts from the search paths with these extensions will also be monitored so that changes to them will clean the cache if the cache contains them."
 
     )
-    String[] org_apache_sling_scripting_cache_additional__extensions() default {};
+    String[] org_apache_sling_scripting_cache_additional__extensions() default {}; // NOSONAR
 
 }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptEngineConsolePlugin.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptEngineConsolePlugin.java
index 1b88807..2bef509 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptEngineConsolePlugin.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptEngineConsolePlugin.java
@@ -20,25 +20,18 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.Arrays;
-import java.util.Dictionary;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 
 import javax.script.ScriptEngineFactory;
-import javax.script.ScriptEngineManager;
 import javax.servlet.Servlet;
-import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.sling.scripting.core.impl.jsr223.SlingScriptEngineManager;
-import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 
@@ -55,6 +48,8 @@
 )
 public class ScriptEngineConsolePlugin extends AbstractWebConsolePlugin {
 
+    private static final long serialVersionUID = -6444729200748932100L;
+
     public static final String CONSOLE_LABEL = "slingscripting";
     public static final String CONSOLE_TITLE = "Script Engines";
 
@@ -109,7 +104,7 @@
     }
 
     private void printArray(PrintWriter pw, List<?> values) {
-        if (values == null || values.size() == 0) {
+        if (values == null || values.isEmpty()) {
             pw.println("-");
         } else {
             for (Iterator<?> vi = values.iterator(); vi.hasNext();) {
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolver.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolver.java
index f91fece..2959825 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolver.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolver.java
@@ -54,11 +54,11 @@
             StringWriter writer = new StringWriter();
             Throwable t = new Throwable();
             t.printStackTrace(new PrintWriter(writer));
-            LOGGER.warn("The following code attempted to close the per-request resource resolver: {}", writer.toString());
+            LOGGER.warn("The following code attempted to close the per-request resource resolver: {}", writer);
         }
     }
 
-    void _close() {
+    void _close() { // NOSONAR
         delegate.close();
     }
 
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverProviderImpl.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverProviderImpl.java
index fb1b8ac..dac10a9 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverProviderImpl.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverProviderImpl.java
@@ -70,7 +70,7 @@
                 description = "If enabled, all calls to ResourceResolver#close for the request-scoped resource resolvers will be logged " +
                         "with the full stack trace. Don't enable this setting on production systems."
         )
-        boolean log_stacktrace_onclose() default false;
+        boolean log_stacktrace_onclose() default false; // NOSONAR
 
     }
 
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
index 50237ac..89dca2d 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
@@ -61,9 +61,6 @@
     @Reference
     private ScriptEngineManager scriptEngineManager;
 
-    public ScriptingVariablesConsolePlugin() {
-    }
-
     /**
      * Automatically called from
      * <a href="https://github.com/apache/felix/blob/4a60744d0f88f351551e4cb4673eb60b8fbd21d3/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java#L510">AbstractWebConsolePlugin#spoolResource</a>
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java b/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
index d1e5062..235bbfe 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
@@ -71,10 +71,10 @@
      */
     @SuppressWarnings("unchecked")
     @Nullable
-    public <ServiceType> ServiceType getService(Class<ServiceType> type) {
+    public <T> T getService(Class<T> type) {
         SortedSet<Reference> references = getCachedReferences(type);
         for (Reference reference : references) {
-            ServiceType service = (ServiceType) reference.getService();
+            T service = (T) reference.getService();
             if (service != null) {
                 return service;
             }
@@ -84,22 +84,22 @@
 
     @SuppressWarnings("unchecked")
     @Nullable
-    public <ServiceType> ServiceType[] getServices(Class<ServiceType> type, String filter) {
-        List<ServiceType> result = new ArrayList<>();
+    public <T> T[] getServices(Class<T> type, String filter) {
+        List<T> result = new ArrayList<>();
         try {
             SortedSet<Reference> cachedReferences = getCachedReferences(type);
-            final Collection<ServiceReference<ServiceType>> filteredReferences = this.bundleContext.getServiceReferences(type, filter);
+            final Collection<ServiceReference<T>> filteredReferences = this.bundleContext.getServiceReferences(type, filter);
             if (!filteredReferences.isEmpty()) {
-                List<ServiceReference<ServiceType>> localFilteredReferences = new ArrayList<>(filteredReferences);
+                List<ServiceReference<T>> localFilteredReferences = new ArrayList<>(filteredReferences);
                 Collections.sort(localFilteredReferences);
                 // get the highest ranking first
                 Collections.reverse(localFilteredReferences);
-                for (ServiceReference<ServiceType> serviceReference : localFilteredReferences) {
+                for (ServiceReference<T> serviceReference : localFilteredReferences) {
                     Reference lookup = new Reference(serviceReference);
                     if (cachedReferences.contains(lookup)) {
                         for (Reference reference : cachedReferences) {
                             if (serviceReference.equals(reference.getServiceReference())) {
-                                ServiceType service = (ServiceType) reference.getService();
+                                T service = (T) reference.getService();
                                 if (service != null) {
                                     result.add(service);
                                 }
@@ -116,7 +116,7 @@
             LOGGER.error(String.format("Unable to retrieve the services of type %s.", type.getName()), e);
         }
         if (!result.isEmpty()) {
-            ServiceType[] srv = (ServiceType[]) Array.newInstance(type, result.size());
+            T[] srv = (T[]) Array.newInstance(type, result.size());
             return result.toArray(srv);
         }
         return null;
@@ -143,18 +143,18 @@
         }
     }
 
-    private <ServiceType> SortedSet<Reference> getCachedReferences(Class<ServiceType> type) {
+    private <T> SortedSet<Reference> getCachedReferences(Class<T> type) {
         String key = type.getName();
         SortedSet<Reference> references = cache.get(key);
         if (references == null) {
             references = new ConcurrentSkipListSet<>(Comparator.reverseOrder());
             try {
-                Collection<ServiceReference<ServiceType>> serviceReferences = this.bundleContext.getServiceReferences(type, null);
+                Collection<ServiceReference<T>> serviceReferences = this.bundleContext.getServiceReferences(type, null);
                 if (!serviceReferences.isEmpty()) {
-                    List<ServiceReference<ServiceType>> localReferences = new ArrayList<>(serviceReferences);
+                    List<ServiceReference<T>> localReferences = new ArrayList<>(serviceReferences);
                     Collections.sort(localReferences);
                     Collections.reverse(localReferences);
-                    for (ServiceReference<ServiceType> ref : localReferences) {
+                    for (ServiceReference<T> ref : localReferences) {
                         references.add(new Reference(ref));
                     }
                     synchronized (this) {
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java b/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
index c7bc766..edb1a66 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
@@ -31,8 +31,9 @@
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 
 /**
@@ -87,7 +88,7 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public <AdapterType> AdapterType getAdapter(@NotNull final Object adaptable, @NotNull final Class<AdapterType> type) {
+    public <A> A getAdapter(@NotNull final Object adaptable, @NotNull final Class<A> type) {
 
         final Resource resource = (Resource) adaptable;
         final String path = resource.getPath();
@@ -95,7 +96,7 @@
 
         final List<ScriptEngine> engines = scriptEngineManager.getEnginesByExtension(extension);
         final ScriptEngine engine;
-        if (engines.size() == 0) {
+        if (engines.isEmpty()) {
             return null;
         } else if (engines.size() == 1) {
             engine = engines.get(0);
@@ -105,7 +106,7 @@
         if (engine != null) {
             final Collection<BindingsValuesProvider> bindingsValuesProviders = bindingsValuesProviderTracker.getBindingsValuesProviders(engine.getFactory(), BINDINGS_CONTEXT);
             // unchecked cast
-            return (AdapterType) new DefaultSlingScript(this.bundleContext, resource, engine, bindingsValuesProviders, this.serviceCache, scriptCache);
+            return (A) new DefaultSlingScript(this.bundleContext, resource, engine, bindingsValuesProviders, this.serviceCache, scriptCache);
         }
 
         return null;
@@ -131,7 +132,7 @@
         ScriptEngine se = scriptEngineManager.getEngineByExtension(name);
         if (se != null) {
             List<?> mimeTypes = se.getFactory().getMimeTypes();
-            if (mimeTypes != null && mimeTypes.size() > 0) {
+            if (mimeTypes != null && !mimeTypes.isEmpty()) {
                 return String.valueOf(mimeTypes.get(0));
             }
         }
@@ -153,7 +154,7 @@
         ScriptEngine se = scriptEngineManager.getEngineByMimeType(mimeType);
         if (se != null) {
             List<?> extensions = se.getFactory().getExtensions();
-            if (extensions != null && extensions.size() > 0) {
+            if (extensions != null && !extensions.isEmpty()) {
                 return String.valueOf(extensions.get(0));
             }
         }
@@ -163,12 +164,14 @@
 
     // ---------- SCR integration ----------------------------------------------
 
-    protected void activate(ComponentContext context) {
-        bundleContext = context.getBundleContext();
+    @Activate
+    protected void activate(BundleContext bc) {
+        bundleContext = bc;
         this.serviceCache = new ServiceCache(this.bundleContext);
     }
 
-    protected void deactivate(ComponentContext context) {
+    @Deactivate
+    protected void deactivate() {
         this.serviceCache.dispose();
         this.serviceCache = null;
         this.bundleContext = null;
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptEnginePicker.java b/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptEnginePicker.java
index 666189d..fd3cc4c 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptEnginePicker.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptEnginePicker.java
@@ -48,18 +48,15 @@
      * "html=Thymeleaf:3.0"
      * ]
      */
-    private static String SLING_SCRIPTING = "sling:scripting";
+    private static final String SLING_SCRIPTING = "sling:scripting";
 
     private final Logger logger = LoggerFactory.getLogger(SlingScriptEnginePicker.class);
 
-    public SlingScriptEnginePicker() {
-    }
-
     @Nullable ScriptEngine pickScriptEngine(@NotNull final List<ScriptEngine> scriptEngines, @NotNull Resource resource, @NotNull String extension) {
         final String scriptingMapping = findScriptingMapping(resource, extension);
         logger.debug("scripting mapping: {}", scriptingMapping);
         if (scriptingMapping == null || scriptingMapping.isEmpty()) {
-            return scriptEngines.size() > 0 ? scriptEngines.get(0) : null;
+            return !scriptEngines.isEmpty() ? scriptEngines.get(0) : null;
         }
 
         final Conditions conditions = parseScriptingMapping(scriptingMapping);
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContext.java b/src/main/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContext.java
index 30d85be..b82a057 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContext.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContext.java
@@ -33,9 +33,14 @@
 
     private static final Integer[] SCOPES = {SlingScriptConstants.SLING_SCOPE, GLOBAL_SCOPE, ENGINE_SCOPE};
 
-    private Bindings globalScope = new LazyBindings();
-    private Bindings engineScope = new LazyBindings();
-    private Bindings slingScope = new LazyBindings();
+    private Bindings slingScope;
+
+    public BundledScriptContext() {
+        super();
+        globalScope = new LazyBindings();
+        engineScope = new LazyBindings();
+        slingScope = new LazyBindings();
+    }
 
     @Override
     public void setBindings(final Bindings bindings, final int scope) {
@@ -66,8 +71,9 @@
                 return this.engineScope;
             case 200:
                 return this.globalScope;
+            default:
+                throw new IllegalArgumentException("Invalid scope.");
         }
-        throw new IllegalArgumentException("Invalid scope.");
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/bundled/LogWriter.java b/src/main/java/org/apache/sling/scripting/core/impl/bundled/LogWriter.java
index a55b450..c43bc07 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/bundled/LogWriter.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/bundled/LogWriter.java
@@ -27,13 +27,13 @@
     /**
      * The logger to which the error messages are written
      */
-    final private Logger logger;
+    private final Logger logger;
 
     /**
      * The internal buffer to gather message data until being flushed or a CR or
      * LF is encountered in the message data.
      */
-    final private StringBuilder lineBuffer;
+    private final StringBuilder lineBuffer;
 
     /**
      * Creates a writer based on the given logger.
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/bundled/Script.java b/src/main/java/org/apache/sling/scripting/core/impl/bundled/Script.java
index f46a77e..4de7150 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/bundled/Script.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/bundled/Script.java
@@ -22,6 +22,7 @@
 import java.io.InputStream;
 import java.io.StringReader;
 import java.net.URL;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Set;
 import java.util.concurrent.locks.Lock;
@@ -80,7 +81,7 @@
     @Override
     public InputStream getInputStream() {
         try {
-            return IOUtils.toInputStream(getSourceCode());
+            return IOUtils.toInputStream(getSourceCode(), Charset.defaultCharset());
         }
         catch (IOException e) {
             return null;
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java b/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
index 02056f7..6855976 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
@@ -114,7 +114,7 @@
         bindings.put(SlingBindings.SLING, scriptHelper);
         bindings.put(BundledRenderUnit.VARIABLE, executable);
         bindings.put(ScriptEngine.FILENAME, executable.getPath());
-        bindings.put(ScriptEngine.FILENAME.replaceAll("\\.", "_"), executable.getPath());
+        bindings.put(ScriptEngine.FILENAME.replace(".", "_"), executable.getPath());
 
         ProtectedBindings protectedBindings = new ProtectedBindings(bindings, PROTECTED_BINDINGS);
         long inclusionStart = System.nanoTime();
@@ -131,8 +131,10 @@
                     request.getRequestProgressTracker().log(String.format(BINDINGS_THRESHOLD_MESSAGE, bindingsValuesProvider.getClass().getName(),
                             (stop-start)/1000, WARN_LIMIT_FOR_BVP_NANOS/1000));
                 } else {
-                    LOG.info(String.format(BINDINGS_THRESHOLD_MESSAGE, bindingsValuesProvider.getClass().getName(), (stop-start)/1000,
-                            WARN_LIMIT_FOR_BVP_NANOS/1000));
+                    if (LOG.isInfoEnabled()) {
+                        LOG.info(String.format(BINDINGS_THRESHOLD_MESSAGE, bindingsValuesProvider.getClass().getName(), (stop-start)/1000,
+                                WARN_LIMIT_FOR_BVP_NANOS/1000));
+                    }
                 }
             }
         }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/helper/CachingMap.java b/src/main/java/org/apache/sling/scripting/core/impl/helper/CachingMap.java
index be5e973..f3cb326 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/helper/CachingMap.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/helper/CachingMap.java
@@ -36,6 +36,8 @@
  */
 public class CachingMap<T> extends LinkedHashMap<String, SoftReference<T>> {
 
+    private static final long serialVersionUID = -3392702301736494889L;
+
     private int capacity;
 
     /**
@@ -51,4 +53,25 @@
     protected boolean removeEldestEntry(Map.Entry<String, SoftReference<T>> eldest) {
         return size() > capacity;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + capacity;
+        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;
+        CachingMap<?> other = (CachingMap<?>) obj;
+        return capacity != other.capacity;
+    }
+
 }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReader.java b/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReader.java
index d3384c6..e089e05 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReader.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReader.java
@@ -48,7 +48,7 @@
 
     @Override
     public boolean markSupported() {
-        return (delegatee != null) ? delegatee.markSupported() : false;
+        return delegatee != null && delegatee.markSupported();
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindings.java b/src/main/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindings.java
index c117b37..a2f8790 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindings.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindings.java
@@ -30,6 +30,8 @@
 
 public class ProtectedBindings extends LazyBindings implements Bindings {
 
+    private static final long serialVersionUID = -5988579857015221345L;
+
     private final Bindings wrapped;
     private final Set<String> protectedKeys;
 
@@ -43,6 +45,7 @@
      *
      * @throws IllegalArgumentException if the key is protected
      */
+    @Override
     public Object put(String key, Object value) {
         if (protectedKeys.contains(key)) {
             throw new IllegalArgumentException(String.format("Key %s is protected.", key));
@@ -53,10 +56,13 @@
     /**
      * {@inheritDoc}
      */
+    @SuppressWarnings("java:S4968") // can't fix, so stop warning about it
+    @Override
     public void putAll(Map<? extends String, ? extends Object> toMerge) {
-        for (String key : toMerge.keySet()) {
+        for (Entry<? extends String, ? extends Object> entry : toMerge.entrySet()) {
+            String key = entry.getKey();
             if (!protectedKeys.contains(key)) {
-                wrapped.put(key, toMerge.get(key));
+                wrapped.put(key, entry.getValue());
             }
         }
     }
@@ -66,6 +72,7 @@
      *
      * @throws IllegalArgumentException if the key is protected
      */
+    @Override
     public Object remove(Object key) {
         if (protectedKeys.contains(key)) {
             throw new IllegalArgumentException(String.format("Key %s is protected.", key));
@@ -76,6 +83,7 @@
     /**
      * The clear operation is not supported.
      */
+    @Override
     public void clear() {
         throw new UnsupportedOperationException("ProtectedBindings does not support clear()");
     }
@@ -83,6 +91,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean containsValue(Object value) {
         return wrapped.containsValue(value);
     }
@@ -93,6 +102,7 @@
      *
      * @return an unmodifiable Set view of the map
      */
+    @Override
     @NotNull
     public Set<Entry<String, Object>> entrySet() {
         return Collections.unmodifiableSet(wrapped.entrySet());
@@ -101,6 +111,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean isEmpty() {
         return wrapped.isEmpty();
     }
@@ -111,6 +122,7 @@
      *
      * @return an unmodifiable Set view of the map's keys
      */
+    @Override
     @NotNull
     public Set<String> keySet() {
         return Collections.unmodifiableSet(wrapped.keySet());
@@ -119,6 +131,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public int size() {
         return wrapped.size();
     }
@@ -129,6 +142,7 @@
      *
      * @return an unmodifiable Collection view of the map's values
      */
+    @Override
     @NotNull
     public Collection<Object> values() {
         return Collections.unmodifiableCollection(wrapped.values());
@@ -137,6 +151,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean containsKey(Object key) {
         return wrapped.containsKey(key);
     }
@@ -144,8 +159,40 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public Object get(Object key) {
         return wrapped.get(key);
     }
 
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((protectedKeys == null) ? 0 : protectedKeys.hashCode());
+        result = prime * result + ((wrapped == null) ? 0 : wrapped.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;
+        ProtectedBindings other = (ProtectedBindings) obj;
+        if (protectedKeys == null) {
+            if (other.protectedKeys != null)
+                return false;
+        } else if (!protectedKeys.equals(other.protectedKeys))
+            return false;
+        if (wrapped == null) {
+            if (other.wrapped != null)
+                return false;
+        } else if (!wrapped.equals(other.wrapped))
+            return false;
+        return true;
+    }
+
 }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
index 63db942..5939a15 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
@@ -504,7 +504,7 @@
 
     private void postEvent(final String topic, final ScriptEngineFactory scriptEngineFactory) {
         if (eventAdmin != null) {
-            final Dictionary<String, Object> props = new Hashtable<>();
+            final Dictionary<String, Object> props = new Hashtable<>(); // NOSONAR
             props.put(SlingScriptConstants.PROPERTY_SCRIPT_ENGINE_FACTORY_NAME, scriptEngineFactory.getEngineName());
             props.put(SlingScriptConstants.PROPERTY_SCRIPT_ENGINE_FACTORY_VERSION, scriptEngineFactory.getEngineVersion());
             props.put(SlingScriptConstants.PROPERTY_SCRIPT_ENGINE_FACTORY_EXTENSIONS, scriptEngineFactory.getExtensions().toArray(new String[0]));
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java
index 30a70bc..040d8fb 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java
@@ -27,7 +27,7 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class SortableScriptEngineFactory implements ScriptEngineFactory, Comparable {
+public class SortableScriptEngineFactory implements ScriptEngineFactory, Comparable<SortableScriptEngineFactory> {
 
     private final ScriptEngineFactory delegate;
     private final int serviceRanking;
@@ -129,8 +129,7 @@
     }
 
     @Override
-    public int compareTo(@NotNull Object o) {
-        SortableScriptEngineFactory other = (SortableScriptEngineFactory) o;
+    public int compareTo(SortableScriptEngineFactory other) {
         if (equals(other)) {
             return 0;
         }
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/LogWriterTest.java b/src/test/java/org/apache/sling/scripting/core/impl/LogWriterTest.java
index 812611e..a638c24 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/LogWriterTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/LogWriterTest.java
@@ -20,205 +20,204 @@
 
 import java.io.IOException;
 
-import junit.framework.TestCase;
-
-import org.apache.sling.scripting.core.impl.LogWriter;
 import org.slf4j.Logger;
 import org.slf4j.Marker;
 
+import junit.framework.TestCase;
+
 public class LogWriterTest extends TestCase {
 
     public void testCharacter() {
         MockLogger logger = new MockLogger();
-        LogWriter logWriter = new LogWriter(logger);
+        try(LogWriter logWriter = new LogWriter(logger)) {
+            // ensure logger is empty
+            logger.getLastMessage();
 
-        // ensure logger is empty
-        logger.getLastMessage();
+            // empty flush
+            logWriter.flush();
+            String msg = logger.getLastMessage();
+            assertNull(msg);
 
-        // empty flush
-        logWriter.flush();
-        String msg = logger.getLastMessage();
-        assertNull(msg);
+            // write a single character, message only after flush
+            logWriter.write('a');
+            assertNull(logger.getLastMessage());
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals("a", msg);
 
-        // write a single character, message only after flush
-        logWriter.write('a');
-        assertNull(logger.getLastMessage());
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals("a", msg);
+            // write a single CR, no message
+            logWriter.write('\r');
+            assertNull(logger.getLastMessage());
 
-        // write a single CR, no message
-        logWriter.write('\r');
-        assertNull(logger.getLastMessage());
+            // write a single LF, no message
+            logWriter.write('\n');
+            assertNull(logger.getLastMessage());
 
-        // write a single LF, no message
-        logWriter.write('\n');
-        assertNull(logger.getLastMessage());
+            // write three characters (one is CR)
+            logWriter.write('a');
+            logWriter.write('\r');
+            logWriter.write('b');
 
-        // write three characters (one is CR)
-        logWriter.write('a');
-        logWriter.write('\r');
-        logWriter.write('b');
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals("a", msg);
 
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals("a", msg);
+            logWriter.flush();
 
-        logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals("b", msg);
 
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals("b", msg);
+            // write three characters (one is LF)
+            logWriter.write('a');
+            logWriter.write('\n');
+            logWriter.write('b');
 
-        // write three characters (one is LF)
-        logWriter.write('a');
-        logWriter.write('\n');
-        logWriter.write('b');
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals("a", msg);
 
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals("a", msg);
+            logWriter.flush();
 
-        logWriter.flush();
-
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals("b", msg);
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals("b", msg);
+        }
     }
 
     public void testStringCR() throws IOException {
         MockLogger logger = new MockLogger();
-        LogWriter logWriter = new LogWriter(logger);
-        
-        // ensure logger is empty
-        logger.getLastMessage();
-        
-        // empty flush
-        logWriter.flush();
-        String msg = logger.getLastMessage();
-        assertNull(msg);
-        
-        // intermediate CR
-        String tMsg1 = "Ein";
-        String tMsg2 = "Text";
-        String tMsg = tMsg1 + "\r" + tMsg2;
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg1, msg);
-        
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg2, msg);
-        
-        // initial CR
-        tMsg = "\r" + tMsg1 + tMsg2;
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNull(msg);
-        
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg1 + tMsg2, msg);
-        
-        // terminating CR
-        tMsg = tMsg1 + tMsg2 + "\r";
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg1+tMsg2, msg);
-        
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNull(msg);
+        try (LogWriter logWriter = new LogWriter(logger)) {
+            // ensure logger is empty
+            logger.getLastMessage();
+            
+            // empty flush
+            logWriter.flush();
+            String msg = logger.getLastMessage();
+            assertNull(msg);
+            
+            // intermediate CR
+            String tMsg1 = "Ein";
+            String tMsg2 = "Text";
+            String tMsg = tMsg1 + "\r" + tMsg2;
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg1, msg);
+            
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg2, msg);
+            
+            // initial CR
+            tMsg = "\r" + tMsg1 + tMsg2;
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNull(msg);
+            
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg1 + tMsg2, msg);
+            
+            // terminating CR
+            tMsg = tMsg1 + tMsg2 + "\r";
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg1+tMsg2, msg);
+            
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNull(msg);
+        }
     }
-    
+
     public void testStringLF() throws IOException {
         MockLogger logger = new MockLogger();
-        LogWriter logWriter = new LogWriter(logger);
+        try (LogWriter logWriter = new LogWriter(logger)) {
+            // ensure logger is empty
+            logger.getLastMessage();
 
-        // ensure logger is empty
-        logger.getLastMessage();
+            // empty flush
+            logWriter.flush();
+            String msg = logger.getLastMessage();
+            assertNull(msg);
 
-        // empty flush
-        logWriter.flush();
-        String msg = logger.getLastMessage();
-        assertNull(msg);
+            // intermediate LF
+            String tMsg1 = "Ein";
+            String tMsg2 = "Text";
+            String tMsg = tMsg1 + "\n" + tMsg2;
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg1, msg);
 
-        // intermediate LF
-        String tMsg1 = "Ein";
-        String tMsg2 = "Text";
-        String tMsg = tMsg1 + "\n" + tMsg2;
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg1, msg);
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg2, msg);
 
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg2, msg);
+            // initial LF
+            tMsg = "\n" + tMsg1 + tMsg2;
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNull(msg);
 
-        // initial LF
-        tMsg = "\n" + tMsg1 + tMsg2;
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNull(msg);
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg1 + tMsg2, msg);
 
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg1 + tMsg2, msg);
+            // terminating LF
+            tMsg = tMsg1 + tMsg2 + "\n";
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg1+tMsg2, msg);
 
-        // terminating LF
-        tMsg = tMsg1 + tMsg2 + "\n";
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg1+tMsg2, msg);
-
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNull(msg);
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNull(msg);
+        }
     }
 
     public void testString() throws IOException {
         MockLogger logger = new MockLogger();
-        LogWriter logWriter = new LogWriter(logger);
+        try (LogWriter logWriter = new LogWriter(logger)) {
+            // ensure logger is empty
+            logger.getLastMessage();
 
-        // ensure logger is empty
-        logger.getLastMessage();
+            // empty flush
+            logWriter.flush();
+            String msg = logger.getLastMessage();
+            assertNull(msg);
 
-        // empty flush
-        logWriter.flush();
-        String msg = logger.getLastMessage();
-        assertNull(msg);
+            // flushed line
+            String tMsg = "Ein Text";
+            logWriter.write(tMsg);
+            msg = logger.getLastMessage();
+            assertNull(msg);
 
-        // flushed line
-        String tMsg = "Ein Text";
-        logWriter.write(tMsg);
-        msg = logger.getLastMessage();
-        assertNull(msg);
+            logWriter.flush();
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg, msg);
 
-        logWriter.flush();
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg, msg);
+            // CR terminated line
+            logWriter.write(tMsg + "\r");
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg, msg);
 
-        // CR terminated line
-        logWriter.write(tMsg + "\r");
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg, msg);
-
-        // LF terminated line
-        logWriter.write(tMsg + "\n");
-        msg = logger.getLastMessage();
-        assertNotNull(msg);
-        assertEquals(tMsg, msg);
+            // LF terminated line
+            logWriter.write(tMsg + "\n");
+            msg = logger.getLastMessage();
+            assertNotNull(msg);
+            assertEquals(tMsg, msg);
+        }
     }
 
     private static class MockLogger implements Logger {
@@ -239,7 +238,7 @@
             fail("Unexpected call");
         }
 
-        public void debug(String format, Object[] argArray) {
+        public void debug(String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -259,7 +258,7 @@
             fail("Unexpected call");
         }
 
-        public void debug(Marker marker, String format, Object[] argArray) {
+        public void debug(Marker marker, String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -279,7 +278,7 @@
             fail("Unexpected call");
         }
 
-        public void error(String format, Object[] argArray) {
+        public void error(String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -299,7 +298,7 @@
             fail("Unexpected call");
         }
 
-        public void error(Marker marker, String format, Object[] argArray) {
+        public void error(Marker marker, String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -323,7 +322,7 @@
             fail("Unexpected call");
         }
 
-        public void info(String format, Object[] argArray) {
+        public void info(String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -343,7 +342,7 @@
             fail("Unexpected call");
         }
 
-        public void info(Marker marker, String format, Object[] argArray) {
+        public void info(Marker marker, String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -403,7 +402,7 @@
             fail("Unexpected call");
         }
 
-        public void trace(String format, Object[] argArray) {
+        public void trace(String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -423,7 +422,7 @@
             fail("Unexpected call");
         }
 
-        public void trace(Marker marker, String format, Object[] argArray) {
+        public void trace(Marker marker, String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -443,7 +442,7 @@
             fail("Unexpected call");
         }
 
-        public void warn(String format, Object[] argArray) {
+        public void warn(String format, Object... argArray) {
             fail("Unexpected call");
         }
 
@@ -463,7 +462,7 @@
             fail("Unexpected call");
         }
 
-        public void warn(Marker marker, String format, Object[] argArray) {
+        public void warn(Marker marker, String format, Object... argArray) {
             fail("Unexpected call");
         }
 
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverTest.java b/src/test/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverTest.java
index c764703..45ab297 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/ScriptingResourceResolverTest.java
@@ -16,19 +16,21 @@
  ******************************************************************************/
 package org.apache.sling.scripting.core.impl;
 
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import java.util.Map;
 
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.*;
-
-@SuppressWarnings({"unchecked", "deprecation"})
+@SuppressWarnings({"unchecked"})
 public class ScriptingResourceResolverTest {
 
     private ScriptingResourceResolver scriptingResourceResolver;
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/ServiceCacheTest.java b/src/test/java/org/apache/sling/scripting/core/impl/ServiceCacheTest.java
index ccbb6c0..90144e6 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/ServiceCacheTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/ServiceCacheTest.java
@@ -18,21 +18,19 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.scripting.core.impl;
 
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
 import java.util.Dictionary;
 import java.util.Hashtable;
 
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
-import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
 public class ServiceCacheTest {
 
     @Rule
@@ -94,6 +92,7 @@
     }
 
     private static final class TestService {
+        @SuppressWarnings("unused")
         private final String service;
 
         public TestService(String service) {
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnitTest.java b/src/test/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnitTest.java
index 2c3aca2..7ba5923 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnitTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnitTest.java
@@ -61,7 +61,6 @@
         serviceCache = new ServiceCache(bundleContext);
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
     public void testGetService() throws Exception {
         Object fooBarSvc = new Object();
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContextTest.java b/src/test/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContextTest.java
index 342c385..41f7883 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContextTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/bundled/BundledScriptContextTest.java
@@ -18,19 +18,18 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.scripting.core.impl.bundled;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
 import javax.script.Bindings;
 import javax.script.ScriptContext;
 import javax.script.SimpleBindings;
 
 import org.apache.sling.api.scripting.SlingScriptConstants;
-import org.apache.sling.scripting.core.impl.bundled.BundledScriptContext;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
 public class BundledScriptContextTest {
 
     @Test
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/bundled/LogWriterTest.java b/src/test/java/org/apache/sling/scripting/core/impl/bundled/LogWriterTest.java
index 850a0e0..6dbc3a1 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/bundled/LogWriterTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/bundled/LogWriterTest.java
@@ -18,14 +18,13 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.scripting.core.impl.bundled;
 
-import org.apache.sling.scripting.core.impl.bundled.LogWriter;
-import org.junit.Test;
-import org.slf4j.Logger;
-
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
+import org.junit.Test;
+import org.slf4j.Logger;
+
 public class LogWriterTest {
 
     @Test
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindingsTest.java b/src/test/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindingsTest.java
index aeccaef..e8b2a06 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindingsTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/helper/ProtectedBindingsTest.java
@@ -24,6 +24,8 @@
 
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.Test.None;
+
 import static org.junit.Assert.*;
 
 
@@ -52,12 +54,12 @@
         bindings.remove("test1");
     }
 
-    @Test
+    @Test(expected=None.class)
     public void testAddingAllowed() {
         bindings.put("test2", "value2");
     }
 
-    @Test
+    @Test(expected=None.class)
     public void testOverwriteNonProtectedAllowed() {
         bindings.put("test2", "value2");
         bindings.put("test2", "value3");
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
index 761a114..2e4b961 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
@@ -87,7 +87,9 @@
                 (latch, "org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager/UPDATED");
         context.registerService(
                 EventHandler.class, eventHandler,
-                new HashMap<String, Object>() {{
+                new HashMap<String, Object>() {
+                    private static final long serialVersionUID = -826334194042415106L;
+                {
                     put(EventConstants.EVENT_TOPIC, "org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager/*");
                 }}
         );
@@ -98,11 +100,15 @@
                 .singletonList("f2/text"));
 
         ServiceRegistration<ScriptEngineFactory> f1SR = context.bundleContext().registerService(ScriptEngineFactory.class, f1, new
-                Hashtable<String, Object>() {{
+                Hashtable<String, Object>() {
+                    private static final long serialVersionUID = 3476669145432094983L;
+                {
                     put(Constants.SERVICE_RANKING, 2);
                 }});
         context.bundleContext().registerService(ScriptEngineFactory.class, f2, new
-                Hashtable<String, Object>() {{
+                Hashtable<String, Object>() {
+                    private static final long serialVersionUID = 625624336896085659L;
+                {
                     put(Constants.SERVICE_RANKING, 1);
                 }});
 
diff --git a/src/test/java/org/apache/sling/scripting/core/it/BindingsValuesProvidersByContextIT.java b/src/test/java/org/apache/sling/scripting/core/it/BindingsValuesProvidersByContextIT.java
index 31a18f8..19ad338 100644
--- a/src/test/java/org/apache/sling/scripting/core/it/BindingsValuesProvidersByContextIT.java
+++ b/src/test/java/org/apache/sling/scripting/core/it/BindingsValuesProvidersByContextIT.java
@@ -60,7 +60,7 @@
     @Inject
     private BundleContext bundleContext;
 
-    private final List<ServiceRegistration> regs = new ArrayList<ServiceRegistration>();
+    private final List<ServiceRegistration<?>> regs = new ArrayList<>();
 
     @Before
     public void setup() {
@@ -69,7 +69,7 @@
 
     @After
     public void cleanup() {
-        for (ServiceRegistration reg : regs) {
+        for (ServiceRegistration<?> reg : regs) {
             reg.unregister();
         }
     }
diff --git a/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java b/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java
index 94794d9..0fbcf17 100644
--- a/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java
+++ b/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java
@@ -18,6 +18,15 @@
  */
 package org.apache.sling.scripting.core.it;
 
+import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingScriptingSightly;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingScriptingThymeleaf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.ops4j.pax.exam.CoreOptions.composite;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+
 import java.io.IOException;
 
 import javax.inject.Inject;
@@ -40,15 +49,6 @@
 import org.ops4j.pax.exam.util.Filter;
 import org.osgi.service.http.HttpService;
 
-import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
-import static org.apache.sling.testing.paxexam.SlingOptions.slingScriptingSightly;
-import static org.apache.sling.testing.paxexam.SlingOptions.slingScriptingThymeleaf;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-import static org.ops4j.pax.exam.CoreOptions.composite;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
-
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
 public class HtmlScriptingIT extends ScriptingCoreTestSupport {
