diff --git a/debian-alt/bionic/changelog b/debian-alt/bionic/changelog
index e525bdddf611ad5dcba7093fcdf2cf7142cc32f6..7b01981009ffc9531a81e246d66a26da7cc9b291 100644
--- a/debian-alt/bionic/changelog
+++ b/debian-alt/bionic/changelog
@@ -1,3 +1,9 @@
+i2p (0.9.48-1~bionic+1) bionic; urgency=medium
+
+  * New upstream version 0.9.48
+
+ -- zzz on i2p (key signing) <zzz@i2pmail.org>  Wed, 02 Dec 2020 12:12:12 +0000
+
 i2p (0.9.47-1~bionic+1) bionic; urgency=medium
 
   * New upstream version 0.9.47
diff --git a/debian-alt/doc/launchpad.txt b/debian-alt/doc/launchpad.txt
index a4f13c42c56026c2a1b73be20e2f79c2ae19f8e1..5d78ba332411e23a8ce92fe57b78932e5d5d6208 100644
--- a/debian-alt/doc/launchpad.txt
+++ b/debian-alt/doc/launchpad.txt
@@ -14,14 +14,16 @@ Versions are as follows:
 
 Min version	Max version	Uses src pkg	Copied to Debian
 -----------	-----------	------------	----------------
-xenial		yakkety		xenial		--
 bionic		cosmic		bionic		--
-focal		groovy		bionic		buster, sid
+focal		hirsute		bionic		buster, sid
 
 Unsupported (Java 7):
 precise		saucy   	precise		wheezy
 trusty		wily		precise		jessie, stretch
 
+Unsupported (ant < 1.9.8)
+xenial		yakkety		xenial		--
+
 
 Prep (first time only)
 ----------------------
@@ -151,7 +153,7 @@ Release
 -------
 
 Then copy from your PPA to the i2p-maintainers PPA.
-Then in the i2p-maintainers PPA, copy focal to groovy.
+Then in the i2p-maintainers PPA, copy focal to groovy and hirsute.
 Did a new series open up since the last time you did this? Copy to the new one also.
   (select "copy existing binaries")
   Copy xenial first and wait for it to be published in i2p-maintainers or the others will fail.
@@ -182,7 +184,7 @@ At your milestone, 'release now'
     Release notes: empty
     Changelog: empty
 Click 'create release'
-Now you on the page for that milestone
+Now you are on the page for that milestone
 Click 'add download file'
 For each of the four files
     i2psource_0.9.xx.tar.bz2
diff --git a/debian-alt/focal/changelog b/debian-alt/focal/changelog
index dd1bea662c628665cb28d4a6688ed2fcbc647dd0..0102159452477b3776dbe670f9260921abde0c16 100644
--- a/debian-alt/focal/changelog
+++ b/debian-alt/focal/changelog
@@ -1,3 +1,9 @@
+i2p (0.9.48-1ubuntu1) focal; urgency=medium
+
+  * New upstream version 0.9.48
+
+ -- zzz on i2p (key signing) <zzz@i2pmail.org>  Wed, 02 Dec 2020 12:12:12 +0000
+
 i2p (0.9.47-1ubuntu1) focal; urgency=medium
 
   * New upstream version 0.9.47
diff --git a/debian-alt/xenial/patches/0002-jetty-old-api.patch b/debian-alt/xenial/patches/0002-jetty-old-api.patch
index 15d75dfdc705be061b44d920bafd37588bfd27f7..4dfe8d2887981ee8db2ed5d4830cc82eacc97658 100644
--- a/debian-alt/xenial/patches/0002-jetty-old-api.patch
+++ b/debian-alt/xenial/patches/0002-jetty-old-api.patch
@@ -50,7 +50,7 @@ Index: b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
 ============================================================
 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
 +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
-@@ -1086,8 +1086,8 @@ public class RouterConsoleRunner impleme
+@@ -1102,8 +1102,8 @@ public class RouterConsoleRunner impleme
          }
  
          @Override
diff --git a/debian/patches/0001-path-substitution.patch b/debian/patches/0001-path-substitution.patch
index a34078c6778005de58b706b76fdf1d17feff7dc9..a6c18bf61a94d8ef1c4add708ab3b6c33fb99637 100644
--- a/debian/patches/0001-path-substitution.patch
+++ b/debian/patches/0001-path-substitution.patch
@@ -531,7 +531,7 @@ Index: b/installer/resources/locale/po/messages_ru.po
 ===================================================================
 --- a/installer/resources/locale/po/messages_ru.po
 +++ b/installer/resources/locale/po/messages_ru.po
