diff --git a/INSTALL-headless.txt b/INSTALL-headless.txt
index 3c1fd273830891a309a961c9ced1f659073ef8d4..660602c334be1fc14b7d9888b34fc44a4acbbb1b 100644
--- a/INSTALL-headless.txt
+++ b/INSTALL-headless.txt
@@ -40,7 +40,7 @@ To uninstall I2P:
    rm -rf $I2PInstallDir ~/.i2p
 
 Supported JVMs:
-  All platforms: Java 1.7 or higher required
+  All platforms: Java 1.8 or higher required
   Windows: OpenJDK or Oracle from http://java.com/download
   Linux:   OpenJDK or Oracle from http://java.com/download
   FreeBSD: OpenJDK or Oracle from http://java.com/download
diff --git a/INSTALL.txt b/INSTALL.txt
index cbd933466468848e50c5e5dc54687d9dd8cb944b..841237d2b9acf32311fb19b664c9a3ab73da1c2e 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,7 +1,7 @@
 I2P source installation instructions
 
 Prerequisites to build from source:
-	Java SDK (preferably Oracle/Sun or OpenJDK) 1.7.0 or higher
+	Java SDK (preferably Oracle/Sun or OpenJDK) 1.8.0 or higher
           Non-linux operating systems and JVMs: See https://trac.i2p2.de/wiki/java
           Certain subsystems for embedded (core, router, mstreaming, streaming, i2ptunnel) require only Java 1.6
 	Apache Ant 1.7.0 or higher
diff --git a/LICENSE.txt b/LICENSE.txt
index 67a4d76b4847aeeed4538dc4ecf4f7d9d60a137e..de121cfb0d6ae0ba0220d6a94d79030ff1752e38 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -257,7 +257,7 @@ Applications:
      Zxing 3.3.0:
        See licenses/LICENSE-Apache2.0.txt
 
-   Jetty 9.2.29.v20191105 (jetty-*.jar, org.mortbay.*.jar):
+   Jetty 9.3.28.v20191105 (jetty-*.jar, org.mortbay.*.jar):
    (not included in most distribution packages, except for jetty-i2p.jar)
    See licenses/ABOUT-Jetty.html
    See licenses/NOTICE-Jetty.html
diff --git a/README.md b/README.md
index 6eae9e82578707d5f7c8fc5c65563a003f6e6062..fb7d8711dd2fb38c338b6ddc050798a0678053b2 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ To get development branch from source control: https://geti2p.net/newdevelopers
 
 ### Prerequisites
 
-- Java SDK (preferably Oracle/Sun or OpenJDK) 1.7.0 or higher
+- Java SDK (preferably Oracle/Sun or OpenJDK) 1.8.0 or higher
   - Non-linux operating systems and JVMs: See https://trac.i2p2.de/wiki/java
   - Certain subsystems for embedded (core, router, mstreaming, streaming, i2ptunnel)
     require only Java 1.6
diff --git a/README.txt b/README.txt
index c13095993ce7cc671e8a7fda11a4887df42e51fc..65b80488773ef527a7e14c1d136a38fbfe4b2f2d 100644
--- a/README.txt
+++ b/README.txt
@@ -1,5 +1,5 @@
 Prerequisites to build from source:
-	Java SDK (preferably Oracle/Sun or OpenJDK) 1.7.0 or higher
+	Java SDK (preferably Oracle/Sun or OpenJDK) 1.8.0 or higher
           Non-linux operating systems and JVMs: See https://trac.i2p2.de/wiki/java
           Certain subsystems for embedded (core, router, mstreaming, streaming, i2ptunnel) require only Java 1.6
 	Apache Ant 1.7.0 or higher
diff --git a/apps/addressbook/build.xml b/apps/addressbook/build.xml
index 673937ddfb7cb37af84b4cd20f77b6ef5e4a3932..7bd9e0a1060a2e2e7291ca08b6faf65be1108f95 100644
--- a/apps/addressbook/build.xml
+++ b/apps/addressbook/build.xml
@@ -7,7 +7,7 @@
 	<property name="jar" value="addressbook.jar"/>
 	<property name="war" value="addressbook.war"/>
 	<property name="javac.compilerargs" value="" />
-	<property name="javac.version" value="1.7" />
+	<property name="javac.version" value="1.8" />
 
 	<target name="all" depends="jar, emptyWar"/> 
 	
diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml
index 5633a430b9d607f587512735d4df88a84b15dc60..121866d37a9874cc97fd7d8d4d9053fd8b813a44 100644
--- a/apps/desktopgui/build.xml
+++ b/apps/desktopgui/build.xml
@@ -7,7 +7,7 @@
 	<property name="jar" value="desktopgui.jar"/>
 	<property name="javadoc" value="javadoc"/>
 	<property name="javac.compilerargs" value=""/>
-	<property name="javac.version" value="1.7" />
+	<property name="javac.version" value="1.8" />
 	<property name="require.gettext" value="true" />
 
     <condition property="no.bundle">
diff --git a/apps/i2pcontrol/build.xml b/apps/i2pcontrol/build.xml
index 0a5b988a1e4673d4d340a88f572792eebbf9c4d1..29385920dca7d2078fa12a678644b6a8c62ca42c 100644
--- a/apps/i2pcontrol/build.xml
+++ b/apps/i2pcontrol/build.xml
@@ -50,7 +50,7 @@
     </target>
 
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="builddep" >
         <mkdir dir="./build" />
diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index a1d92a73ec1f5d664bad8fc3336a3e2754b470ca..3fa7b3db46c296de25ddba4dfbce507940795f17 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -27,7 +27,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="require.gettext" value="true" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index 954d76e9a9ee7c040685c44125ba19c00ef8aa0f..716820c076896a7f0d5e9b65126627855dd9cb08 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -28,7 +28,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="require.gettext" value="true" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
diff --git a/apps/imagegen/identicon/build.xml b/apps/imagegen/identicon/build.xml
index 2c77186377fee2256096c37d2f5eb13387702b75..d6d449b7d736628b1bbfbea5fd9c7a2b09c27405 100644
--- a/apps/imagegen/identicon/build.xml
+++ b/apps/imagegen/identicon/build.xml
@@ -18,7 +18,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
diff --git a/apps/imagegen/imagegen/build.xml b/apps/imagegen/imagegen/build.xml
index fb66aefb4212bee39ffbec20773d0038c3990e7b..d8ae4b8c18c37e7aa797f0e803008f0013072346 100644
--- a/apps/imagegen/imagegen/build.xml
+++ b/apps/imagegen/imagegen/build.xml
@@ -28,7 +28,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
diff --git a/apps/imagegen/zxing/build.xml b/apps/imagegen/zxing/build.xml
index 879fe2af97d442bfd052fe5b822d5b442e454ee3..bea4f7c74bf453f68ab611d6f4b90171f70fa7b5 100644
--- a/apps/imagegen/zxing/build.xml
+++ b/apps/imagegen/zxing/build.xml
@@ -17,7 +17,7 @@
     </target>
 
     <!-- only used if not set by a higher build.xml -->
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="javac.compilerargs7" value="" />
 
     <target name="compile" depends="depend">
diff --git a/apps/jetty/build.xml b/apps/jetty/build.xml
index 08ee2137981f73670a7ccf3a1ac3cc2fc2c3d0a0..0a895018e408dd53db3b0f09ddea08f678fc4758 100644
--- a/apps/jetty/build.xml
+++ b/apps/jetty/build.xml
@@ -15,16 +15,14 @@
 
     <!-- Note: Change version numbers in top-level build.xml if you update to a new Tomcat or Jetty! -->
 
-    <!-- jetty.branch unused until we go to 9.3 -->
     <property name="jetty.branch" value="stable-9" />
     <property name="jetty.base" value="jetty-distribution-${jetty.ver}" />
-    <property name="jetty.sha1" value="cc68beca7e11dd6c0067750499d9dea86ee6d2f0" />
+    <property name="jetty.sha1" value="0b4bf8501da2ca6f5d1f8c583b476b1a46e16845" />
     <property name="jetty.filename" value="${jetty.base}.zip" />
-    <!-- change jetty.ver to jetty.branch for 9.3 -->
-    <property name="jetty.url" value="http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/${jetty.ver}/${jetty.filename}" />
+    <property name="jetty.url" value="https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/${jetty.ver}/${jetty.filename}" />
     <property name="verified.filename" value="verified.txt" />
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
     <!-- everything we need is in the deployer package, except for tomcat-api.jar in the full package,
