diff --git a/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java b/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java
index 6755e2127402d12ab1cb46c6397d4f23d1e5d262..f4daa077199cab962e0adb735eb61a043c462847 100644
--- a/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java
+++ b/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java
@@ -140,7 +140,13 @@ public class JamsCA implements CertificateAuthority {
     @Override
     public boolean shutdownThreads() {
         //Unsafe but acceptable.
-        crlWorker.stop();
+        crlWorker.getStop().set(true);
+        crlWorker.interrupt();
+        Thread.State state = crlWorker.getState();
+        while(!state.equals(Thread.State.TERMINATED)){
+            state = crlWorker.getState();
+        }
+        crlWorker = null;
         ocspWorker.stop();
         return true;
     }
diff --git a/jams-ca/src/main/java/net/jami/jams/ca/workers/crl/CRLWorker.java b/jams-ca/src/main/java/net/jami/jams/ca/workers/crl/CRLWorker.java
index 08a08136cfca9149d8328fdc87b32b60e71efb09..5dea70100df5627b1f35cf79bcf516caa714e55a 100644
--- a/jams-ca/src/main/java/net/jami/jams/ca/workers/crl/CRLWorker.java
+++ b/jams-ca/src/main/java/net/jami/jams/ca/workers/crl/CRLWorker.java
@@ -23,6 +23,7 @@
 package net.jami.jams.ca.workers.crl;
 
 import lombok.Getter;
+import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import net.jami.jams.ca.JamsCA;
 import net.jami.jams.ca.workers.X509Worker;
@@ -36,6 +37,7 @@ import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
 import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 import java.util.Date;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 @Slf4j
@@ -44,6 +46,9 @@ public class CRLWorker extends X509Worker<RevocationRequest> {
     @Getter
     private AtomicReference<X509CRLHolder> existingCRL = null;
 
+    @Getter @Setter
+    private AtomicBoolean stop = new AtomicBoolean(false);
+
     public CRLWorker(PrivateKey privateKey, X509Certificate certificate) {
         super(privateKey, certificate);
         this.setDaemon(true);
@@ -74,7 +79,7 @@ public class CRLWorker extends X509Worker<RevocationRequest> {
     @Override
     public void run() {
         boolean needsRefresh = false;
-        while(true){
+        while(!stop.get()){
             try{
                 while(getInput().isEmpty()){
                     if(needsRefresh){
@@ -97,5 +102,6 @@ public class CRLWorker extends X509Worker<RevocationRequest> {
                 log.error("An error has occured in the CRL signing thread: " + e.toString());
             }
         }
+        log.info("Stopped CRL Worker Thread...");
     }
 }
diff --git a/jams-launcher/src/main/java/launcher/AppStarter.java b/jams-launcher/src/main/java/launcher/AppStarter.java
index d19d7dd1f502cea4b87c64740143b68ac9fccdf6..c91ad52be40c330a6a83c51c0ca20e2bdef8a50b 100644
--- a/jams-launcher/src/main/java/launcher/AppStarter.java
+++ b/jams-launcher/src/main/java/launcher/AppStarter.java
@@ -87,6 +87,7 @@ public class AppStarter extends Thread {
                 }
                 if(doUpdate.get()){
                     Server.tomcatLauncher.stopTomcat();
+                    LibraryLoader.classLoader.destroy();
                     //This will trigger a force reload of the lib.
                     LibraryLoader.loadlibs(System.getProperty("user.dir"), AppStarter.class);
                     server = ServerLoader.loadServer(appUpdater, Integer.toString(port), serverCertificate, serverPrivateKey);
diff --git a/jams-server/src/main/java/net/jami/jams/server/Server.java b/jams-server/src/main/java/net/jami/jams/server/Server.java
index 536f915d9de8503fe9628eabff4c31edb9de5b37..4d7b439de8646505533467a9d9095f470838d1ca 100644
--- a/jams-server/src/main/java/net/jami/jams/server/Server.java
+++ b/jams-server/src/main/java/net/jami/jams/server/Server.java
@@ -77,7 +77,7 @@ public class Server {
     }
 
 
-    public static void main(String[] args) {
+    public void main(String[] args) {
         //Start tomcat.
         switch (args.length) {
             case 0:
diff --git a/jams-server/src/main/java/net/jami/jams/server/core/TomcatConnectorFactory.java b/jams-server/src/main/java/net/jami/jams/server/core/TomcatConnectorFactory.java
index cb661365fe81fc312491486c671d83cf0c543586..fc0ba39fdb7eb5d6fbdb34350acce4c69984ac89 100644
--- a/jams-server/src/main/java/net/jami/jams/server/core/TomcatConnectorFactory.java
+++ b/jams-server/src/main/java/net/jami/jams/server/core/TomcatConnectorFactory.java
@@ -24,6 +24,8 @@ package net.jami.jams.server.core;
 
 import lombok.extern.slf4j.Slf4j;
 import org.apache.catalina.connector.Connector;
+import org.apache.tomcat.util.net.SSLHostConfig;
+import org.apache.tomcat.util.net.SSLHostConfigCertificate;
 
 import java.io.File;
 
@@ -33,25 +35,26 @@ public class TomcatConnectorFactory {
     public static Connector getSSLConnectorWithTrustStore(String certificateFile, String keyFile, int port) {
         log.info(System.getProperty("user.dir") + File.separator + "keystore.jks");
         Connector connector = getSSLConnectorWithoutTrustStore(certificateFile, keyFile, port);
-        connector.setAttribute("truststoreFile", System.getProperty("user.dir") + File.separator + "keystore.jks");
-        connector.setAttribute("clientAuth", "optional");
-        connector.setAttribute("truststorePassword", "changeit");
+        //connector.setAttribute("truststoreFile", System.getProperty("user.dir") + File.separator + "keystore.jks");
+        //connector.setAttribute("clientAuth", "optional");
+        //connector.setAttribute("truststorePassword", "changeit");
         return connector;
     }
 
     public static Connector getSSLConnectorWithoutTrustStore(String certificateFile, String keyFile, int port) {
         //Check if trust store exists or create it if necessary.
         Connector connector = new Connector();
+        SSLHostConfig sslConfig = new SSLHostConfig();
+        SSLHostConfigCertificate sslHostConfigCertificate = new SSLHostConfigCertificate(sslConfig, SSLHostConfigCertificate.Type.RSA);
+        sslHostConfigCertificate.setCertificateFile(System.getProperty("user.dir") + File.separator + certificateFile);
+        sslHostConfigCertificate.setCertificateKeyFile(System.getProperty("user.dir") + File.separator + keyFile);
+        sslConfig.addCertificate(sslHostConfigCertificate);
+        sslConfig.setProtocols("TLSv1.3");
+        connector.addSslHostConfig(sslConfig);
         connector.setPort(port);
         connector.setSecure(true);
         connector.setScheme("https");
-        connector.setAttribute("protocol", "org.apache.coyote.http11.Http11AprProtocol");
-        connector.setAttribute("SSLCertificateFile", System.getProperty("user.dir") + File.separator + certificateFile);
-        connector.setAttribute("SSLCertificateKeyFile", System.getProperty("user.dir") + File.separator + keyFile);
-        connector.setAttribute("protocol", "HTTP/1.1");
-        connector.setAttribute("sslProtocol", "TLS");
-        connector.setAttribute("maxThreads", "200");
-        connector.setAttribute("SSLEnabled", true);
+        connector.setProperty("SSLEnabled", "true");
         return connector;
     }
 
@@ -60,9 +63,6 @@ public class TomcatConnectorFactory {
         Connector connector = new Connector();
         connector.setPort(port);
         connector.setScheme("http");
-        connector.setAttribute("protocol", "org.apache.coyote.http11.Http11NioProtocol");
-        connector.setAttribute("protocol", "HTTP/1.1");
-        connector.setAttribute("maxThreads", "200");
         return connector;
     }
 
diff --git a/jams-server/src/main/java/net/jami/jams/server/core/TomcatLauncher.java b/jams-server/src/main/java/net/jami/jams/server/core/TomcatLauncher.java
index c3c8b9f9b7db42db14183bc075d41d20a0628ff0..6d440e06f828fe94ce709fdddc0105fda6e236a4 100644
--- a/jams-server/src/main/java/net/jami/jams/server/core/TomcatLauncher.java
+++ b/jams-server/src/main/java/net/jami/jams/server/core/TomcatLauncher.java
@@ -25,10 +25,13 @@ package net.jami.jams.server.core;
 
 import lombok.extern.slf4j.Slf4j;
 import net.jami.jams.ca.JamsCA;
+import net.jami.jams.common.utils.LibraryLoader;
 import net.jami.jams.server.Server;
 import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.loader.WebappClassLoader;
+import org.apache.catalina.loader.WebappClassLoaderBase;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.webresources.DirResourceSet;
 import org.apache.catalina.webresources.JarResourceSet;
@@ -48,9 +51,9 @@ import static net.jami.jams.server.Server.certificateAuthority;
 @Slf4j
 public class TomcatLauncher {
 
-    private Tomcat tomcat = new Tomcat();
-    private static Connector connector;
-    private static StandardContext context;
+    private final Tomcat tomcat = new Tomcat();
+    private Connector connector;
+    private StandardContext context;
 
     public TomcatLauncher(int port) {
         tomcat.getService().addConnector(TomcatConnectorFactory.getNoSSLConnector(port));
@@ -122,8 +125,9 @@ public class TomcatLauncher {
             synchronized (tomcat) {
                 certificateAuthority.shutdownThreads();
                 tomcat.stop();
-                tomcat.destroy();
                 context.destroy();
+                tomcat.destroy();
+                LibraryLoader.classLoader.destroy();
             }
         } catch (Exception e) {
             log.info("Failed to stop tomcat server with error {}", e.getMessage());
diff --git a/pom.xml b/pom.xml
index bfce65ea3968cfd9cd76275c90dbee30ac8a3d8d..556e86bd3201d83ebb036424b808af31b916bd9f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,7 @@
         <lombok.version>1.18.12</lombok.version>
         <log4j.version>1.7.30</log4j.version>
         <jupiter.api.version>5.7.0-M1</jupiter.api.version>
-        <tomcat.version>9.0.35</tomcat.version>
+        <tomcat.version>10.0.0-M5</tomcat.version>
         <map.struct.version>1.3.0.Final</map.struct.version>
         <maven.surefire.version>2.19.1</maven.surefire.version>
         <junit.surefire.version>1.1.0</junit.surefire.version>