diff --git a/.devcontainer/development/Dockerfile b/.devcontainer/development/Dockerfile
index 75027efa83..78d8d5d66f 100644
--- a/.devcontainer/development/Dockerfile
+++ b/.devcontainer/development/Dockerfile
@@ -1,8 +1,9 @@
-FROM openjdk:11-jdk-slim
+FROM openjdk:21-jdk-slim
 
 # Set environment variables for Tomcat
 ENV CATALINA_HOME /usr/local/tomcat
 ENV PATH $CATALINA_HOME/bin:$PATH
+ENV CATALINA_OPTS="--add-opens java.base/java.net=ALL-UNNAMED"
 
 # Copy Tomcat installation from the official Tomcat image
 COPY --from=tomcat:9.0.97 /usr/local/tomcat $CATALINA_HOME
diff --git a/src/main/java/oscar/login/jaas/BaseLoginModule.java b/src/main/java/oscar/login/jaas/BaseLoginModule.java
index 65b031c925..0a87f96cdf 100644
--- a/src/main/java/oscar/login/jaas/BaseLoginModule.java
+++ b/src/main/java/oscar/login/jaas/BaseLoginModule.java
@@ -26,7 +26,6 @@
 
 import java.io.IOException;
 import java.security.Principal;
-import java.security.acl.Group;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -66,11 +65,11 @@ public class BaseLoginModule implements LoginModule {
 
     private OscarPrincipal principal;
 
-    private Group rolesGroup;
+    private OscarGroup rolesGroup;
 
-    private Group callerPrincipal;
+    private OscarGroup callerPrincipal;
 
-    private Group authPrincipal;
+    private OscarGroup authPrincipal;
 
     private boolean authorizationEnabled = false;
 
@@ -164,7 +163,7 @@ public boolean login() throws LoginException {
             authPrincipal.addMember(getPrincipal());
             setAuthPrincipal(authPrincipal);
 
-            Group rolesGroup = new OscarGroup("Roles");
+            OscarGroup rolesGroup = new OscarGroup("Roles");
             for (OscarRole role : getRoles(loginName)) {
                 rolesGroup.addMember(role);
             }
@@ -275,27 +274,27 @@ public void setSharedState(Map<String, ?> sharedState) {
         this.sharedState = sharedState;
     }
 
-    public Group getRolesGroup() {
+    public OscarGroup getRolesGroup() {
         return rolesGroup;
     }
 
-    public void setRolesGroup(Group rolesGroup) {
+    public void setRolesGroup(OscarGroup rolesGroup) {
         this.rolesGroup = rolesGroup;
     }
 
-    public Group getCallerPrincipal() {
+    public OscarGroup getCallerPrincipal() {
         return callerPrincipal;
     }
 
-    public void setCallerPrincipal(Group callerPrincipal) {
+    public void setCallerPrincipal(OscarGroup callerPrincipal) {
         this.callerPrincipal = callerPrincipal;
     }
 
-    public Group getAuthPrincipal() {
+    public OscarGroup getAuthPrincipal() {
         return authPrincipal;
     }
 
-    public void setAuthPrincipal(Group authPrincipal) {
+    public void setAuthPrincipal(OscarGroup authPrincipal) {
         this.authPrincipal = authPrincipal;
     }
 
diff --git a/src/main/java/oscar/login/jaas/OscarGroup.java b/src/main/java/oscar/login/jaas/OscarGroup.java
index f331e1c99d..9d5dc8f6cd 100644
--- a/src/main/java/oscar/login/jaas/OscarGroup.java
+++ b/src/main/java/oscar/login/jaas/OscarGroup.java
@@ -26,13 +26,12 @@
 
 import java.io.Serializable;
 import java.security.Principal;
-import java.security.acl.Group;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 
-public class OscarGroup implements Group, Serializable {
+public class OscarGroup implements Principal, Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -56,25 +55,44 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Override
+    /**
+     * Adds a member to the group.
+     *
+     * @param user the Principal to be added
+     * @return true whether the member was added
+     */
     public boolean addMember(Principal user) {
         if (!principals.contains(user))
             principals.add(user);
         return true;
     }
 
-    @Override
+    /**
+     * Removes a member from the group.
+     *
+     * @param user the Principal to be removed
+     * @return true whether the member was removed
+     */
     public boolean removeMember(Principal user) {
         principals.remove(user);
         return true;
     }
 
-    @Override
+    /**
+     * Checks if a Principal is a member of the group.
+     *
+     * @param member the Principal to be checked
+     * @return true if the member exists in the group
+     */
     public boolean isMember(Principal member) {
         return principals.contains(member);
     }
 
-    @Override
+    /**
+     * Returns an enumeration of the group's members.
+     *
+     * @return an Enumeration of the members
+     */
     public Enumeration<? extends Principal> members() {
         return Collections.enumeration(principals);
     }