diff --git a/bnd.bnd b/bnd.bnd
index 1c193b8..668c21e 100644
--- a/bnd.bnd
+++ b/bnd.bnd
@@ -35,18 +35,14 @@
                 *
 Private-Package: org.apache.sling.xss.impl, \
                  org.apache.batik.*, \
-                 com.google.common.base, \
-                 com.google.common.collect, \
-                 com.google.common.io, \
-                 com.google.common.base.internal, \
-                 com.google.common.graph, \
-                 com.google.common.hash, \
-                 com.google.common.math, \
-                 com.google.common.primitives, \
                  org.w3c.css.sac, \
                  org.apache.commons.beanutils.*, \
                  org.apache.commons.configuration.*, \
                  org.apache.commons.logging.impl, \
                  org.owasp.esapi.*;-split-package:=merge-first, \
                  org.owasp.validator.*, \
+                 org.owasp.shim;-split-package:=merge-first, \
                  org.owasp.html.*;-split-package:=merge-first
+# Override Java 10 requirement detected due to java10 shim 
+# as it is only used at runtime if applicable
+Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
diff --git a/pom.xml b/pom.xml
index 593f7aa..859bf1b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,7 +80,11 @@
                             <ignore>org.apache.avalon.*</ignore> 
                             <ignore>org.apache.log.*</ignore> 
                             <ignore>org.owasp.validator.html.*</ignore> 
-                            <ignore>org.w3c.dom.svg.*</ignore> 
+                            <ignore>org.w3c.dom.svg.*</ignore>
+                            <!-- Classes with newer method signatures dynamically loaded by the java-html-sanitizer java10 shim -->
+                            <ignore>java.util.Set</ignore>
+                            <ignore>java.util.Map</ignore>
+                            <ignore>java.util.List</ignore>
                         </ignores>
                         <annotations>com.google.common.hash.IgnoreJRERequirement</annotations>
                     </configuration>
@@ -169,33 +173,6 @@
                     </includes>
                 </configuration>
             </plugin>
-            <!-- Shade 3rdparty libs to avoid classpath conflicts in unit tests -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <configuration>
-                    <artifactSet>
-                        <includes>
-                            <include>com.google.guava:*</include>
-                        </includes>
-                    </artifactSet>
-                    <createSourcesJar>true</createSourcesJar>
-                    <relocations>
-                        <relocation>
-                            <pattern>com.google.common</pattern>
-                            <shadedPattern>slingxss.com.google.common</shadedPattern>
-                        </relocation>
-                     </relocations>
-                </configuration>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
         </plugins>
     </build>
 
@@ -206,7 +183,7 @@
         <dependency>
             <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
             <artifactId>owasp-java-html-sanitizer</artifactId>
-            <version>20220608.1</version>
+            <version>20240325.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -360,12 +337,6 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>32.1.3-jre</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter</artifactId>
             <version>5.8.2</version>
diff --git a/src/main/java/org/apache/sling/xss/impl/AntiSamyPolicyAdapter.java b/src/main/java/org/apache/sling/xss/impl/AntiSamyPolicyAdapter.java
index 19504f1..5a682a3 100644
--- a/src/main/java/org/apache/sling/xss/impl/AntiSamyPolicyAdapter.java
+++ b/src/main/java/org/apache/sling/xss/impl/AntiSamyPolicyAdapter.java
@@ -23,6 +23,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Predicate;
 import java.util.regex.Pattern;
 
 import org.apache.sling.xss.impl.style.CssValidator;
@@ -34,8 +35,6 @@
 import org.owasp.html.HtmlPolicyBuilder;
 import org.owasp.html.PolicyFactory;
 