diff --git a/apps/jetty/java/src/net/i2p/jetty/I2PRequestLog.java b/apps/jetty/java/src/net/i2p/jetty/I2PRequestLog.java
index 02c97c5b3164bc84fa806d622cddc99acb9c2f94..8d72c9747c03d5f30fa09b353a534d9949064540 100644
--- a/apps/jetty/java/src/net/i2p/jetty/I2PRequestLog.java
+++ b/apps/jetty/java/src/net/i2p/jetty/I2PRequestLog.java
@@ -317,7 +317,7 @@ public class I2PRequestLog extends AbstractLifeCycle implements RequestLog
                 buf.append(request.getMethod());
                 buf.append(' ');
                 
-                request.getUri().writeTo(u8buf);
+                u8buf.append(request.getHttpURI().toString());
                 
                 buf.append(' ');
                 buf.append(request.getProtocol());
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.2.29.v20191105.jar
deleted file mode 100644
index e7a46a91725385c9dc22b5539cd86818c281e67d..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-continuation-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-continuation-9.2.29.v20191105.jar
deleted file mode 100644
index 0f3f984f513fe935dbed958cacbb2b398d8df382..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-continuation-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-deploy-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-deploy-9.2.29.v20191105.jar
deleted file mode 100644
index d518bfc959eebd6aa0a50252bfe136d720727efb..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-deploy-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-http-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-http-9.2.29.v20191105.jar
deleted file mode 100644
index f5fcdf971ce9410ca6f81d3965003a2f06177dce..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-http-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-io-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-io-9.2.29.v20191105.jar
deleted file mode 100644
index 096b3250ebeb2c983cfad67f67b71f7f1b9eaac5..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-io-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-jmx-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-jmx-9.2.29.v20191105.jar
deleted file mode 100644
index 4dfac1fb4ee1777bbd2db301cc085aa91dfefec9..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-jmx-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-rewrite-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-rewrite-9.2.29.v20191105.jar
deleted file mode 100644
index ce8a079d97126d5a9e6485b6616d949d80e949e4..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-rewrite-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-security-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-security-9.2.29.v20191105.jar
deleted file mode 100644
index ea3cab9aba7d75a90fe5a4d7d105288a8dde4a73..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-security-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-server-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-server-9.2.29.v20191105.jar
deleted file mode 100644
index 95ec67122e2107bd3cd2262aefa6f79afc62b955..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-server-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-servlet-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-servlet-9.2.29.v20191105.jar
deleted file mode 100644
index 8d440aa1915cb53bfae8ab2afb1defc0fcc2c109..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-servlet-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-servlets-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-servlets-9.2.29.v20191105.jar
deleted file mode 100644
index cf4fd99375a5af874bb10356343cba9cd1587f9d..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-servlets-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-util-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-util-9.2.29.v20191105.jar
deleted file mode 100644
index e4ffe114caf7ff905097e1dc31094128d39bea2a..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-util-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-webapp-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-webapp-9.2.29.v20191105.jar
deleted file mode 100644
index 32f00cf25d8f20db8a12daf02b4e0d6d332642f4..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-webapp-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-xml-9.2.29.v20191105.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-xml-9.2.29.v20191105.jar
deleted file mode 100644
index e8f774eaa52db7b7381d53640d967c6524c4fdcd..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-xml-9.2.29.v20191105.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/start.jar b/apps/jetty/jetty-distribution-9.2.29.v20191105/start.jar
deleted file mode 100644
index 02861f2c9928da272bca7eef8216b5f529aab47a..0000000000000000000000000000000000000000
Binary files a/apps/jetty/jetty-distribution-9.2.29.v20191105/start.jar and /dev/null differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..74f78ba7822c058f3615f6d5e90e9b765e5151a5
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-continuation-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-continuation-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..075fc4ad6bbd45fc0139bfbb10c61dc6e403ce31
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-continuation-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-deploy-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-deploy-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e98e6323d2fdfff3d3dc84d2bf3eb5c29ad85e78
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-deploy-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-http-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-http-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..312e9fca0308af63d5fca89641df65e520ede20d
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-http-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-io-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-io-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..131aad8eef8988859813fdba42366b7a13a6a02f
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-io-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-jmx-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-jmx-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e6097ba8a6026706f8d2ffd3792b6db605edb48d
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-jmx-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-rewrite-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-rewrite-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e381d062f2c0b102e210f056742a8c7835ebfc9b
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-rewrite-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-schemas-3.1.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-schemas-3.1.jar
similarity index 100%
rename from apps/jetty/jetty-distribution-9.2.29.v20191105/lib/jetty-schemas-3.1.jar
rename to apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-schemas-3.1.jar
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-security-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-security-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..cf9075ba1963f9613ec032dcef93f2f6fa53056a
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-security-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-server-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-server-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..3a0fb85c051f700c327bc21dabafd1d34bcd648d
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-server-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-servlet-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-servlet-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..97f0ac9d5f36c0efabc0803799b76bde86af246c
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-servlet-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-servlets-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-servlets-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..3a9ec6d7ff66168e804c62c9bb3950e46c1d9ced
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-servlets-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-util-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-util-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..2c8f704fa2f6015bc3fd4c939ce10bb642fa6203
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-util-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-webapp-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-webapp-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..581b85e4b231fb659d2db8e475b94806592b088c
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-webapp-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-xml-9.3.28.v20191105.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-xml-9.3.28.v20191105.jar
new file mode 100644
index 0000000000000000000000000000000000000000..9a7f5f1b112edd1f3a6d891971e2ff1347b79cb6
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/jetty-xml-9.3.28.v20191105.jar differ
diff --git a/apps/jetty/jetty-distribution-9.2.29.v20191105/lib/servlet-api-3.1.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/lib/servlet-api-3.1.jar
similarity index 100%
rename from apps/jetty/jetty-distribution-9.2.29.v20191105/lib/servlet-api-3.1.jar
rename to apps/jetty/jetty-distribution-9.3.28.v20191105/lib/servlet-api-3.1.jar
diff --git a/apps/jetty/jetty-distribution-9.3.28.v20191105/start.jar b/apps/jetty/jetty-distribution-9.3.28.v20191105/start.jar
new file mode 100644
index 0000000000000000000000000000000000000000..584549c828d285a67dae0205814ffa342889b00c
Binary files /dev/null and b/apps/jetty/jetty-distribution-9.3.28.v20191105/start.jar differ
diff --git a/apps/jrobin/java/build.xml b/apps/jrobin/java/build.xml
index 3dbc5b7938459fd84ec0fb512bce92d88b59dc9a..b0f39f7626706cb9bac039525f53dee5d671f6a9 100644
--- a/apps/jrobin/java/build.xml
+++ b/apps/jrobin/java/build.xml
@@ -18,7 +18,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
     <target name="compile" depends="depend">
