Port from Jetty 11 to 12.
diff --git a/README.md b/README.md
index 18ee2ee..2fca166 100644
--- a/README.md
+++ b/README.md
@@ -55,4 +55,4 @@
 ## Building
 Building requires:
 * [Apache Maven](https://maven.apache.org/)
-* Java 17 is required to build, but Java 11 is sufficient to run unless you need Spring.
+* Java 17 is required to build and run.
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index bf4cf7d..b46f002 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -15,6 +15,7 @@
 Release Notes - Juneau - Version 9.1.0
 
     * Bump Java platform requirement from Java 11 to 17.
+    * [JUNEAU-262] Port Jetty from 11.0.20 to 12.0.9
     * [JUNEAU-252] Bump org.eclipse.jgit:org.eclipse.jgit from 6.6.1.202309021850-r to 6.9.0.202403050737-r #112, #123, #137.
     * [JUNEAU-253] Bump springboot.version from 3.1.3 to 3.2.4 #136, #138.
     * [JUNEAU-254] Bump jetty.version from 11.0.16 to 11.0.20.
diff --git a/juneau-doc/docs/Topics/13.juneau-microservice-jetty/03.jmj.ResourceClasses.html b/juneau-doc/docs/Topics/13.juneau-microservice-jetty/03.jmj.ResourceClasses.html
index 64dab90..48b0fd5 100644
--- a/juneau-doc/docs/Topics/13.juneau-microservice-jetty/03.jmj.ResourceClasses.html
+++ b/juneau-doc/docs/Topics/13.juneau-microservice-jetty/03.jmj.ResourceClasses.html
@@ -140,14 +140,14 @@
 			<p class='bxml'>
 				|	<xt>&lt;Configure</xt> <xa>id</xa>=<xs>"ExampleServer"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.Server"</xs><xt>&gt;</xt>
 				|		...
-				|		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
+				|		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
 				|			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
 				|			<xt>&lt;Call</xt> <xa>name</xa>=<xs>"addServlet"</xs><xt>&gt;</xt>
 				|				<xt>&lt;Arg&gt;</xt>org.apache.juneau.rest.test.Root<xt>&lt;/Arg&gt;</xt>
 				|				<xt>&lt;Arg&gt;</xt>/*<xt>&lt;/Arg&gt;</xt>
 				|			<xt>&lt;/Call&gt;</xt>
 				|			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
-				|				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs> <xt>/&gt;</xt>
+				|				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.nested.SessionHandler"</xs> <xt>/&gt;</xt>
 				|			<xt>&lt;/Set&gt;</xt>
 				|		<xt>&lt;/New&gt;</xt>
 				|		...
diff --git a/juneau-doc/docs/Topics/14.my-jetty-microservice/01.mjm.Installing.html b/juneau-doc/docs/Topics/14.my-jetty-microservice/01.mjm.Installing.html
index 6873efa..39bcbf2 100644
--- a/juneau-doc/docs/Topics/14.my-jetty-microservice/01.mjm.Installing.html
+++ b/juneau-doc/docs/Topics/14.my-jetty-microservice/01.mjm.Installing.html
@@ -217,7 +217,7 @@
 				|			<xt>&lt;/Array&gt;</xt>
 				|		<xt>&lt;/Set&gt;</xt>
 				|	
-				|		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
+				|		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
 				|			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
 				|			<xc>&lt;!-- Optionally specify your servlets here --&gt;
 				|			&lt;!--Call name="addServlet"&gt;
@@ -225,14 +225,14 @@
 				|				&lt;Arg&gt;/*&lt;/Arg&gt;
 				|			&lt;/Call--&gt;</xc>
 				|			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
-				|				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs><xt>/&gt;</xt>
+				|				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.nested.SessionHandler"</xs><xt>/&gt;</xt>
 				|			<xt>&lt;/Set&gt;</xt>
 				|		<xt>&lt;/New&gt;</xt>
 				|	
 				|		<xt>&lt;Set</xt> <xa>name</xa>=<xs>"handler"</xs><xt>&gt;</xt>
-				|			<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.handler.HandlerCollection"</xs><xt>&gt;</xt>
+				|			<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.nested.HandlerCollection"</xs><xt>&gt;</xt>
 				|				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"handlers"</xs><xt>&gt;</xt>
-				|					<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.server.Handler"</xs><xt>&gt;</xt>
+				|					<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.ee9.nested.Handler"</xs><xt>&gt;</xt>
 				|						<xt>&lt;Item&gt;</xt>
 				|							<xt>&lt;Ref</xt> <xa>refid</xa>=<xs>"context"</xs><xt>/&gt;</xt>
 				|						<xt>&lt;/Item&gt;</xt>
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 0c1188c..2769ff0 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -25801,14 +25801,14 @@
 			<p class='bxml'>
 	<xt>&lt;Configure</xt> <xa>id</xa>=<xs>"ExampleServer"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.Server"</xs><xt>&gt;</xt>
 		...
-		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
+		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
 			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
 			<xt>&lt;Call</xt> <xa>name</xa>=<xs>"addServlet"</xs><xt>&gt;</xt>
 				<xt>&lt;Arg&gt;</xt>org.apache.juneau.rest.test.Root<xt>&lt;/Arg&gt;</xt>
 				<xt>&lt;Arg&gt;</xt>/*<xt>&lt;/Arg&gt;</xt>
 			<xt>&lt;/Call&gt;</xt>
 			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
-				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs> <xt>/&gt;</xt>
+				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.nested.SessionHandler"</xs> <xt>/&gt;</xt>
 			<xt>&lt;/Set&gt;</xt>
 		<xt>&lt;/New&gt;</xt>
 		...
@@ -26560,7 +26560,7 @@
 			<xt>&lt;/Array&gt;</xt>
 		<xt>&lt;/Set&gt;</xt>
 	
-		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
+		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
 			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
 			<xc>&lt;!-- Optionally specify your servlets here --&gt;
 			&lt;!--Call name="addServlet"&gt;
@@ -26568,14 +26568,14 @@
 				&lt;Arg&gt;/*&lt;/Arg&gt;
 			&lt;/Call--&gt;</xc>
 			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
-				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs><xt>/&gt;</xt>
+				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.nested.SessionHandler"</xs><xt>/&gt;</xt>
 			<xt>&lt;/Set&gt;</xt>
 		<xt>&lt;/New&gt;</xt>
 	
 		<xt>&lt;Set</xt> <xa>name</xa>=<xs>"handler"</xs><xt>&gt;</xt>
-			<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.handler.HandlerCollection"</xs><xt>&gt;</xt>
+			<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.ee9.nested.HandlerCollection"</xs><xt>&gt;</xt>
 				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"handlers"</xs><xt>&gt;</xt>
-					<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.server.Handler"</xs><xt>&gt;</xt>
+					<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.ee9.nested.Handler"</xs><xt>&gt;</xt>
 						<xt>&lt;Item&gt;</xt>
 							<xt>&lt;Ref</xt> <xa>refid</xa>=<xs>"context"</xs><xt>/&gt;</xt>
 						<xt>&lt;/Item&gt;</xt>
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/jetty.xml b/juneau-examples/juneau-examples-rest-jetty/src/main/resources/jetty.xml
index 7eb8bbc..865abe9 100644
--- a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/jetty.xml
+++ b/juneau-examples/juneau-examples-rest-jetty/src/main/resources/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://eclipse.dev/jetty/configure_10_0.dtd">
 <!--
  ***************************************************************************************************************************
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
@@ -30,25 +30,37 @@
 		</Array>
 	</Set>
 
-	<New id="context" class="org.eclipse.jetty.servlet.ServletContextHandler">
+    <!-- Juneau adds its servlets in this ServletContextHandler -->
+	<New id="context" class="org.eclipse.jetty.ee9.servlet.ServletContextHandler">
 		<Set name="contextPath">/</Set>
 		<Set name="sessionHandler">
-			<New class="org.eclipse.jetty.server.session.SessionHandler" />
+			<New class="org.eclipse.jetty.ee9.nested.SessionHandler" />
 		</Set>
 	</New>
 
+    <!-- Save ServletContextHandler for Juneau -->  
+    <Call name="setAttribute">
+        <Arg>ServletContextHandler</Arg>
+        <Arg><Ref refid="context" /></Arg>
+    </Call>
+ 
 	<Set name="handler">
-		<New class="org.eclipse.jetty.server.handler.HandlerCollection">
-			<Set name="handlers">
-				<Array type="org.eclipse.jetty.server.Handler">
+        <New id="collection" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
+	     	<Arg>
+				<Array type="org.eclipse.jetty.server.handler.ContextHandler">
+                    <Item>
+                        <New class="org.eclipse.jetty.server.handler.ContextHandler">
+                            <!-- This is setHandler(Supplier) -->
+                            <Set name="handler"><Ref refid="context" /></Set>    
+                        </New>
+                    </Item>
 					<Item>
-						<Ref refid="context" />
+						<New class="org.eclipse.jetty.server.handler.ContextHandler">
+                        	<New class="org.eclipse.jetty.server.handler.DefaultHandler" />
+                        </New>
 					</Item>
-					<Item>
-						<New class="org.eclipse.jetty.server.handler.DefaultHandler" />
-					</Item>
-				</Array>
-			</Set>
+                </Array>
+			</Arg>
 		</New>
 	</Set>
 
diff --git a/juneau-microservice/juneau-microservice-jetty/pom.xml b/juneau-microservice/juneau-microservice-jetty/pom.xml
index 363e8bb..3890274 100644
--- a/juneau-microservice/juneau-microservice-jetty/pom.xml
+++ b/juneau-microservice/juneau-microservice-jetty/pom.xml
@@ -49,8 +49,8 @@
 			<version>${jetty.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>org.eclipse.jetty</groupId>
-			<artifactId>jetty-servlet</artifactId>
+			<groupId>org.eclipse.jetty.ee${jetty.ee.version}</groupId>
+			<artifactId>jetty-ee${jetty.ee.version}-servlet</artifactId>
 			<version>${jetty.version}</version>
 		</dependency>
 		<dependency>
@@ -59,6 +59,11 @@
 			<version>${jetty.version}</version>
 		</dependency>
 		<dependency>
+			<groupId>org.eclipse.jetty</groupId>
+			<artifactId>jetty-slf4j-impl</artifactId>
+			<version>${jetty.version}</version>
+		</dependency>
+		<dependency>
 			<groupId>jakarta.servlet</groupId>
 			<artifactId>jakarta.servlet-api</artifactId>
 		</dependency>
diff --git a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/BasicJettyServerFactory.java b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/BasicJettyServerFactory.java
index 01fa84a..addb810 100644
--- a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/BasicJettyServerFactory.java
+++ b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/BasicJettyServerFactory.java
@@ -38,7 +38,7 @@
 			IOUtils.pipe(r, w);
 			w.flush();
 		}
-		XmlConfiguration xmlConfiguration = new XmlConfiguration(Resource.newResource(f));
+		XmlConfiguration xmlConfiguration = new XmlConfiguration(new PathResourceFactory().newResource(f.toPath()));
 		return (Server)xmlConfiguration.configure();
 	}
 }
diff --git a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
index 86f7e37..fa42e40 100644
--- a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
+++ b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
@@ -22,6 +22,9 @@
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
+import org.slf4j.Marker;
+import org.slf4j.spi.LocationAwareLogger;
+
 /**
  * Implementation of Jetty {@link Logger} based on {@link java.util.logging.Logger}.
  *
@@ -43,7 +46,7 @@
  * 	<li class='link'><a class="doclink" href="../../../../../index.html#juneau-microservice-jetty">juneau-microservice-jetty</a>
  * </ul>
  */
-public class JettyLogger implements org.eclipse.jetty.util.log.Logger {
+public class JettyLogger implements LocationAwareLogger {
 	private static final boolean SHOW_SOURCE = env("org.eclipse.jetty.util.log.SOURCE", env("org.eclipse.jetty.util.log.javautil.SOURCE", true));
 
 	private Level configuredLevel;
@@ -69,8 +72,7 @@
 		configuredLevel = logger.getLevel();
 	}
 
-    @Override
-    public org.eclipse.jetty.util.log.Logger getLogger(String name) {
+    public JettyLogger getLogger(String name) {
         return new JettyLogger(name);
     }
 
@@ -85,7 +87,6 @@
 			log(WARNING, format(msg, args), null);
 	}
 
-	@Override
 	public void warn(Throwable thrown) {
 		if (isLoggable(WARNING))
 			log(WARNING, "", thrown);
@@ -103,7 +104,6 @@
 			log(INFO, format(msg, args), null);
 	}
 
-	@Override
 	public void info(Throwable thrown) {
 		if (isLoggable(INFO))
 			log(INFO, "", thrown);
@@ -120,7 +120,6 @@
 		return isLoggable(FINE);
 	}
 
-	@Override
 	public void setDebugEnabled(boolean enabled) {
 		if (enabled) {
 			configuredLevel = logger.getLevel();
@@ -136,13 +135,11 @@
 			log(FINE, format(msg, args), null);
 	}
 
-	@Override
 	public void debug(String msg, long arg) {
 		if (isLoggable(FINE))
 			log(FINE, format(msg, arg), null);
 	}
 
-	@Override
 	public void debug(Throwable thrown) {
 		if (isLoggable(FINE))
 			log(FINE, "", thrown);
@@ -154,7 +151,6 @@
 			log(FINE, msg, thrown);
 	}
 
-	@Override
 	public void ignore(Throwable ignored) {
 		if (isLoggable(FINEST))
 			log(FINEST, "IGNORED EXCEPTION ", ignored);
@@ -202,4 +198,328 @@
 		return logger.isLoggable(level);
 	}
 
+    @Override
+    public boolean isTraceEnabled() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void trace(String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(String format, Object... arguments) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isTraceEnabled(Marker marker) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void trace(Marker marker, String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(Marker marker, String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(Marker marker, String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(Marker marker, String format, Object... argArray) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void trace(Marker marker, String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isDebugEnabled(Marker marker) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void debug(Marker marker, String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(Marker marker, String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(Marker marker, String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(Marker marker, String format, Object... arguments) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void debug(Marker marker, String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isInfoEnabled() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void info(String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void info(String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void info(String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isInfoEnabled(Marker marker) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void info(Marker marker, String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void info(Marker marker, String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void info(Marker marker, String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void info(Marker marker, String format, Object... arguments) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void info(Marker marker, String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isWarnEnabled() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void warn(String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void warn(String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void warn(String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isWarnEnabled(Marker marker) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void warn(Marker marker, String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void warn(Marker marker, String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void warn(Marker marker, String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void warn(Marker marker, String format, Object... arguments) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void warn(Marker marker, String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isErrorEnabled() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void error(String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(String format, Object... arguments) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean isErrorEnabled(Marker marker) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void error(Marker marker, String msg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(Marker marker, String format, Object arg) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(Marker marker, String format, Object arg1, Object arg2) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(Marker marker, String format, Object... arguments) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void error(Marker marker, String msg, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable t) {
+        // TODO Auto-generated method stub
+        
+    }
+
 }
\ No newline at end of file
diff --git a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
index ca54dca..0c314e4 100644
--- a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
+++ b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
@@ -12,38 +12,58 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.microservice.jetty;
 
-import static org.apache.juneau.internal.ClassUtils.*;
-import static org.apache.juneau.internal.CollectionUtils.*;
-import static org.apache.juneau.collections.JsonMap.*;
-import static org.apache.juneau.common.internal.IOUtils.*;
-import static org.apache.juneau.common.internal.StringUtils.*;
-import static org.apache.juneau.common.internal.ThrowableUtils.*;
+import static org.apache.juneau.collections.JsonMap.EMPTY_MAP;
+import static org.apache.juneau.common.internal.IOUtils.read;
+import static org.apache.juneau.common.internal.StringUtils.trimTrailingSlashes;
+import static org.apache.juneau.common.internal.ThrowableUtils.asRuntimeException;
+import static org.apache.juneau.internal.ClassUtils.className;
+import static org.apache.juneau.internal.CollectionUtils.copyOf;
+import static org.apache.juneau.internal.CollectionUtils.map;
 
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Random;
+import java.util.Scanner;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
-import jakarta.servlet.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.collections.*;
-import org.apache.juneau.common.internal.*;
-import org.apache.juneau.config.*;
+import org.apache.juneau.BasicRuntimeException;
+import org.apache.juneau.ExecutableException;
+import org.apache.juneau.collections.Args;
+import org.apache.juneau.collections.JsonMap;
+import org.apache.juneau.common.internal.IOUtils;
+import org.apache.juneau.config.Config;
 import org.apache.juneau.config.store.ConfigStore;
 import org.apache.juneau.cp.Messages;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.internal.ObjectUtils;
+import org.apache.juneau.microservice.Microservice;
 import org.apache.juneau.microservice.console.ConsoleCommand;
 import org.apache.juneau.parser.ParseException;
 import org.apache.juneau.reflect.ClassInfo;
 import org.apache.juneau.rest.annotation.Rest;
 import org.apache.juneau.rest.servlet.RestServlet;
-import org.apache.juneau.svl.*;
-import org.eclipse.jetty.server.*;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.handler.*;
-import org.eclipse.jetty.servlet.*;
+import org.apache.juneau.svl.Var;
+import org.apache.juneau.svl.VarResolver;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
+import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+
+import jakarta.servlet.Servlet;
+
 
 /**
  * Entry point for Juneau microservice that implements a REST interface using Jetty on a single port.
@@ -67,7 +87,9 @@
 	// Static
 	//-----------------------------------------------------------------------------------------------------------------
 
-	private static volatile JettyMicroservice INSTANCE;
+	private static final String KEY_SERVLET_CONTEXT_HANDLER = "ServletContextHandler";
+
+    private static volatile JettyMicroservice INSTANCE;
 
 	private static void setInstance(JettyMicroservice m) {
 		synchronized(JettyMicroservice.class) {
@@ -567,17 +589,18 @@
 	 *
 	 * @return The context path that this microservice is using.
 	 */
-	public String getContextPath() {
-		for (Handler h : getServer().getHandlers()) {
-			if (h instanceof HandlerCollection)
-				for (Handler h2 : ((HandlerCollection)h).getChildHandlers())
-					if (h2 instanceof ServletContextHandler)
-						return ((ServletContextHandler)h2).getContextPath();
-			if (h instanceof ServletContextHandler)
-				return ((ServletContextHandler)h).getContextPath();
-		}
-		throw new IllegalStateException("Could not locate ServletContextHandler in Jetty server.");
-	}
+    public String getContextPath() {
+        return getServletContextHandler().getContextPath();
+//        for (Handler h : getServer().getHandlers()) {
+//            if (h instanceof HandlerCollection)
+//                for (org.eclipse.jetty.ee9.nested.Handler h2 : ((HandlerCollection) h).getChildHandlers())
+//                    if (h2 instanceof ServletContextHandler)
+//                        return ((ServletContextHandler) h2).getContextPath();
+//            if (h instanceof ServletContextHandler)
+//                return ((ServletContextHandler) h).getContextPath();
+//        }
+//        throw new IllegalStateException("Could not locate ServletContextHandler in Jetty server.");
+    }
 
 	/**
 	 * Returns whether this microservice is using <js>"http"</js> or <js>"https"</js>.
@@ -760,18 +783,17 @@
 	}
 
 	/**
-	 * Finds and returns the servlet context handler define in the Jetty container.
+	 * Finds and returns the servlet context handler defined in the Jetty container.
 	 *
 	 * @return The servlet context handler.
 	 * @throws RuntimeException if context handler is not defined.
 	 */
-	protected ServletContextHandler getServletContextHandler() {
-		for (Handler h : getServer().getHandlers()) {
-			ServletContextHandler sch = getServletContextHandler(h);
-			if (sch != null)
-				return sch;
-		}
-		throw new IllegalStateException("Servlet context handler not found in jetty server.");
+	public ServletContextHandler getServletContextHandler() {
+	    final var obj = getServer().getAttribute(KEY_SERVLET_CONTEXT_HANDLER);
+	    if (obj instanceof ServletContextHandler servletContextHandler) {
+	        return servletContextHandler;
+	    }
+		throw new IllegalStateException("Servlet context handler not found in jetty server or at attribute '" + KEY_SERVLET_CONTEXT_HANDLER + "'");
 	}
 
 	/**
@@ -817,19 +839,6 @@
 	// Utility methods
 	//-----------------------------------------------------------------------------------------------------------------
 
-	private static ServletContextHandler getServletContextHandler(Handler h) {
-		if (h instanceof ServletContextHandler)
-			return (ServletContextHandler)h;
-		if (h instanceof HandlerCollection) {
-			for (Handler h2 : ((HandlerCollection)h).getHandlers()) {
-				ServletContextHandler sch = getServletContextHandler(h2);
-				if (sch != null)
-					return sch;
-			}
-		}
-		return null;
-	}
-
 	private static int findOpenPort(int[] ports) {
 		for (int port : ports) {
 			// If port is 0, try a random port between ports[0] and 32767.
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/jetty.xml b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/jetty.xml
index d40d94f..df5aa24 100644
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/jetty.xml
+++ b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://eclipse.dev/jetty/configure_10_0.dtd">
 <!--
  ***************************************************************************************************************************
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
@@ -30,30 +30,42 @@
 		</Array>
 	</Set>
 
-	<New id="context" class="org.eclipse.jetty.servlet.ServletContextHandler">
-		<Set name="contextPath">/</Set>
-		<!-- Optionally specify your servlets here -->
-		<!--Call name="addServlet">
-			<Arg>org.apache.juneau.microservice.jetty.template.RootResources</Arg>
-			<Arg>/*</Arg>
-		</Call-->
-		<Set name="sessionHandler">
-			<New class="org.eclipse.jetty.server.session.SessionHandler" />
-		</Set>
-	</New>
+    <!-- Juneau adds its servlets in this ServletContextHandler -->
+    <New id="context" class="org.eclipse.jetty.ee9.servlet.ServletContextHandler">
+      <Set name="contextPath">/</Set>
+      <!-- Optionally specify your servlets here -->
+      <!--Call name="addServlet">
+        <Arg>org.apache.juneau.microservice.jetty.template.RootResources</Arg>
+        <Arg>/*</Arg>
+      </Call-->
+      <Set name="sessionHandler">
+        <New class="org.eclipse.jetty.ee9.nested.SessionHandler" />
+      </Set>
+    </New>
+
+    <!-- Save ServletContextHandler for Juneau -->  
+    <Call name="setAttribute">
+        <Arg>ServletContextHandler</Arg>
+        <Arg><Ref refid="context" /></Arg>
+    </Call>
 
 	<Set name="handler">
-		<New class="org.eclipse.jetty.server.handler.HandlerCollection">
-			<Set name="handlers">
-				<Array type="org.eclipse.jetty.server.Handler">
+        <New id="collection" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
+	     	<Arg>
+				<Array type="org.eclipse.jetty.server.handler.ContextHandler">
+                    <Item>
+                        <New class="org.eclipse.jetty.server.handler.ContextHandler">
+                            <!-- This is setHandler(Supplier) -->
+                            <Set name="handler"><Ref refid="context" /></Set>    
+                        </New>
+                    </Item>
 					<Item>
-						<Ref refid="context" />
+						<New class="org.eclipse.jetty.server.handler.ContextHandler">
+                        	<New class="org.eclipse.jetty.server.handler.DefaultHandler" />
+                        </New>
 					</Item>
-					<Item>
-						<New class="org.eclipse.jetty.server.handler.DefaultHandler" />
-					</Item>
-				</Array>
-			</Set>
+                </Array>
+			</Arg>
 		</New>
 	</Set>
 
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 96b9202..e5a2d6a 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
Binary files differ
diff --git a/juneau-sc/juneau-sc-server/src/main/resources/jetty.xml b/juneau-sc/juneau-sc-server/src/main/resources/jetty.xml
index 30a1fd8..ddd898b 100644
--- a/juneau-sc/juneau-sc-server/src/main/resources/jetty.xml
+++ b/juneau-sc/juneau-sc-server/src/main/resources/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://eclipse.dev/jetty/configure_10_0.dtd">
 <!--
  ***************************************************************************************************************************
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
@@ -30,25 +30,37 @@
 		</Array>
 	</Set>
 
-	<New id="context" class="org.eclipse.jetty.servlet.ServletContextHandler">
-		<Set name="contextPath">/</Set>
-		<Set name="sessionHandler">
-			<New class="org.eclipse.jetty.server.session.SessionHandler" />
-		</Set>
-	</New>
+    <!-- Juneau adds its servlets in this ServletContextHandler -->
+    <New id="context" class="org.eclipse.jetty.ee9.servlet.ServletContextHandler">
+      <Set name="contextPath">/</Set>
+      <Set name="sessionHandler">
+        <New class="org.eclipse.jetty.ee9.nested.SessionHandler" />
+      </Set>
+    </New>
+
+    <!-- Save ServletContextHandler for Juneau -->  
+    <Call name="setAttribute">
+        <Arg>ServletContextHandler</Arg>
+        <Arg><Ref refid="context" /></Arg>
+    </Call>
 
 	<Set name="handler">
-		<New class="org.eclipse.jetty.server.handler.HandlerCollection">
-			<Set name="handlers">
-				<Array type="org.eclipse.jetty.server.Handler">
+        <New id="collection" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
+	     	<Arg>
+				<Array type="org.eclipse.jetty.server.handler.ContextHandler">
+                    <Item>
+                        <New class="org.eclipse.jetty.server.handler.ContextHandler">
+                            <!-- This is setHandler(Supplier) -->
+                            <Set name="handler"><Ref refid="context" /></Set>    
+                        </New>
+                    </Item>
 					<Item>
-						<Ref refid="context" />
+						<New class="org.eclipse.jetty.server.handler.ContextHandler">
+                        	<New class="org.eclipse.jetty.server.handler.DefaultHandler" />
+                        </New>
 					</Item>
-					<Item>
-						<New class="org.eclipse.jetty.server.handler.DefaultHandler" />
-					</Item>
-				</Array>
-			</Set>
+                </Array>
+			</Arg>
 		</New>
 	</Set>
 
diff --git a/pom.xml b/pom.xml
index fbb14b0..8c9795a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,9 @@
 		<servlet.version>6.0.0</servlet.version>
 		<httpclient.version>4.5.14</httpclient.version>
 		<httpcore.version>4.4.16</httpcore.version>
-		<jetty.version>11.0.20</jetty.version>
+		<jetty.version>12.0.9</jetty.version>
+		<!-- First step in migration to Jetty 12: EE 8 -->
+		<jetty.ee.version>9</jetty.ee.version>
 		<juneau.compare.version>9.0.1</juneau.compare.version>
 		<javadoc.juneau.version>9.1.0</javadoc.juneau.version>
 		<juneauVersion>9.1.0</juneauVersion>