diff --git a/pom.xml b/pom.xml
index 6fc05e9..c0da355 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,13 +99,13 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.xss</artifactId>
-            <version>2.0.0</version>
+            <version>2.2.12</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.api</artifactId>
-            <version>2.16.4</version>
+            <version>2.23.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -142,7 +142,7 @@
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
-            <version>1.9.5</version>
+            <version>3.9.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -166,7 +166,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.servlet-helpers</artifactId>
-            <version>1.1.6</version>
+            <version>1.4.2</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java b/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java
index c39199c..1df52bd 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java
@@ -148,43 +148,48 @@
             final ValueMap vm = resource.adaptTo(ValueMap.class);
             final String actualResourcePath = vm.get(JcrConstants.JCR_CONTENT, String.class);
             resource = request.getResourceResolver().getResource(actualResourcePath);
+            if (resource == null) {
+                log.warn("Path {} does not exist",actualResourcePath);
+                return;
+            }
         }
-        InputStream stream = resource.adaptTo(InputStream.class);
-        if (stream != null) {
-            if ( stream instanceof ExternalizableInputStream) {
-                response.sendRedirect(((ExternalizableInputStream)stream).getURI().toString());
-                return;
-            }
-            if (isHeadRequest(request)) {
-                setContentLength(response, resource.getResourceMetadata().getContentLength());
-                setHeaders(resource, response);
-                return;
-            }
 
-            streamResource(resource, stream, included, request, response);
-
-        } else {
-
-            // the resource is the root, do not redirect, immediately index
-            if (isRootResourceRequest(resource)) {
-
-                renderDirectory(request, response, included);
-
-            } else if (included || response.isCommitted() ) {
-
-                // request is included or committed, not redirecting
-                request.getRequestProgressTracker().log(
-                    "StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
-                log.warn("StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
+        try (InputStream stream = resource.adaptTo(InputStream.class)) {
+            if (stream != null) {
+                if ( stream instanceof ExternalizableInputStream) {
+                    response.sendRedirect(((ExternalizableInputStream)stream).getURI().toString());
+                    return;
+                }
+                if (isHeadRequest(request)) {
+                    setContentLength(response, resource.getResourceMetadata().getContentLength());
+                    setHeaders(resource, response);
+                    return;
+                }
+                streamResource(resource, stream, included, request, response);
 
             } else {
 
-                // redirect to this with trailing slash to render the index
-                String url = request.getResourceResolver().map(request,
-                    resource.getPath())
-                    + "/";
-                response.sendRedirect(url);
+                // the resource is the root, do not redirect, immediately index
+                if (isRootResourceRequest(resource)) {
 
+                    renderDirectory(request, response, included);
+
+                } else if (included || response.isCommitted() ) {
+
+                    // request is included or committed, not redirecting
+                    request.getRequestProgressTracker().log(
+                        "StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
+                    log.warn("StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
+
+                } else {
+
+                    // redirect to this with trailing slash to render the index
+                    String url = request.getResourceResolver().map(request,
+                        resource.getPath())
+                        + "/";
+                    response.sendRedirect(url);
+
+                }
             }
         }
     }
@@ -225,60 +230,55 @@
             final SlingHttpServletRequest request,
             final SlingHttpServletResponse response) throws IOException {
         // finally stream the resource
-        try {
 
-            final ArrayList<Range> ranges;
-            if (included) {
-                // no range support on included requests
-                ranges = FULL;
+        final ArrayList<Range> ranges;
+        if (included) {
+            // no range support on included requests
+            ranges = FULL;
 
-            } else {
-                // parse optional ranges
-                ranges = parseRange(request, response,
+        } else {
+            // parse optional ranges
+            ranges = parseRange(request, response,
                     resource.getResourceMetadata());
-                if (ranges == null) {
-                    // there was something wrong, the parseRange has sent a
-                    // response and we are done
-                    return;
-                }
-
-                // set various response headers, unless the request is included
-                setHeaders(resource, response);
+            if (ranges == null) {
+                // there was something wrong, the parseRange has sent a
+                // response and we are done
+                return;
             }
 
-            ServletOutputStream out = response.getOutputStream();
+            // set various response headers, unless the request is included
+            setHeaders(resource, response);
+        }
 
-            if (ranges == FULL) {
-                // return full resource
-                setContentLength(response,
+        ServletOutputStream out = response.getOutputStream();
+
+        if (ranges == FULL) {
+            // return full resource
+            setContentLength(response,
                     resource.getResourceMetadata().getContentLength());
-                byte[] buf = new byte[IO_BUFFER_SIZE];
-                int rd;
-                while ((rd = stream.read(buf)) >= 0) {
-                    out.write(buf, 0, rd);
-                }
-            } else {
-                // return ranges of the resource
-                response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+            byte[] buf = new byte[IO_BUFFER_SIZE];
+            int rd;
+            while ((rd = stream.read(buf)) >= 0) {
+                out.write(buf, 0, rd);
+            }
+        } else {
+            // return ranges of the resource
+            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
 
-                if (ranges.size() == 1) {
-                    Range range = ranges.get(0);
-                    response.addHeader("Content-Range", "bytes " + range.start
+            if (ranges.size() == 1) {
+                Range range = ranges.get(0);
+                response.addHeader("Content-Range", "bytes " + range.start
                         + "-" + range.end + "/" + range.length);
-                    setContentLength(response, range.end - range.start + 1);
-                    copy(stream, out, range);
-                } else {
+                setContentLength(response, range.end - range.start + 1);
+                copy(stream, out, range);
+            } else {
 
-                    response.setContentType("multipart/byteranges; boundary="
+                response.setContentType("multipart/byteranges; boundary="
                         + mimeSeparation);
 
-                    copy(resource, out, ranges.iterator());
-                }
-
+                copy(resource, out, ranges.iterator());
             }
 
-        } finally {
-            closeSilently(stream);
         }
     }
 
@@ -449,11 +449,12 @@
 
         String name = ResourceUtil.getName(resource.getPath());
 
-        InputStream ins = resource.adaptTo(InputStream.class);
-        if (ins == null) {
-            name += "/";
-        } else {
-            closeSilently(ins);
+        try (InputStream ins = resource.adaptTo(InputStream.class)) {
+            if (ins == null) {
+                name += "/";
+            }
+        } catch (IOException e) {
+            // ignore
         }
 
         String displayName = name;
@@ -505,10 +506,9 @@
         while ((exception == null) && (ranges.hasNext())) {
 
             InputStream resourceInputStream = resource.adaptTo(InputStream.class);
-            InputStream istream = new BufferedInputStream(resourceInputStream,
-                IO_BUFFER_SIZE);
 
-            try {
+            try (InputStream istream = new BufferedInputStream(resourceInputStream,
+                    IO_BUFFER_SIZE)) {
                 Range currentRange = ranges.next();
 
                 // Writing MIME header.
@@ -527,10 +527,7 @@
                 } catch(IOException e) {
                     exception = e;
                 }
-            } finally {
-                closeSilently(istream);
-            }
-
+            } 
         }
 
         ostream.println();
@@ -725,15 +722,6 @@
         response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
     }
 
-    private void closeSilently(final Closeable closeable) {
-        if (closeable != null) {
-            try {
-                closeable.close();
-            } catch (IOException ignore) {
-            }
-        }
-    }
-
     // --------- Range Inner Class
 
     protected class Range {