diff --git a/apps/ministreaming/java/build.xml b/apps/ministreaming/java/build.xml
index 147133f14018791a944790b5d9136c3c96843101..af22f3f7e077707800705b17b7d9601f0ede55e6 100644
--- a/apps/ministreaming/java/build.xml
+++ b/apps/ministreaming/java/build.xml
@@ -22,7 +22,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="require.gettext" value="true" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml
index 08207ae6769ec77922bbfea59add3ed310cb5298..f96dab7ca61d9f60f2929251e0e90ce8ef56453b 100644
--- a/apps/routerconsole/java/build.xml
+++ b/apps/routerconsole/java/build.xml
@@ -48,7 +48,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
     <target name="compile" depends="prepare, depend, dependVersion">
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HostCheckHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/HostCheckHandler.java
index 1bb139dbf77a78c7c8a1ae1135527d0715f135a0..90d9c76b07541e37e753144e28873722ae257870 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/HostCheckHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/HostCheckHandler.java
@@ -15,7 +15,7 @@ import net.i2p.util.Log;
 import net.i2p.util.PortMapper;
 
 import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.servlets.gzip.GzipHandler;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
 
 /**
  * Block certain Host headers to prevent DNS rebinding attacks.
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
index 84fb1423a146ebf2662288b38cec175cc4cf53ab..25ce36bcb6ff904de8dd069a11c4e2c7f21320e3 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
@@ -22,6 +22,7 @@ import java.util.Set;
 import java.util.SortedSet;
 import java.util.StringTokenizer;
 import java.util.concurrent.LinkedBlockingQueue;
+import javax.servlet.ServletRequest;
 
 import net.i2p.I2PAppContext;
 import net.i2p.app.ClientApp;
@@ -360,17 +361,20 @@ public class RouterConsoleRunner implements RouterApp {
             log.logAlways(net.i2p.util.Log.WARN, s);
             System.out.println("Warning: " + s);
             if (noJava8) {
-                s = "Java 8 or higher will be required in a future release, please upgrade Java";
+                s = "Java 8 or higher is required, please upgrade Java";
                 log.logAlways(net.i2p.util.Log.WARN, s);
                 System.out.println("Warning: " + s);
             }
             if (noPack200) {
-                s = "Pack200 is required for plugins and automatic updates, please upgrade Java";
+                if (SystemVersion.isJava(14))
+                    s = "Pack200 is required for some plugins, please consider downgrading Java to 13 or lower";
+                else
+                    s = "Pack200 is required for some plugins, please consider upgrading Java";
                 log.logAlways(net.i2p.util.Log.WARN, s);
                 System.out.println("Warning: " + s);
             }
             if (openARM) {
-                s = "OpenJDK 7/8 are not recommended for ARM. Use OpenJDK 9 (or higher) or Oracle Java 8 (or higher)";
+                s = "OpenJDK 8 is not recommended for ARM. Use OpenJDK 9 (or higher) or Oracle Java 8 (or higher)";
                 log.logAlways(net.i2p.util.Log.WARN, s);
                 System.out.println("Warning: " + s);
             }
@@ -1081,8 +1085,8 @@ public class RouterConsoleRunner implements RouterApp {
         }
 
         @Override
-        public UserIdentity login(String username, Object credentials) {
-            UserIdentity rv = super.login(username, credentials);
+        public UserIdentity login(String username, Object credentials, ServletRequest request) {
+            UserIdentity rv = super.login(username, credentials, request);
             if (rv == null)
                 //_log.logAlways(net.i2p.util.Log.WARN, "Console authentication failed, webapp: " + _webapp + ", user: " + username);
                 _log.logAlways(net.i2p.util.Log.WARN, "Console authentication failed, user: " + username);
diff --git a/apps/sam/java/build.xml b/apps/sam/java/build.xml
index f9191c44fb927ca1bc6ae91b2a427af875a4928a..e3d89a12b0dd2595341889a4e8671d642e918fa3 100644
--- a/apps/sam/java/build.xml
+++ b/apps/sam/java/build.xml
@@ -24,7 +24,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs7" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
     <!-- compile everything including client classes -->
@@ -45,7 +45,7 @@
     <target name="compileTest" depends="compile">
         <javac 
             srcdir="./test" 
-            debug="true" deprecation="on" source="1.7" target="1.7" 
+            debug="true" deprecation="on" source="${javac.version}" target="${javac.version}"
             includeAntRuntime="false"
             encoding="UTF-8"
             destdir="./build/obj" 
diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml
index 69bd73946d720d7654c8cbea2b07d68c3fa0f915..8120479d0d161262acc17dccc13be8fb95bed9b8 100644
--- a/apps/streaming/java/build.xml
+++ b/apps/streaming/java/build.xml
@@ -23,7 +23,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml
index 5f35e4f47dddd9b3fe638564a243d5ec9cc37add..43b94b0513817e0d1f9413bd4958b04d119b4bf0 100644
--- a/apps/susidns/src/build.xml
+++ b/apps/susidns/src/build.xml
@@ -37,7 +37,7 @@
  	</path>
 
 	<property name="javac.compilerargs" value="" />
-	<property name="javac.version" value="1.7" />
+	<property name="javac.version" value="1.8" />
 	<property name="require.gettext" value="true" />
 
     <condition property="no.bundle">
diff --git a/apps/susimail/build.xml b/apps/susimail/build.xml
index e7fbdb63dcc4571015aa867eae9cbd268340db30..cfc6db289dcf0bb6ace3a75eb97b3b16fb3310f2 100644
--- a/apps/susimail/build.xml
+++ b/apps/susimail/build.xml
@@ -7,7 +7,7 @@
     </target>
 
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="require.gettext" value="true" />
 
     <condition property="no.bundle">
diff --git a/apps/systray/java/build.xml b/apps/systray/java/build.xml
index 31e22ff3530641422d7508b0b5226a13a9297607..6543dceb38b2d6a88386a934569e5207ba85ac60 100644
--- a/apps/systray/java/build.xml
+++ b/apps/systray/java/build.xml
@@ -21,7 +21,7 @@
     </target>
 
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
diff --git a/build.properties b/build.properties
index e7dc33035116d78a744e8813178cb8ba0fec2162..25e8929f28135ecea569ae3be3c6fd8c8dcbf743 100644
--- a/build.properties
+++ b/build.properties
@@ -43,7 +43,7 @@ sloccount.report.file=sloccount.sc
 require.gettext=true
 
 # Compile for this version of Java
-javac.version=1.7
+javac.version=1.8
 
 # Additional classpath if required
 #javac.classpath=/PATH/TO/pack200.jar
diff --git a/build.xml b/build.xml
index 4d6422d4841a62988d98e950a3065cfcae3a6845..e01e479686b1ca53bf63869782be33c12374f958 100644
--- a/build.xml
+++ b/build.xml
@@ -8,7 +8,7 @@
     <property file="override.properties"/>
     <property file="build.properties"/>
     <!--  When changing, also change javadoc URL in build.properties, and checksum in apps/jetty/build.xml -->
-    <property name="jetty.ver" value="9.2.29.v20191105" />
+    <property name="jetty.ver" value="9.3.28.v20191105" />
     <property name="tomcat.ver" value="8.5.50" />
 
     <!-- You probably don't want to change anything from here down -->
diff --git a/core/java/build.xml b/core/java/build.xml
index ebf5ea7a547f8322fa7377fab112be67b8b8dc85..0b08173f2a525ada45ec3909cc57ffbff7f98967 100644
--- a/core/java/build.xml
+++ b/core/java/build.xml
@@ -22,7 +22,7 @@
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
     <property name="javac.classpath" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
     <!-- fixups if we're using libintl.jar for GettextResource.java -->
diff --git a/debian-alt/doc/dependencies.txt b/debian-alt/doc/dependencies.txt
index d78842c966f9f243e0ce0e6bb8cb9dca1f9843f9..20d8403577756754081255c8989967ba3497dc6c 100644
--- a/debian-alt/doc/dependencies.txt
+++ b/debian-alt/doc/dependencies.txt
@@ -54,8 +54,7 @@ Current Runtime Dependencies
 * libjetty9-java
   For /usr/share/java/jetty9-*.jar.
   In non-Debian builds we bundle the jars; it's removed in the Debian source package.
-  This is for Jetty 9.2.x, which is what's in Debian.
-  We are not compatible with Jetty 9.4.x, which is what's in RedHat.
+  This is for Jetty 9.3.x, which is the same as 9.4.x except it's Java 8 compatible.
 
 * libtomcat8-java
   For /usr/share/java/tomcat8-*.jar.
diff --git a/history.txt b/history.txt
index 464a50dd374b5eee7f345c57f3d6ea8bf1cd244c..226c50f434c845322f00d8bfcf18d21382d0870c 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,9 @@
 2020-05-27 zzz
+ * Installer:
+   - Require Java 8 (ticket #2511)
+   - Sign the dlls (ticket #2704)
+ * Jetty 9.3.28 (ticket #2098)
+ * UPnP: More fixes
  * Util: Faster gzip
 
 * 2020-05-25 0.9.46 released
diff --git a/installer/install.xml b/installer/install.xml
index 0852e1c7cc2b67119888171f5c13d8c447de7526..a333fdebd821dce9fcc72ef757a94f63462cac0d 100644
--- a/installer/install.xml
+++ b/installer/install.xml
@@ -9,7 +9,7 @@
             <author name="I2P" email="https://geti2p.net/"/>
         </authors>
         <url>https://geti2p.net/</url>
-        <javaversion>1.7</javaversion>
+        <javaversion>1.8</javaversion>
 
         <!-- use pack200 compression, saves about 33%
              see http://java.sun.com/j2se/1.5.0/docs/guide/deployment/deployment-guide/pack200.html
diff --git a/installer/install5.xml b/installer/install5.xml
index 9e095e04d40544803616c348788a0e2044810d89..71ca6d1fec0b79eba8177be5f78f5c1db1757e2d 100644
--- a/installer/install5.xml
+++ b/installer/install5.xml
@@ -15,7 +15,7 @@
             <author name="I2P" email="https://geti2p.net/"/>
         </authors>
         <url>https://geti2p.net/</url>
-        <javaversion>1.7</javaversion>
+        <javaversion>1.8</javaversion>
 
         <!-- adding this element will make the installer attempt to launch itself with administrator permissions,
          -->
diff --git a/installer/java/build.xml b/installer/java/build.xml
index 4b504375e16185c7ef56c59da71a115d9888d337..8a3dc1120dc7b60a65d996b087d245659aa86eed 100644
--- a/installer/java/build.xml
+++ b/installer/java/build.xml
@@ -19,7 +19,7 @@
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
     <property name="javac.classpath" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
diff --git a/installer/lib/izpack5/patches/java/build.xml b/installer/lib/izpack5/patches/java/build.xml
index 3362bb486f94db3b6e4d6f2fc17c4cf251ed825f..620d72b6c6744f65cd6e88968e8650e69c3766ba 100644
--- a/installer/lib/izpack5/patches/java/build.xml
+++ b/installer/lib/izpack5/patches/java/build.xml
@@ -19,7 +19,7 @@
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
     <property name="javac.classpath" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="izpack5.version" value="5.1.3" />
 
     <property name="izpack.lib" value="${izpack5.home}/lib" />
diff --git a/installer/resources/eepsite/contexts/base-context.xml b/installer/resources/eepsite/contexts/base-context.xml
index 14c20f9b4dad87a1a8178c6d1f57f6ac82e1fe2d..4d0601be726498dcf2018ecc7764f50a3d070068 100644
--- a/installer/resources/eepsite/contexts/base-context.xml
+++ b/installer/resources/eepsite/contexts/base-context.xml
@@ -42,42 +42,5 @@ to serve static html files and images.
     <Arg>net.i2p.servlet.I2PDefaultServlet</Arg>
     <Arg>/</Arg>
   </Call>
-  <Call name="addFilter">
-    <!-- Add a filter to gzip on-the fly, since if we don't do it, I2P will.
-      -  This lowers the resource usage in the Java process on the client side,
-      -  by pushing the decompression out of Java and into the browser.
-      -  For all the reasons noted in the GzipFilter javadocs, this is normally
-      -  a bad idea for static content, but this is I2P.
-      -  See I2PTunnelHTTPServer for the I2P compressor.
-      -->
-    <Arg>
-      <New class="org.eclipse.jetty.servlet.FilterHolder" >
-        <Arg>
-          <New class="org.eclipse.jetty.servlets.GzipFilter" />
-        </Arg>
-        <Call name="setInitParameter">
-          <!-- minimum in Java is 1300 -->
-          <Arg>minGzipSize</Arg>
-          <Arg>512</Arg>
-        </Call>
-        <Call name="setInitParameter">
-          <!-- In Java we have a blacklist. This covers the most common cases. -->
-          <Arg>mimeTypes</Arg>
-          <Arg>application/pdf,application/x-javascript,application/xhtml+xml,application/xml,image/svg+xml,text/css,text/html,text/plain</Arg>
-        </Call>
-      </New>
-    </Arg>
-    <Arg>/*</Arg>
-    <Arg>
-      <!-- just guessing here -->
-      <Call class="java.util.EnumSet" name="of" >
-        <Arg>
-          <Call class="javax.servlet.DispatcherType" name="valueOf" >
-            <Arg>REQUEST</Arg>
-          </Call>
-        </Arg>
-      </Call>
-    </Arg>
-  </Call>
 </Configure>
 
diff --git a/installer/tools/java/build.xml b/installer/tools/java/build.xml
index 20ac5b20e5b02472591c0e7a9448f3c9c4bbbcf5..7f6eb412c54c7363832d50017b37bf72d531e09d 100644
--- a/installer/tools/java/build.xml
+++ b/installer/tools/java/build.xml
@@ -19,7 +19,7 @@
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
     <property name="javac.classpath" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
 
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
diff --git a/router/java/build.xml b/router/java/build.xml
index a0e29e7a449a04ac7a002a9b5c964ce8e8bec660..4c381a5a7d884253a11053d2204a7ff0266240b0 100644
--- a/router/java/build.xml
+++ b/router/java/build.xml
@@ -36,7 +36,7 @@
 
     <!-- only used if not set by a higher build.xml -->
     <property name="javac.compilerargs" value="" />
-    <property name="javac.version" value="1.7" />
+    <property name="javac.version" value="1.8" />
     <property name="manifest.classpath.name" value="Class-Path" />
 
     <target name="compile" depends="depend, dependVersion">
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 87e5bffca0684477c0ba8daee48da05fbea99f44..282c18b42238909e2faa8bba95d82c15667d116c 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 1;
+    public final static long BUILD = 2;
 
     /** for example "-test" */
     public final static String EXTRA = "";