-@@ -192,13 +192,13 @@ msgid "Request a Java thread dump if run
+@@ -193,13 +193,13 @@ msgid "Request a Java thread dump if run
  msgstr "Запросить дамп нитей Java, если запущено."
  
  #: ../i2prouter:1874
diff --git a/debian/patches/0002-jetty-compatibility.patch b/debian/patches/0002-jetty-compatibility.patch
index 566929b7fbae5277093d03d3c81826ead960edf6..63991190b5b45c3a55eccbaa8cf3aa5043f831d5 100644
--- a/debian/patches/0002-jetty-compatibility.patch
+++ b/debian/patches/0002-jetty-compatibility.patch
@@ -33,7 +33,7 @@
  import org.eclipse.jetty.security.authentication.DigestAuthenticator;
  import org.eclipse.jetty.server.AbstractConnector;
  import org.eclipse.jetty.server.ConnectionFactory;
-@@ -973,6 +975,8 @@
+@@ -989,6 +991,8 @@
              } else {
                  HashLoginService realm = new CustomHashLoginService(JETTY_REALM, context.getContextPath(),
                                                                      ctx.logManager().getLog(RouterConsoleRunner.class));
@@ -42,7 +42,7 @@
                  sec.setLoginService(realm);
                  sec.setAuthenticator(authenticator);
                  String[] role = new String[] {JETTY_ROLE};
-@@ -980,7 +984,7 @@
+@@ -996,7 +1000,7 @@
                      String user = e.getKey();
                      String pw = e.getValue();
                      Credential cred = Credential.getCredential(MD5_CREDENTIAL_TYPE + pw);
@@ -51,7 +51,7 @@
                      Constraint constraint = new Constraint(user, JETTY_ROLE);
                      constraint.setAuthenticate(true);
                      ConstraintMapping cm = new ConstraintMapping();
-@@ -1000,7 +1004,7 @@
+@@ -1016,7 +1020,7 @@
                          try {
                              // each char truncated to 8 bytes
                              String user2 = new String(b2, "ISO-8859-1");
@@ -60,7 +60,7 @@
                              constraint = new Constraint(user2, JETTY_ROLE);
                              constraint.setAuthenticate(true);
                              cm = new ConstraintMapping();
-@@ -1011,7 +1015,7 @@
+@@ -1027,7 +1031,7 @@
                              // each UTF-8 byte as a char
                              // this is what chrome does
                              String user3 = new String(b1, "ISO-8859-1");
@@ -71,7 +71,7 @@
                              cm = new ConstraintMapping();
 --- a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java
 +++ b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java
-@@ -85,9 +85,9 @@
+@@ -87,9 +87,9 @@
                      String testPath = pathInContext.substring(0, len - 4) + '_' + lang + ".jsp";
                      // Do we have a servlet for the new path that isn't the catchall *.jsp?
                      @SuppressWarnings("rawtypes")
diff --git a/installer/resources/checklist.md b/installer/resources/checklist.md
index 88535d4f818d0c05699885966736cfb2f84e02d4..64fc12b529cfe5d951e542b3167abdc1d1f2f513 100644
--- a/installer/resources/checklist.md
+++ b/installer/resources/checklist.md
@@ -98,7 +98,7 @@
     release.gpg.keyid=0xnnnnnnnn
     release.signer.su3=xxx@mail.i2p
     build.built-by=xxx
-    javac.compilerargs=-bootclasspath /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jce.jar
+    javac.compilerargs=-bootclasspath /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar
     ```
 
 5. Copy latest trust list _MTN/monotonerc from website or some other workspace
@@ -145,7 +145,7 @@
   - Run rh.bat to edit the resources
   - Sign the windows installer:
     Open Visual Studio developer prompt
-    signtool sign /debug /fd SHA256 i2pinstall_${release.number}_windows.exe
+    signtool sign /a /debug /fd SHA256 i2pinstall_${release.number}_windows.exe
   - GPG sign the signed windows installer: gpg -u keyid -b i2pinstall_${release.number}_windows.exe
   - sha256sum i2pinstall_${release.number}_windows.exe