-import com.google.common.base.Predicate;
-
 import sun.misc.Unsafe;
 
 public class AntiSamyPolicyAdapter {
@@ -210,7 +209,7 @@
     private static Predicate<String> matchesToPatterns(List<Pattern> patternList) {
         return new Predicate<String>() {
             @Override
-            public boolean apply(String s) {
+            public boolean test(String s) {
                 for (Pattern pattern : patternList) {
                     if (pattern.matcher(s).matches()) {
                         return true;
@@ -224,10 +223,10 @@
     private static Predicate<String> matchesPatternsOrLiterals(List<Pattern> patternList, boolean ignoreCase, List<String> literalList) {
         return new Predicate<String>() {
             @Override
-            public boolean apply(String s) {
+            public boolean test(String s) {
                 // check if the string matches to the pattern or one of the literal
                 s = ignoreCase ? s.toLowerCase() : s;
-                return matchesToPatterns(patternList).apply(s) || literalList.contains(s);
+                return matchesToPatterns(patternList).test(s) || literalList.contains(s);
             }
         };
     }
@@ -237,14 +236,14 @@
             @Override
             public @Nullable String apply(String elementName, String attributeName, String value) {
                 if (!literalList.isEmpty() && !patternList.isEmpty()) {
-                    return matchesPatternsOrLiterals(patternList, ignoreCase, literalList).apply(value) ? value : null;
+                    return matchesPatternsOrLiterals(patternList, ignoreCase, literalList).test(value) ? value : null;
 
                 } else if (!literalList.isEmpty()) {
                     value = ignoreCase ? value.toLowerCase() : value;
                     return literalList.contains(value) ? value : null;
 
                 } else if (!patternList.isEmpty()) {
-                    return matchesToPatterns(patternList).apply(value) ? value : null;
+                    return matchesToPatterns(patternList).test(value) ? value : null;
                 }
                 return null;
             }
diff --git a/src/main/java/org/apache/sling/xss/impl/HtmlSanitizer.java b/src/main/java/org/apache/sling/xss/impl/HtmlSanitizer.java
index 777068a..a9cd975 100644
--- a/src/main/java/org/apache/sling/xss/impl/HtmlSanitizer.java
+++ b/src/main/java/org/apache/sling/xss/impl/HtmlSanitizer.java
@@ -19,7 +19,9 @@
 package org.apache.sling.xss.impl;
 
 import java.lang.reflect.Field;
+import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 import org.apache.sling.xss.impl.xml.AntiSamyPolicy;
 import org.owasp.html.DynamicAttributesSanitizerPolicy;
@@ -28,14 +30,11 @@
 import org.owasp.html.HtmlStreamRenderer;
 import org.owasp.html.PolicyFactory;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
 public class HtmlSanitizer {
 
     private AntiSamyPolicyAdapter customPolicy;
-    private ImmutableMap policies;
-    private ImmutableSet<String> textContainers;
+    private Map policies;
+    private Set<String> textContainers;
 
     public HtmlSanitizer(AntiSamyPolicy policy) {
         this.customPolicy = new AntiSamyPolicyAdapter(policy);
@@ -54,23 +53,23 @@
         return new SanitizedResult(sb.toString(), dynamicPolicy.getNumberOfErrors());
     }
 
-    private ImmutableSet<String> reflectionGetTextContainers(PolicyFactory policyFactory) {
+    private Set<String> reflectionGetTextContainers(PolicyFactory policyFactory) {
         Class<?> c = policyFactory.getClass();
         try {
             Field field = c.getDeclaredField("textContainers");
             field.setAccessible(true);
-            return (ImmutableSet<String>) field.get(policyFactory);
+            return (Set<String>) field.get(policyFactory);
         } catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
             throw new RuntimeException(e);
         }
     }
 
-    private ImmutableMap reflectionGetPolicies(PolicyFactory policyFactory) {
+    private Map reflectionGetPolicies(PolicyFactory policyFactory) {
         Class<?> c = policyFactory.getClass();
         try {
             Field field = c.getDeclaredField("policies");
             field.setAccessible(true);
-            return (ImmutableMap) field.get(policyFactory);
+            return (Map) field.get(policyFactory);
         } catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
             throw new RuntimeException(e);
         }
diff --git a/src/main/java/org/owasp/html/DynamicAttributesSanitizerPolicy.java b/src/main/java/org/owasp/html/DynamicAttributesSanitizerPolicy.java
index cd8b460..41f22ba 100644
--- a/src/main/java/org/owasp/html/DynamicAttributesSanitizerPolicy.java
+++ b/src/main/java/org/owasp/html/DynamicAttributesSanitizerPolicy.java
@@ -19,18 +19,15 @@
 package org.owasp.html;
 
 import java.lang.reflect.InvocationTargetException;
-
 import java.lang.reflect.Method;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import org.jetbrains.annotations.Nullable;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
 /**
  * Extends the default policy to support dynamic attributes.
  * 
@@ -47,8 +44,8 @@
   private int numberOfErrors;
 
   public DynamicAttributesSanitizerPolicy(HtmlStreamEventReceiver out,
-      ImmutableMap<String, ElementAndAttributePolicies> elAndAttrPolicies,
-      ImmutableSet<String> allowedTextContainers,
+      Map<String, ElementAndAttributePolicies> elAndAttrPolicies,
+      Set<String> allowedTextContainers,
       Map<String, AttributePolicy> dynamicAttributesPolicyMap, List<String> onInvalidRemoveTagList) {
     super(out, elAndAttrPolicies, allowedTextContainers);
     this.elementAndAttrPolicies = elAndAttrPolicies;
