Merge branch 'stable-7.1' into stable-7.2

* stable-7.1:
  RevWalk: Add an isMergedIntoAnyCommit() method
  Pack: separate an open/close accounting lock
  http.server/BUILD: expose servlet resources as target

Change-Id: Ie53048a5154a4a40f7c0f9da3b8b829d305ab323
diff --git a/.mailmap b/.mailmap
index 7116ebb..1c77395 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1,20 +1,33 @@
+Adithya Chakilam <quic_achakila@quicinc.com>                Adithya Chakilam <achakila@codeaurora.org>
 Chris Aniszczyk <caniszczyk@gmail.com>                      Chris Aniszczyk <zx@eclipsesource.com>
 Christian Halstrick <christian.halstrick@sap.com>           Christian Halstrick <christian.halstrick@gmail.com>
 Dani Megert <Daniel_Megert@ch.ibm.com>                      Daniel Megert <daniel_megert@ch.ibm.com>
+Dariusz Luksza <dariusz.luksza@gmail.com>                   Dariusz Luksza <dariusz@luksza.org>
+David Ostrovsky <david.ostrovsky@gmail.com>                 David Ostrovsky <david@ostrovsky.org>
 David Pursehouse <david.pursehouse@gmail.com>               David Pursehouse <david.pursehouse@sonymobile.com>
 Han-Wen Nienhuys <hanwen@google.com>                        Han-Wen NIenhuys <hanwen@google.com>
 Hector Oswaldo Caballero <hector.caballero@ericsson.com>    Hector Caballero <hector.caballero@ericsson.com>
+Jackson Toeniskoetter <jackdt@google.com>                   <jackdt@google.com>
 Lars Vogel <Lars.Vogel@vogella.com>                         Lars Vogel <Lars.Vogel@gmail.com>
 Mark Ingram <markdingram@gmail.com>                         markdingram <markdingram@gmail.com>
 Markus Duft <markus.duft@ssi-schaefer.com>                  Markus Duft <markus.duft@salomon.at>
+Martin Fick <mfick@nvidia.com>                              Martin Fick <mfick@codeaurora.org>
+Martin Fick <mfick@nvidia.com>                              Martin Fick <quic_mfick@quicinc.com>
 Michael Keppler <michael.keppler@gmx.de>                    Michael Keppler <Michael.Keppler@gmx.de>
+Nasser Grainawi <quic_nasserg@quicinc.com>                  Nasser Grainawi <nasser@codeaurora.org>
 Roberto Tyley <roberto.tyley@guardian.co.uk>                roberto <roberto.tyley@guardian.co.uk>
 Saša Živkov <sasa.zivkov@sap.com>                           Sasa Zivkov <sasa.zivkov@sap.com>
 Saša Živkov <sasa.zivkov@sap.com>                           Saša Živkov <zivkov@gmail.com>
 Saša Živkov <sasa.zivkov@sap.com>                           Sasa Zivkov <zivkov@gmail.com>
 Sebastian Schuberth <sschuberth@gmail.com>                  Sebastian Schuberth <sebastian.schuberth@bosch.io>
+Sebastian Schuberth <sschuberth@gmail.com>                  <opensource@schuberth.dev>
 Shawn Pearce <spearce@spearce.org>                          Shawn O. Pearce <sop@google.com>
 Shawn Pearce <spearce@spearce.org>                          Shawn Pearce <sop@google.com>
 Shawn Pearce <spearce@spearce.org>                          Shawn O. Pearce <spearce@spearce.org>
+Sven Selberg <sven.selberg@axis.com>                        Sven Selberg <sven.selberg@sonymobile.com>
 Terry Parker <tparker@google.com>                           tparker <tparker@google.com>
 Thomas Wolf <twolf@apache.org>                              Thomas Wolf <thomas.wolf@paranor.ch>
+Tomasz Zarna <tzarna@gmail.com>                             <Tomasz.Zarna@pl.ibm.com>
+Tomasz Zarna <tzarna@gmail.com>                             <tomasz.zarna@tasktop.com>
+Tobias Pfeifer <to.pfeifer@web.de>                          <to.pfeifer@sap.com>
+Yunjie Li <yunjieli@google.com>                             <yunjieli@google.com>
diff --git a/WORKSPACE b/WORKSPACE
index e1adb8a..c0e8236 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -122,24 +122,24 @@
     sha1 = "c070ac920e72023ae9ab0a3f3a866bece284b470",
 )
 
-JNA_VERS = "5.15.0"
+JNA_VERS = "5.16.0"
 
 maven_jar(
     name = "jna",
     artifact = "net.java.dev.jna:jna:" + JNA_VERS,
-    sha1 = "01ee1d80ff44f08280188f7c0e740d57207841ac",
+    sha1 = "ebea09f91dc9f7048099f963fb8d6f919f0a4d9c",
 )
 
 maven_jar(
     name = "jna-platform",
     artifact = "net.java.dev.jna:jna-platform:" + JNA_VERS,
-    sha1 = "86b502cad57d45da172b5e3231c537b042e296ef",
+    sha1 = "b2a9065f97c166893d504b164706512338e3bbc2",
 )
 
 maven_jar(
     name = "commons-codec",
-    artifact = "commons-codec:commons-codec:1.17.1",
-    sha1 = "973638b7149d333563584137ebf13a691bb60579",
+    artifact = "commons-codec:commons-codec:1.17.2",
+    sha1 = "cd6bb9d856db5f61871a94d5801efd0b93b7fcb2",
 )
 
 maven_jar(
@@ -180,8 +180,8 @@
 
 maven_jar(
     name = "commons-io",
-    artifact = "commons-io:commons-io:2.17.0",
-    sha1 = "ddcc8433eb019fb48fe25207c0278143f3e1d7e2",
+    artifact = "commons-io:commons-io:2.18.0",
+    sha1 = "44084ef756763795b31c578403dd028ff4a22950",
 )
 
 maven_jar(
@@ -210,28 +210,28 @@
 
 maven_jar(
     name = "mockito",
-    artifact = "org.mockito:mockito-core:5.14.2",
-    sha1 = "f7bf936008d7664e2002c3faf0c02071c8d10e7c",
+    artifact = "org.mockito:mockito-core:5.15.2",
+    sha1 = "87be4b1e0cc5febc07ab3197a8ff3ede56b37a79",
 )
 
 maven_jar(
     name = "assertj-core",
-    artifact = "org.assertj:assertj-core:3.26.3",
-    sha1 = "0d26263eb7524252d98e602fc6942996a3195e29",
+    artifact = "org.assertj:assertj-core:3.27.3",
+    sha1 = "31f5d58a202bd5df4993fb10fa2cffd610c20d6f",
 )
 
-BYTE_BUDDY_VERSION = "1.15.10"
+BYTE_BUDDY_VERSION = "1.16.1"
 
 maven_jar(
     name = "bytebuddy",
     artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VERSION,
-    sha1 = "635c873fadd853c084f84fdc3cbd58c5dd8537f9",
+    sha1 = "f95f4d5efa5e07706129048a62b38a0acb35592c",
 )
 
 maven_jar(
     name = "bytebuddy-agent",
     artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VERSION,
-    sha1 = "0e8eb255b2c378b9a6c7341e7b0e12f0a5636377",
+    sha1 = "22bb84b3bda45a329d17930809683484a5ac2db2",
 )
 
 maven_jar(
@@ -246,82 +246,78 @@
     sha1 = "527175ca6d81050b53bdd4c457a6d6e017626b0e",
 )
 
-JETTY_VER = "12.0.15"
+JETTY_VER = "12.0.16"
 
 maven_jar(
     name = "jetty-servlet",
     artifact = "org.eclipse.jetty.ee10:jetty-ee10-servlet:" + JETTY_VER,
-    sha1 = "a9362717fa1756f9f1f18e0ef2ce671e742b7afb",
+    sha1 = "022a746c00b1ac5c790fee65a398c707160a46d8",
 )
 
 maven_jar(
     name = "jetty-security",
     artifact = "org.eclipse.jetty:jetty-security:" + JETTY_VER,
-    sha1 = "e15efd84ed53277f8e893574edaed4734c161f44",
+    sha1 = "23b1a3abecf9d6f5498064a32d9145ae1d8330f9",
 )
 
 maven_jar(
     name = "jetty-server",
     artifact = "org.eclipse.jetty:jetty-server:" + JETTY_VER,
-    sha1 = "2bd3742c6831e42c6ebfa9c990386a8dca71dee8",
+    sha1 = "3e3638b4bfbee04c27b3ae68e4949fc43b40a042",
 )
 
 maven_jar(
     name = "jetty-session",
     artifact = "org.eclipse.jetty:jetty-session:" + JETTY_VER,
-    sha1 = "2819021282ff2f7fbaa53feb2fe063130bd4613c",
+    sha1 = "79cdedc7afebbdba4453f603dfe2f970baa35cc3",
 )
 
 maven_jar(
     name = "jetty-http",
     artifact = "org.eclipse.jetty:jetty-http:" + JETTY_VER,
-    sha1 = "a36fcfde8316b374102c5b43d7247ec501e906d8",
+    sha1 = "68019fa90e8420ae15c109bd8c8611cacbaf43e5",
 )
 
 maven_jar(
     name = "jetty-io",
     artifact = "org.eclipse.jetty:jetty-io:" + JETTY_VER,
-    sha1 = "e1657f842a0e362171a8a41f35d85cdba1a47872",
+    sha1 = "7a162c537a99bbaf35a074fec9a50815e6c81d9d",
 )
 
 maven_jar(
     name = "jetty-util",
     artifact = "org.eclipse.jetty:jetty-util:" + JETTY_VER,
-    sha1 = "9fbd3ac58607af034ad065b366798798bb5f7b5e",
+    sha1 = "e262e505363e5925df15618622d9888aefc1b0d0",
 )
 
 maven_jar(
     name = "jetty-util-ajax",
     artifact = "org.eclipse.jetty:jetty-util-ajax:" + JETTY_VER,
-    sha1 = "d5c2f0ea177c5c178874101c186cc9729cf7ea92",
+    sha1 = "60225034131e3f771b40bc75c15bd9cc4952302b",
 )
 
-BOUNCYCASTLE_VER = "1.79"
+BOUNCYCASTLE_VER = "1.80"
 
 maven_jar(
     name = "bcpg",
     artifact = "org.bouncycastle:bcpg-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "904dd8a8e1c9f7d58d1ffa7f4ca3fb00736a601f",
-    src_sha1 = "9e372826141edb213d5921131ee68dc276dc99ef",
+    sha1 = "163889a825393854dbe7dc52f1a8667e715e9859",
 )
 
 maven_jar(
     name = "bcprov",
     artifact = "org.bouncycastle:bcprov-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "4d8e2732bcee15f1db93df266c3f5b70ce5cac21",
-    src_sha1 = "8647816d667ee526a8e3a456229ac5f9f96d2315",
+    sha1 = "e22100b41042decf09cab914a5af8d2c57b5ac4a",
 )
 
 maven_jar(
     name = "bcutil",
     artifact = "org.bouncycastle:bcutil-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "ecfc5aef97cc7676ea0de5c53c407b9f533f0ad5",
-    src_sha1 = "00df03977fb0b80395da655623abca9d7d7dcb66",
+    sha1 = "b95726d1d49a0c65010c59a3e6640311d951bfd1",
 )
 
 maven_jar(
     name = "bcpkix",
     artifact = "org.bouncycastle:bcpkix-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "7693cec3b8779b74b35466dcaeeaac7409872954",
-    src_sha1 = "57a60d1d9f75320eef70a095dfae679d97ade1c2",
+    sha1 = "5277dfaaef2e92ce1d802499599a0ca7488f86e6",
 )
diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
index 4ac514a..0069b09 100644
--- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
@@ -5,13 +5,13 @@
 Automatic-Module-Name: org.eclipse.jgit.ant.test
 Bundle-SymbolicName: org.eclipse.jgit.ant.test
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Import-Package: org.apache.tools.ant,
- org.eclipse.jgit.ant.tasks;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.ant.tasks;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.ant.test/pom.xml b/org.eclipse.jgit.ant.test/pom.xml
index 4e4b39f..c6c8164 100644
--- a/org.eclipse.jgit.ant.test/pom.xml
+++ b/org.eclipse.jgit.ant.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ant.test</artifactId>
diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
index 75a0967..3af82e4 100644
--- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
@@ -3,13 +3,13 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ant
 Bundle-SymbolicName: org.eclipse.jgit.ant
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Import-Package: org.apache.tools.ant,
-  org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)"
+  org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)"
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.ant;version="7.1.1",
- org.eclipse.jgit.ant.tasks;version="7.1.1";
+Export-Package: org.eclipse.jgit.ant;version="7.2.0",
+ org.eclipse.jgit.ant.tasks;version="7.2.0";
   uses:="org.apache.tools.ant,
    org.apache.tools.ant.types"
diff --git a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
index 3a12339..89d05be 100644
--- a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ant - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ant.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ant;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ant;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml
index 157a67b..11806f1 100644
--- a/org.eclipse.jgit.ant/pom.xml
+++ b/org.eclipse.jgit.ant/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ant</artifactId>
diff --git a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
index 067d327..b142a66 100644
--- a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.archive
 Bundle-SymbolicName: org.eclipse.jgit.archive
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -13,18 +13,18 @@
  org.apache.commons.compress.compressors.bzip2;version="[1.4,2.0)",
  org.apache.commons.compress.compressors.gzip;version="[1.4,2.0)",
  org.apache.commons.compress.compressors.xz;version="[1.4,2.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.osgi.framework;version="[1.3.0,2.0.0)",
  org.tukaani.xz
 Bundle-ActivationPolicy: lazy
 Bundle-Activator: org.eclipse.jgit.archive.FormatActivator
-Export-Package: org.eclipse.jgit.archive;version="7.1.1";
+Export-Package: org.eclipse.jgit.archive;version="7.2.0";
   uses:="org.apache.commons.compress.archivers,
    org.osgi.framework,
    org.eclipse.jgit.api,
    org.eclipse.jgit.lib",
- org.eclipse.jgit.archive.internal;version="7.1.1";x-internal:=true
+ org.eclipse.jgit.archive.internal;version="7.2.0";x-internal:=true
diff --git a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
index e7e2799..3ca6590 100644
--- a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.archive - Sources
 Bundle-SymbolicName: org.eclipse.jgit.archive.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.archive;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.archive;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml
index cf02499..27a2bba 100644
--- a/org.eclipse.jgit.archive/pom.xml
+++ b/org.eclipse.jgit.archive/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.archive</artifactId>
diff --git a/org.eclipse.jgit.benchmarks/pom.xml b/org.eclipse.jgit.benchmarks/pom.xml
index 0e267f9..c92fa9f 100644
--- a/org.eclipse.jgit.benchmarks/pom.xml
+++ b/org.eclipse.jgit.benchmarks/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.benchmarks</artifactId>
@@ -79,7 +79,6 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>${maven-compiler-plugin-version}</version>
         <configuration>
           <encoding>UTF-8</encoding>
           <release>${java.version}</release>
diff --git a/org.eclipse.jgit.coverage/pom.xml b/org.eclipse.jgit.coverage/pom.xml
index 5cbf6a7..9493c07 100644
--- a/org.eclipse.jgit.coverage/pom.xml
+++ b/org.eclipse.jgit.coverage/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
@@ -27,88 +27,88 @@
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ant</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.archive</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.apache</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.server</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.server</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ui</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ssh.apache</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ant.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ssh.apache.test</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
   </dependencies>
 
diff --git a/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
index a9e4bf6..3529425 100644
--- a/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.gpg.bc.test
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -14,9 +14,9 @@
  org.bouncycastle.openpgp.operator;version="[1.79.0,2.0.0)",
  org.bouncycastle.openpgp.operator.jcajce;version="[1.79.0,2.0.0)",
  org.bouncycastle.util.encoders;version="[1.79.0,2.0.0)",
- org.eclipse.jgit.gpg.bc.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.gpg.bc.internal.keys;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.sha1;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.gpg.bc.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.gpg.bc.internal.keys;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.sha1;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
  org.junit.runners;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.gpg.bc.test/pom.xml b/org.eclipse.jgit.gpg.bc.test/pom.xml
index 5a7cef5..245ba7e 100644
--- a/org.eclipse.jgit.gpg.bc.test/pom.xml
+++ b/org.eclipse.jgit.gpg.bc.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.gpg.bc.test</artifactId>
diff --git a/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF b/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
index 345461d..2120439 100644
--- a/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
@@ -3,10 +3,10 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.gpg.bc
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc;singleton:=true
-Fragment-Host: org.eclipse.jgit;bundle-version="[7.1.1,7.2.0)"
+Fragment-Host: org.eclipse.jgit;bundle-version="[7.2.0,7.3.0)"
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/gpg_bc
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Import-Package: org.bouncycastle.asn1;version="[1.79.0,2.0.0)",
  org.bouncycastle.asn1.x9;version="[1.79.0,2.0.0)",
@@ -26,5 +26,5 @@
  org.bouncycastle.openpgp.operator.jcajce;version="[1.79.0,2.0.0)",
  org.bouncycastle.util.encoders;version="[1.79.0,2.0.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
-Export-Package: org.eclipse.jgit.gpg.bc.internal;version="7.1.1";x-friends:="org.eclipse.jgit.gpg.bc.test",
- org.eclipse.jgit.gpg.bc.internal.keys;version="7.1.1";x-friends:="org.eclipse.jgit.gpg.bc.test"
+Export-Package: org.eclipse.jgit.gpg.bc.internal;version="7.2.0";x-friends:="org.eclipse.jgit.gpg.bc.test",
+ org.eclipse.jgit.gpg.bc.internal.keys;version="7.2.0";x-friends:="org.eclipse.jgit.gpg.bc.test"
diff --git a/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
index 9c94e59..532e749 100644
--- a/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.gpg.bc - Sources
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.gpg.bc;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.gpg.bc;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.gpg.bc/pom.xml b/org.eclipse.jgit.gpg.bc/pom.xml
index 0090c2b..f94e2b2 100644
--- a/org.eclipse.jgit.gpg.bc/pom.xml
+++ b/org.eclipse.jgit.gpg.bc/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.gpg.bc</artifactId>
diff --git a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
index c7f914d..7d23d53 100644
--- a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.apache
 Bundle-SymbolicName: org.eclipse.jgit.http.apache
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
@@ -26,11 +26,11 @@
  org.apache.http.impl.conn;version="[4.4.0,5.0.0)",
  org.apache.http.params;version="[4.3.0,5.0.0)",
  org.apache.http.ssl;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)"
-Export-Package: org.eclipse.jgit.transport.http.apache;version="7.1.1";
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)"
+Export-Package: org.eclipse.jgit.transport.http.apache;version="7.2.0";
   uses:="org.apache.http.client,
    org.eclipse.jgit.transport.http,
    org.apache.http.entity,
diff --git a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
index 87c7981..679252d 100644
--- a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.http.apache - Sources
 Bundle-SymbolicName: org.eclipse.jgit.http.apache.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml
index a1c03fd..c390d8f 100644
--- a/org.eclipse.jgit.http.apache/pom.xml
+++ b/org.eclipse.jgit.http.apache/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.apache</artifactId>
diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
index f826797..39dc2ef 100644
--- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
@@ -3,14 +3,14 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.server
 Bundle-SymbolicName: org.eclipse.jgit.http.server
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.http.server;version="7.1.1",
- org.eclipse.jgit.http.server.glue;version="7.1.1";
+Export-Package: org.eclipse.jgit.http.server;version="7.2.0",
+ org.eclipse.jgit.http.server.glue;version="7.2.0";
   uses:="jakarta.servlet,
   	jakarta.servlet.http",
- org.eclipse.jgit.http.server.resolver;version="7.1.1";
+ org.eclipse.jgit.http.server.resolver;version="7.2.0";
   uses:="jakarta.servlet.http
    org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.lib,
@@ -19,14 +19,14 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Import-Package: jakarta.servlet;version="[6.0.0,7.0.0)",
  jakarta.servlet.http;version="[6.0.0,7.0.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.parser;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.resolver;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)"
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.parser;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)"
diff --git a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
index cc9c765..e7940bd 100644
--- a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.http.server - Sources
 Bundle-SymbolicName: org.eclipse.jgit.http.server.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml
index f6d701c..3f79f8b 100644
--- a/org.eclipse.jgit.http.server/pom.xml
+++ b/org.eclipse.jgit.http.server/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.server</artifactId>
diff --git a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
index 89f06d6..3550501 100644
--- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.test
 Bundle-SymbolicName: org.eclipse.jgit.http.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -29,26 +29,26 @@
  org.eclipse.jetty.util.component;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.security;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.thread;version="[12.0.0,13.0.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.http.server;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.http.server.glue;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.http.server.resolver;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http.apache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.resolver;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.http.server;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.http.server.glue;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.http.server.resolver;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http.apache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml
index 6e9601e..2f25191 100644
--- a/org.eclipse.jgit.http.test/pom.xml
+++ b/org.eclipse.jgit.http.test/pom.xml
@@ -18,7 +18,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.test</artifactId>
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
index 850e895..b0d17ad 100644
--- a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
@@ -1728,7 +1728,8 @@ public void testPush_CreateBranch() throws Exception {
 		assertEquals(Q, remoteRepository.exactRef(dstName).getObjectId());
 		fsck(remoteRepository, Q);
 
-		final ReflogReader log = remoteRepository.getReflogReader(dstName);
+		final ReflogReader log = remoteRepository.getRefDatabase()
+				.getReflogReader(dstName);
 		assertNotNull("has log for " + dstName, log);
 
 		final ReflogEntry last = log.getLastEntry();
diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
index 7f1a850..4ba5959 100644
--- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit.http
 Bundle-SymbolicName: org.eclipse.jgit.junit.http
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -22,17 +22,17 @@
  org.eclipse.jetty.util.component;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.security;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.ssl;version="[12.0.0,13.0.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.http.server;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.resolver;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.http.server;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.slf4j.helpers;version="[1.7.0,3.0.0)"
-Export-Package: org.eclipse.jgit.junit.http;version="7.1.1";
+Export-Package: org.eclipse.jgit.junit.http;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    jakarta.servlet,
    jakarta.servlet.http,
diff --git a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
index dc32c8d..5abd7d6 100644
--- a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.junit.http - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.http.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml
index e7688c1..ea38ae3 100644
--- a/org.eclipse.jgit.junit.http/pom.xml
+++ b/org.eclipse.jgit.junit.http/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit.http</artifactId>
diff --git a/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF
index 7a99b49..bcd9fbf 100644
--- a/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit.ssh
 Bundle-SymbolicName: org.eclipse.jgit.junit.ssh
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -33,16 +33,16 @@
  org.apache.sshd.server.subsystem;version="[2.14.0,2.15.0)",
  org.apache.sshd.sftp;version="[2.14.0,2.15.0)",
  org.apache.sshd.sftp.server;version="[2.14.0,2.15.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
-Export-Package: org.eclipse.jgit.junit.ssh;version="7.1.1"
+Export-Package: org.eclipse.jgit.junit.ssh;version="7.2.0"
diff --git a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
index a295cf2..b8f22ce 100644
--- a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.junit.ssh - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.ssh.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit.ssh/pom.xml b/org.eclipse.jgit.junit.ssh/pom.xml
index 5fc3c6a..f937748 100644
--- a/org.eclipse.jgit.junit.ssh/pom.xml
+++ b/org.eclipse.jgit.junit.ssh/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit.ssh</artifactId>
diff --git a/org.eclipse.jgit.junit/.settings/.api_filters b/org.eclipse.jgit.junit/.settings/.api_filters
new file mode 100644
index 0000000..2781530
--- /dev/null
+++ b/org.eclipse.jgit.junit/.settings/.api_filters
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.jgit.junit" version="2">
+    <resource path="src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java" type="org.eclipse.jgit.junit.LocalDiskRepositoryTestCase">
+        <filter id="336658481">
+            <message_arguments>
+                <message_argument value="org.eclipse.jgit.junit.LocalDiskRepositoryTestCase"/>
+                <message_argument value="testRoot"/>
+            </message_arguments>
+        </filter>
+    </resource>
+</component>
diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
index e8d00d6..6488a88 100644
--- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
@@ -3,36 +3,36 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit
 Bundle-SymbolicName: org.eclipse.jgit.junit
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Import-Package: org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.dircache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.pack;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.merge;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="7.1.1",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.io;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.time;version="[7.1.1,7.2.0)",
+Import-Package: org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.dircache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.merge;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="7.2.0",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.io;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.time;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
  org.junit.runners;version="[4.13,5.0.0)",
  org.junit.runners.model;version="[4.13,5.0.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
-Export-Package: org.eclipse.jgit.junit;version="7.1.1";
+Export-Package: org.eclipse.jgit.junit;version="7.2.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -45,4 +45,4 @@
    org.junit.runners.model,
    org.junit.runner,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.junit.time;version="7.1.1";uses:="org.eclipse.jgit.util.time"
+ org.eclipse.jgit.junit.time;version="7.2.0";uses:="org.eclipse.jgit.util.time"
diff --git a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
index b5f9641..9d494cb 100644
--- a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.junit - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.junit;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.junit;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml
index d9ef7da..9f43ced 100644
--- a/org.eclipse.jgit.junit/pom.xml
+++ b/org.eclipse.jgit.junit/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit</artifactId>
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/FakeIndexFactory.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/FakeIndexFactory.java
new file mode 100644
index 0000000..eb23bec
--- /dev/null
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/FakeIndexFactory.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2025, Google Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.junit;
+
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toUnmodifiableList;
+
+import java.io.IOException;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.storage.file.PackIndex;
+import org.eclipse.jgit.internal.storage.file.PackIndex.EntriesIterator;
+import org.eclipse.jgit.internal.storage.file.PackReverseIndex;
+import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Create indexes with predefined data
+ *
+ * @since 7.2
+ */
+public class FakeIndexFactory {
+
+	/**
+	 * An object for the fake index
+	 *
+	 * @param name
+	 *            a sha1
+	 * @param offset
+	 *            the (fake) position of the object in the pack
+	 */
+	public record IndexObject(String name, long offset) {
+		/**
+		 * Name (sha1) as an objectId
+		 *
+		 * @return name (a sha1) as an objectId.
+		 */
+		public ObjectId getObjectId() {
+			return ObjectId.fromString(name);
+		}
+	}
+
+	/**
+	 * Return an index populated with these objects
+	 *
+	 * @param objs
+	 *            objects to be indexed
+	 * @return a PackIndex implementation
+	 */
+	public static PackIndex indexOf(List<IndexObject> objs) {
+		return new FakePackIndex(objs);
+	}
+
+	/**
+	 * Return a reverse pack index with these objects
+	 *
+	 * @param objs
+	 *            objects to be indexed
+	 * @return a PackReverseIndex implementation
+	 */
+	public static PackReverseIndex reverseIndexOf(List<IndexObject> objs) {
+		return new FakeReverseIndex(objs);
+	}
+
+	private FakeIndexFactory() {
+	}
+
+	private static class FakePackIndex implements PackIndex {
+		private static final Comparator<IndexObject> SHA1_COMPARATOR = (o1,
+				o2) -> String.CASE_INSENSITIVE_ORDER.compare(o1.name(),
+						o2.name());
+
+		private final Map<String, IndexObject> idx;
+
+		private final List<IndexObject> sha1Ordered;
+
+		private final long offset64count;
+
+		FakePackIndex(List<IndexObject> objs) {
+			sha1Ordered = objs.stream().sorted(SHA1_COMPARATOR)
+					.collect(toUnmodifiableList());
+			idx = objs.stream().collect(toMap(IndexObject::name, identity()));
+			offset64count = objs.stream()
+					.filter(o -> o.offset > Integer.MAX_VALUE).count();
+		}
+
+		@Override
+		public Iterator<MutableEntry> iterator() {
+			return new FakeEntriesIterator(sha1Ordered);
+		}
+
+		@Override
+		public long getObjectCount() {
+			return sha1Ordered.size();
+		}
+
+		@Override
+		public long getOffset64Count() {
+			return offset64count;
+		}
+
+		@Override
+		public ObjectId getObjectId(long nthPosition) {
+			return ObjectId
+					.fromString(sha1Ordered.get((int) nthPosition).name());
+		}
+
+		@Override
+		public long getOffset(long nthPosition) {
+			return sha1Ordered.get((int) nthPosition).offset();
+		}
+
+		@Override
+		public long findOffset(AnyObjectId objId) {
+			IndexObject o = idx.get(objId.name());
+			if (o == null) {
+				return -1;
+			}
+			return o.offset();
+		}
+
+		@Override
+		public int findPosition(AnyObjectId objId) {
+			IndexObject o = idx.get(objId.name());
+			if (o == null) {
+				return -1;
+			}
+			return sha1Ordered.indexOf(o);
+		}
+
+		@Override
+		public long findCRC32(AnyObjectId objId) throws MissingObjectException {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override
+		public boolean hasCRC32Support() {
+			return false;
+		}
+
+		@Override
+		public void resolve(Set<ObjectId> matches, AbbreviatedObjectId id,
+				int matchLimit) throws IOException {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override
+		public byte[] getChecksum() {
+			return new byte[0];
+		}
+	}
+
+	private static class FakeReverseIndex implements PackReverseIndex {
+		private static final Comparator<IndexObject> OFFSET_COMPARATOR = Comparator
+				.comparingLong(IndexObject::offset);
+
+		private final List<IndexObject> byOffset;
+
+		private final Map<Long, IndexObject> ridx;
+
+		FakeReverseIndex(List<IndexObject> objs) {
+			byOffset = objs.stream().sorted(OFFSET_COMPARATOR)
+					.collect(toUnmodifiableList());
+			ridx = byOffset.stream()
+					.collect(toMap(IndexObject::offset, identity()));
+		}
+
+		@Override
+		public void verifyPackChecksum(String packFilePath) {
+			// Do nothing
+		}
+
+		@Override
+		public ObjectId findObject(long offset) {
+			IndexObject indexObject = ridx.get(offset);
+			if (indexObject == null) {
+				return null;
+			}
+			return ObjectId.fromString(indexObject.name());
+		}
+
+		@Override
+		public long findNextOffset(long offset, long maxOffset)
+				throws CorruptObjectException {
+			IndexObject o = ridx.get(offset);
+			if (o == null) {
+				throw new CorruptObjectException("Invalid offset"); //$NON-NLS-1$
+			}
+			int pos = byOffset.indexOf(o);
+			if (pos == byOffset.size() - 1) {
+				return maxOffset;
+			}
+			return byOffset.get(pos + 1).offset();
+		}
+
+		@Override
+		public int findPosition(long offset) {
+			IndexObject indexObject = ridx.get(offset);
+			return byOffset.indexOf(indexObject);
+		}
+
+		@Override
+		public ObjectId findObjectByPosition(int nthPosition) {
+			return byOffset.get(nthPosition).getObjectId();
+		}
+	}
+
+	private static class FakeEntriesIterator extends EntriesIterator {
+
+		private static final byte[] buffer = new byte[Constants.OBJECT_ID_LENGTH];
+
+		private final Iterator<IndexObject> it;
+
+		FakeEntriesIterator(List<IndexObject> objs) {
+			super(objs.size());
+			it = objs.iterator();
+		}
+
+		@Override
+		protected void readNext() {
+			IndexObject next = it.next();
+			next.getObjectId().copyRawTo(buffer, 0);
+			setIdBuffer(buffer, 0);
+			setOffset(next.offset());
+		}
+	}
+}
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
index 407290a..0d20f64 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
@@ -20,19 +20,19 @@
 import java.io.IOException;
 import java.io.PrintStream;
 import java.time.Instant;
+import java.time.ZoneId;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheEntry;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.internal.util.ShutdownHook;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -47,6 +47,7 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 
 /**
@@ -84,6 +85,16 @@ public abstract class LocalDiskRepositoryTestCase {
 	protected MockSystemReader mockSystemReader;
 
 	private final Set<Repository> toClose = new HashSet<>();
+
+	/**
+	 * Temporary test root directory for files created by tests.
+	 * @since 7.2
+	 */
+	@Rule
+	public TemporaryFolder testRoot = new TemporaryFolder();
+
+	Random rand = new Random();
+
 	private File tmp;
 
 	private File homeDir;
@@ -114,11 +125,8 @@ private String getTestName() {
 	 */
 	@Before
 	public void setUp() throws Exception {
-		tmp = File.createTempFile("jgit_" + getTestName() + '_', "_tmp");
-		Cleanup.deleteOnShutdown(tmp);
-		if (!tmp.delete() || !tmp.mkdir()) {
-			throw new IOException("Cannot create " + tmp);
-		}
+		tmp = testRoot.newFolder(getTestName() + rand.nextInt());
+
 		mockSystemReader = new MockSystemReader();
 		SystemReader.setInstance(mockSystemReader);
 
@@ -219,12 +227,6 @@ public void tearDown() throws Exception {
 			System.gc();
 		}
 		FS.DETECTED.setUserHome(homeDir);
-		if (tmp != null) {
-			recursiveDelete(tmp, false, true);
-		}
-		if (tmp != null && !tmp.exists()) {
-			Cleanup.removed(tmp);
-		}
 		SystemReader.setInstance(null);
 	}
 
@@ -233,8 +235,8 @@ public void tearDown() throws Exception {
 	 */
 	protected void tick() {
 		mockSystemReader.tick(5 * 60);
-		final long now = mockSystemReader.getCurrentTime();
-		final int tz = mockSystemReader.getTimezone(now);
+		Instant now = mockSystemReader.now();
+		ZoneId tz = mockSystemReader.getTimeZoneId();
 
 		author = new PersonIdent(author, now, tz);
 		committer = new PersonIdent(committer, now, tz);
@@ -623,41 +625,4 @@ protected String read(File f) throws IOException {
 	private static HashMap<String, String> cloneEnv() {
 		return new HashMap<>(System.getenv());
 	}
-
-	private static final class Cleanup {
-		private static final Cleanup INSTANCE = new Cleanup();
-
-		static {
-			ShutdownHook.INSTANCE.register(() -> INSTANCE.onShutdown());
-		}
-
-		private final Set<File> toDelete = ConcurrentHashMap.newKeySet();
-
-		private Cleanup() {
-			// empty
-		}
-
-		static void deleteOnShutdown(File tmp) {
-			INSTANCE.toDelete.add(tmp);
-		}
-
-		static void removed(File tmp) {
-			INSTANCE.toDelete.remove(tmp);
-		}
-
-		private void onShutdown() {
-			// On windows accidentally open files or memory
-			// mapped regions may prevent files from being deleted.
-			// Suggesting a GC increases the likelihood that our
-			// test repositories actually get removed after the
-			// tests, even in the case of failure.
-			System.gc();
-			synchronized (this) {
-				boolean silent = false;
-				boolean failOnError = false;
-				for (File tmp : toDelete)
-					recursiveDelete(tmp, silent, failOnError);
-			}
-		}
-	}
 }
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
index c6cdfaf..2d00a85 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
@@ -21,6 +21,7 @@
 import java.io.OutputStream;
 import java.security.MessageDigest;
 import java.time.Instant;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -158,8 +159,8 @@ public TestRepository(R db, RevWalk rw, MockSystemReader reader)
 		this.pool = rw;
 		this.inserter = db.newObjectInserter();
 		this.mockSystemReader = reader;
-		long now = mockSystemReader.getCurrentTime();
-		int tz = mockSystemReader.getTimezone(now);
+		Instant now = mockSystemReader.now();
+		ZoneId tz = mockSystemReader.getTimeZoneAt(now);
 		defaultAuthor = new PersonIdent(AUTHOR, AUTHOR_EMAIL, now, tz);
 		defaultCommitter = new PersonIdent(COMMITTER, COMMITTER_EMAIL, now, tz);
 	}
@@ -198,7 +199,9 @@ public Git git() {
 	 *
 	 * @return current date.
 	 * @since 4.2
+	 * @deprecated Use {@link #getInstant()} instead.
 	 */
+	@Deprecated(since = "7.2")
 	public Date getDate() {
 		return new Date(mockSystemReader.getCurrentTime());
 	}
@@ -210,18 +213,31 @@ public Date getDate() {
 	 * @since 6.8
 	 */
 	public Instant getInstant() {
-		return Instant.ofEpochMilli(mockSystemReader.getCurrentTime());
+		return mockSystemReader.now();
 	}
 
 	/**
 	 * Get timezone
 	 *
 	 * @return timezone used for default identities.
+	 * @deprecated Use {@link #getTimeZoneId()} instead.
 	 */
+	@Deprecated(since = "7.2")
 	public TimeZone getTimeZone() {
 		return mockSystemReader.getTimeZone();
 	}
 
+
+	/**
+	 * Get timezone
+	 *
+	 * @return timezone used for default identities.
+	 * @since 7.2
+	 */
+	public ZoneId getTimeZoneId() {
+		return mockSystemReader.getTimeZoneId();
+	}
+
 	/**
 	 * Adjust the current time that will used by the next commit.
 	 *
@@ -233,14 +249,14 @@ public void tick(int secDelta) {
 	}
 
 	/**
-	 * Set the author and committer using {@link #getDate()}.
+	 * Set the author and committer using {@link #getInstant()}.
 	 *
 	 * @param c
 	 *            the commit builder to store.
 	 */
 	public void setAuthorAndCommitter(org.eclipse.jgit.lib.CommitBuilder c) {
-		c.setAuthor(new PersonIdent(defaultAuthor, getDate()));
-		c.setCommitter(new PersonIdent(defaultCommitter, getDate()));
+		c.setAuthor(new PersonIdent(defaultAuthor, getInstant()));
+		c.setCommitter(new PersonIdent(defaultCommitter, getInstant()));
 	}
 
 	/**
@@ -488,8 +504,8 @@ public ObjectId unparsedCommit(final int secDelta, final RevTree tree,
 		c = new org.eclipse.jgit.lib.CommitBuilder();
 		c.setTreeId(tree);
 		c.setParentIds(parents);
-		c.setAuthor(new PersonIdent(defaultAuthor, getDate()));
-		c.setCommitter(new PersonIdent(defaultCommitter, getDate()));
+		c.setAuthor(new PersonIdent(defaultAuthor, getInstant()));
+		c.setCommitter(new PersonIdent(defaultCommitter, getInstant()));
 		c.setMessage("");
 		ObjectId id;
 		try (ObjectInserter ins = inserter) {
@@ -529,7 +545,7 @@ public RevTag tag(String name, RevObject dst) throws Exception {
 		final TagBuilder t = new TagBuilder();
 		t.setObjectId(dst);
 		t.setTag(name);
-		t.setTagger(new PersonIdent(defaultCommitter, getDate()));
+		t.setTagger(new PersonIdent(defaultCommitter, getInstant()));
 		t.setMessage("");
 		ObjectId id;
 		try (ObjectInserter ins = inserter) {
@@ -798,7 +814,7 @@ public RevCommit cherryPick(AnyObjectId id) throws Exception {
 			b.setParentId(head);
 			b.setTreeId(merger.getResultTreeId());
 			b.setAuthor(commit.getAuthorIdent());
-			b.setCommitter(new PersonIdent(defaultCommitter, getDate()));
+			b.setCommitter(new PersonIdent(defaultCommitter, getInstant()));
 			b.setMessage(commit.getFullMessage());
 			ObjectId result;
 			try (ObjectInserter ins = inserter) {
@@ -1408,7 +1424,7 @@ public RevCommit create() throws Exception {
 					c.setAuthor(author);
 				if (committer != null) {
 					if (updateCommitterTime)
-						committer = new PersonIdent(committer, getDate());
+						committer = new PersonIdent(committer, getInstant());
 					c.setCommitter(committer);
 				}
 
diff --git a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
index af2ad19..77749c8 100644
--- a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.server.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -26,24 +26,24 @@
  org.eclipse.jetty.util.component;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.security;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.thread;version="[12.0.0,13.0.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.server;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.server.fs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.test;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.server;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.test;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.lfs.server.test/pom.xml b/org.eclipse.jgit.lfs.server.test/pom.xml
index 3f0a708..98e63b0 100644
--- a/org.eclipse.jgit.lfs.server.test/pom.xml
+++ b/org.eclipse.jgit.lfs.server.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
diff --git a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
index 1cdf62b..1973b26 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
@@ -3,19 +3,19 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.server
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.lfs.server;version="7.1.1";
+Export-Package: org.eclipse.jgit.lfs.server;version="7.2.0";
   uses:="jakarta.servlet.http,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.fs;version="7.1.1";
+ org.eclipse.jgit.lfs.server.fs;version="7.2.0";
   uses:="jakarta.servlet,
    jakarta.servlet.http,
    org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.internal;version="7.1.1";x-internal:=true,
- org.eclipse.jgit.lfs.server.s3;version="7.1.1";
+ org.eclipse.jgit.lfs.server.internal;version="7.2.0";x-internal:=true,
+ org.eclipse.jgit.lfs.server.s3;version="7.2.0";
   uses:="org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib"
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -24,15 +24,15 @@
  jakarta.servlet.annotation;version="[6.0.0,7.0.0)",
  jakarta.servlet.http;version="[6.0.0,7.0.0)",
  org.apache.http;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http.apache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http.apache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
diff --git a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
index 6d10d29..73f5cab 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.lfs.server - Sources
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.lfs.server/pom.xml b/org.eclipse.jgit.lfs.server/pom.xml
index 839cd67..0dd0786 100644
--- a/org.eclipse.jgit.lfs.server/pom.xml
+++ b/org.eclipse.jgit.lfs.server/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.server</artifactId>
diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
index d2e3b73..f273774 100644
--- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
@@ -3,28 +3,28 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Import-Package: org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.attributes;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+Import-Package: org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.attributes;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
  org.junit.runners;version="[4.13,5.0.0)"
-Export-Package: org.eclipse.jgit.lfs.test;version="7.1.1";x-friends:="org.eclipse.jgit.lfs.server.test"
+Export-Package: org.eclipse.jgit.lfs.test;version="7.2.0";x-friends:="org.eclipse.jgit.lfs.server.test"
diff --git a/org.eclipse.jgit.lfs.test/pom.xml b/org.eclipse.jgit.lfs.test/pom.xml
index 96bb01c..eff7e0b 100644
--- a/org.eclipse.jgit.lfs.test/pom.xml
+++ b/org.eclipse.jgit.lfs.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.test</artifactId>
diff --git a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
index 7a172cd..fb211cc 100644
--- a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
@@ -3,32 +3,32 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs
 Bundle-SymbolicName: org.eclipse.jgit.lfs
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.lfs;version="7.1.1",
- org.eclipse.jgit.lfs.errors;version="7.1.1",
- org.eclipse.jgit.lfs.internal;version="7.1.1";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server",
- org.eclipse.jgit.lfs.lib;version="7.1.1"
+Export-Package: org.eclipse.jgit.lfs;version="7.2.0",
+ org.eclipse.jgit.lfs.errors;version="7.2.0",
+ org.eclipse.jgit.lfs.internal;version="7.2.0";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server",
+ org.eclipse.jgit.lfs.lib;version="7.2.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Import-Package: com.google.gson;version="[2.8.2,3.0.0)",
  com.google.gson.stream;version="[2.8.2,3.0.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)";resolution:=optional,
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.attributes;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.diff;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.dircache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.hooks;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.pack;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.io;version="[7.1.1,7.2.0)"
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)";resolution:=optional,
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.attributes;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.diff;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.dircache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.hooks;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.pack;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.io;version="[7.2.0,7.3.0)"
diff --git a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
index 5fb872d..4ca03a3 100644
--- a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.lfs - Sources
 Bundle-SymbolicName: org.eclipse.jgit.lfs.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.lfs/pom.xml b/org.eclipse.jgit.lfs/pom.xml
index 438ad28..3297400 100644
--- a/org.eclipse.jgit.lfs/pom.xml
+++ b/org.eclipse.jgit.lfs/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs</artifactId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml
index 815c189..43980f0 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
index e89ddb8..59345e7 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml
index da380e3..ae91bd5 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.gpg.bc"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import plugin="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml
index 127bcd1..aa88700 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
index 73a9a4b..57d7d8d 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.http.apache"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import plugin="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml
index e2eabfb..2038cfd 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml
index 5ff30c4..d9a9db3 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.junit"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -24,7 +24,7 @@
 
    <requires>
       <import plugin="com.jcraft.jsch"/>
-      <import plugin="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml
index cd302ac..d98990c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
index 860c0e4..8f0c532 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.lfs"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
index 793dce0..7e1b0c8 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml
index 2e5c279..78867c9 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.pgm"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -35,9 +35,9 @@
          version="0.0.0"/>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
-      <import feature="org.eclipse.jgit.lfs" version="7.1.1" match="equivalent"/>
-      <import feature="org.eclipse.jgit.ssh.apache" version="7.1.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit.lfs" version="7.2.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit.ssh.apache" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml
index 663e62b..02435b6 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
index 97f0600..d3773f5 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.repository</artifactId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml
index 5243b18..b8f402e 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.source"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml
index 0140b48..4eee825 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
@@ -30,7 +30,7 @@
     <dependency>
       <groupId>org.eclipse.jgit.feature</groupId>
       <artifactId>org.eclipse.jgit</artifactId>
-      <version>7.1.1-SNAPSHOT</version>
+      <version>7.2.0-SNAPSHOT</version>
     </dependency>
   </dependencies>
 
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml
index 8cc19ae..811beaf 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.ssh.apache"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml
index 8abc563..025844c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml
index 573c191..a0cd57b 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.ssh.jsch"
       label="%featureName"
-      version="7.1.1.qualifier"
+      version="7.2.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import plugin="org.eclipse.jgit" version="7.1.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.2.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml
index b21e424..81c9651 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.32.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.32.target
index efae5a1..acb7b77 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.32.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.32.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.32" sequenceNumber="1731963692">
+<target name="jgit-4.32" sequenceNumber="1737936936">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -79,7 +79,7 @@
         <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
-          <version>5.14.2</version>
+          <version>5.15.2</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -89,13 +89,13 @@
         <dependency>
           <groupId>net.java.dev.jna</groupId>
           <artifactId>jna</artifactId>
-          <version>5.15.0</version>
+          <version>5.16.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.java.dev.jna</groupId>
           <artifactId>jna-platform</artifactId>
-          <version>5.15.0</version>
+          <version>5.16.0</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -105,49 +105,49 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee10</groupId>
           <artifactId>jetty-ee10-servlet</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -193,13 +193,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.15.10</version>
+          <version>1.16.1</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.15.10</version>
+          <version>1.16.1</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -209,25 +209,25 @@
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpg-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcprov-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpkix-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcutil-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -237,7 +237,7 @@
         <dependency>
           <groupId>org.assertj</groupId>
           <artifactId>assertj-core</artifactId>
-          <version>3.26.3</version>
+          <version>3.27.3</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -257,7 +257,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.17.1</version>
+          <version>1.17.2</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -275,7 +275,7 @@
         <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
-          <version>2.17.0</version>
+          <version>2.18.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.33.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.33.target
index 1578e4c..fcca388 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.33.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.33.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.33" sequenceNumber="1731963694">
+<target name="jgit-4.33" sequenceNumber="1737936938">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -79,7 +79,7 @@
         <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
-          <version>5.14.2</version>
+          <version>5.15.2</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -89,13 +89,13 @@
         <dependency>
           <groupId>net.java.dev.jna</groupId>
           <artifactId>jna</artifactId>
-          <version>5.15.0</version>
+          <version>5.16.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.java.dev.jna</groupId>
           <artifactId>jna-platform</artifactId>
-          <version>5.15.0</version>
+          <version>5.16.0</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -105,49 +105,49 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee10</groupId>
           <artifactId>jetty-ee10-servlet</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -193,13 +193,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.15.10</version>
+          <version>1.16.1</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.15.10</version>
+          <version>1.16.1</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -209,25 +209,25 @@
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpg-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcprov-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpkix-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcutil-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -237,7 +237,7 @@
         <dependency>
           <groupId>org.assertj</groupId>
           <artifactId>assertj-core</artifactId>
-          <version>3.26.3</version>
+          <version>3.27.3</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -257,7 +257,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.17.1</version>
+          <version>1.17.2</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -275,7 +275,7 @@
         <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
-          <version>2.17.0</version>
+          <version>2.18.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.34.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.34.target
index 43678e7..e5c9369 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.34.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.34.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.34" sequenceNumber="1731963696">
+<target name="jgit-4.34" sequenceNumber="1737936936">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -79,7 +79,7 @@
         <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
-          <version>5.14.2</version>
+          <version>5.15.2</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -89,13 +89,13 @@
         <dependency>
           <groupId>net.java.dev.jna</groupId>
           <artifactId>jna</artifactId>
-          <version>5.15.0</version>
+          <version>5.16.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.java.dev.jna</groupId>
           <artifactId>jna-platform</artifactId>
-          <version>5.15.0</version>
+          <version>5.16.0</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -105,49 +105,49 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee10</groupId>
           <artifactId>jetty-ee10-servlet</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.0.15</version>
+          <version>12.0.16</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -193,13 +193,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.15.10</version>
+          <version>1.16.1</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.15.10</version>
+          <version>1.16.1</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -209,25 +209,25 @@
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpg-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcprov-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpkix-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcutil-jdk18on</artifactId>
-          <version>1.79</version>
+          <version>1.80</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -237,7 +237,7 @@
         <dependency>
           <groupId>org.assertj</groupId>
           <artifactId>assertj-core</artifactId>
-          <version>3.26.3</version>
+          <version>3.27.3</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -257,7 +257,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.17.1</version>
+          <version>1.17.2</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -275,7 +275,7 @@
         <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
-          <version>2.17.0</version>
+          <version>2.18.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.35.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.35.target
new file mode 100644
index 0000000..f9551d5
--- /dev/null
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.35.target
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde?>
+<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
+<target name="jgit-4.35" sequenceNumber="1737936936">
+  <locations>
+    <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+      <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
+      <unit id="com.jcraft.jsch.source" version="0.1.55.v20230916-1400"/>
+      <unit id="com.jcraft.jzlib" version="1.1.3.v20230916-1400"/>
+      <unit id="com.jcraft.jzlib.source" version="1.1.3.v20230916-1400"/>
+      <unit id="net.i2p.crypto.eddsa" version="0.3.0"/>
+      <unit id="net.i2p.crypto.eddsa.source" version="0.3.0"/>
+      <unit id="org.apache.ant" version="1.10.15.v20240901-1000"/>
+      <unit id="org.apache.ant.source" version="1.10.15.v20240901-1000"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.14"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.14"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.16"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.16"/>
+      <unit id="org.hamcrest.core" version="1.3.0.v20230809-1000"/>
+      <unit id="org.hamcrest.core.source" version="1.3.0.v20230809-1000"/>
+      <unit id="org.hamcrest.library" version="1.3.0.v20230809-1000"/>
+      <unit id="org.hamcrest.library.source" version="1.3.0.v20230809-1000"/>
+      <unit id="org.junit" version="4.13.2.v20240929-1000"/>
+      <unit id="org.junit.source" version="4.13.2.v20240929-1000"/>
+      <unit id="org.objenesis" version="3.4.0"/>
+      <unit id="org.objenesis.source" version="3.4.0"/>
+      <unit id="org.osgi.service.cm" version="1.6.1.202109301733"/>
+      <unit id="org.osgi.service.cm.source" version="1.6.1.202109301733"/>
+      <repository location="https://download.eclipse.org/tools/orbit/simrel/orbit-aggregation/2025-03"/>
+    </location>
+    <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+      <unit id="org.eclipse.osgi" version="0.0.0"/>
+      <repository location="https://download.eclipse.org/staging/2025-03/"/>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="xz">
+      <dependencies>
+        <dependency>
+          <groupId>org.tukaani</groupId>
+          <artifactId>xz</artifactId>
+          <version>1.10</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="slf4j">
+      <dependencies>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+          <version>1.7.36</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-simple</artifactId>
+          <version>1.7.36</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
+      <dependencies>
+        <dependency>
+          <groupId>org.apache.sshd</groupId>
+          <artifactId>sshd-osgi</artifactId>
+          <version>2.14.0</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.sshd</groupId>
+          <artifactId>sshd-sftp</artifactId>
+          <version>2.14.0</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+      <dependencies>
+        <dependency>
+          <groupId>org.mockito</groupId>
+          <artifactId>mockito-core</artifactId>
+          <version>5.15.2</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
+      <dependencies>
+        <dependency>
+          <groupId>net.java.dev.jna</groupId>
+          <artifactId>jna</artifactId>
+          <version>5.16.0</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>net.java.dev.jna</groupId>
+          <artifactId>jna-platform</artifactId>
+          <version>5.16.0</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jetty">
+      <dependencies>
+        <dependency>
+          <groupId>org.eclipse.jetty.ee10</groupId>
+          <artifactId>jetty-ee10-servlet</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-http</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-io</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-security</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-server</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-session</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-util</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-util-ajax</artifactId>
+          <version>12.0.16</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>jakarta.servlet</groupId>
+          <artifactId>jakarta.servlet-api</artifactId>
+          <version>6.1.0</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="javaewah">
+      <dependencies>
+        <dependency>
+          <groupId>com.googlecode.javaewah</groupId>
+          <artifactId>JavaEWAH</artifactId>
+          <version>1.2.3</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="hamcrest">
+      <dependencies>
+        <dependency>
+          <groupId>org.hamcrest</groupId>
+          <artifactId>hamcrest</artifactId>
+          <version>2.2</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="gson">
+      <dependencies>
+        <dependency>
+          <groupId>com.google.code.gson</groupId>
+          <artifactId>gson</artifactId>
+          <version>2.11.0</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="bytebuddy">
+      <dependencies>
+        <dependency>
+          <groupId>net.bytebuddy</groupId>
+          <artifactId>byte-buddy</artifactId>
+          <version>1.16.1</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>net.bytebuddy</groupId>
+          <artifactId>byte-buddy-agent</artifactId>
+          <version>1.16.1</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="bouncycastle">
+      <dependencies>
+        <dependency>
+          <groupId>org.bouncycastle</groupId>
+          <artifactId>bcpg-jdk18on</artifactId>
+          <version>1.80</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.bouncycastle</groupId>
+          <artifactId>bcprov-jdk18on</artifactId>
+          <version>1.80</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.bouncycastle</groupId>
+          <artifactId>bcpkix-jdk18on</artifactId>
+          <version>1.80</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.bouncycastle</groupId>
+          <artifactId>bcutil-jdk18on</artifactId>
+          <version>1.80</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="assertj">
+      <dependencies>
+        <dependency>
+          <groupId>org.assertj</groupId>
+          <artifactId>assertj-core</artifactId>
+          <version>3.27.3</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="args4j">
+      <dependencies>
+        <dependency>
+          <groupId>args4j</groupId>
+          <artifactId>args4j</artifactId>
+          <version>2.37</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="apache">
+      <dependencies>
+        <dependency>
+          <groupId>commons-codec</groupId>
+          <artifactId>commons-codec</artifactId>
+          <version>1.17.2</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.commons</groupId>
+          <artifactId>commons-compress</artifactId>
+          <version>1.27.1</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.commons</groupId>
+          <artifactId>commons-lang3</artifactId>
+          <version>3.17.0</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>commons-io</groupId>
+          <artifactId>commons-io</artifactId>
+          <version>2.18.0</version>
+          <type>jar</type>
+        </dependency>
+        <dependency>
+          <groupId>commons-logging</groupId>
+          <artifactId>commons-logging</artifactId>
+          <version>1.3.4</version>
+          <type>jar</type>
+        </dependency>
+      </dependencies>
+    </location>
+  </locations>
+</target>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.35.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.35.tpd
new file mode 100644
index 0000000..3c0646e
--- /dev/null
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.35.tpd
@@ -0,0 +1,8 @@
+target "jgit-4.35" with source configurePhase
+
+include "orbit/orbit-4.35.tpd"
+include "maven/dependencies.tpd"
+
+location "https://download.eclipse.org/staging/2025-03/" {
+	org.eclipse.osgi lazy
+}
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd
index 7b9a397..17d4ad4 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd
@@ -10,7 +10,7 @@
 	dependency {
 		groupId = "commons-codec"
 		artifactId = "commons-codec"
-		version = "1.17.1"
+		version = "1.17.2"
 	}
 	dependency {
 		groupId = "org.apache.commons"
@@ -25,7 +25,7 @@
 	dependency {
 		groupId = "commons-io"
 		artifactId = "commons-io"
-		version = "2.17.0"
+		version = "2.18.0"
 	}
 	dependency {
 		groupId = "commons-logging"
@@ -56,7 +56,7 @@
 	dependency {
 		groupId = "org.assertj"
 		artifactId = "assertj-core"
-		version = "3.26.3"
+		version = "3.27.3"
 	}
 }
 
@@ -69,22 +69,22 @@
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcpg-jdk18on"
-		version = "1.79"
+		version = "1.80"
 	}
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcprov-jdk18on"
-		version = "1.79"
+		version = "1.80"
 	}
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcpkix-jdk18on"
-		version = "1.79"
+		version = "1.80"
 	}
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcutil-jdk18on"
-		version = "1.79"
+		version = "1.80"
 	}
 }
 
@@ -97,12 +97,12 @@
 	dependency {
 		groupId = "net.bytebuddy"
 		artifactId = "byte-buddy"
-		version = "1.15.10"
+		version = "1.16.1"
 	}
 	dependency {
 		groupId = "net.bytebuddy"
 		artifactId = "byte-buddy-agent"
-		version = "1.15.10"
+		version = "1.16.1"
 	}
 }
 
@@ -154,42 +154,42 @@
 	dependency {
 		groupId = "org.eclipse.jetty.ee10"
 		artifactId = "jetty-ee10-servlet"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-http"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-io"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-security"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-server"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-session"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-util"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-util-ajax"
-		version = "12.0.15"
+		version = "12.0.16"
 	}
 	dependency {
 		groupId = "jakarta.servlet"
@@ -207,12 +207,12 @@
 	dependency {
 		groupId = "net.java.dev.jna"
 		artifactId = "jna"
-		version = "5.15.0"
+		version = "5.16.0"
 	}
 	dependency {
 		groupId = "net.java.dev.jna"
 		artifactId = "jna-platform"
-		version = "5.15.0"
+		version = "5.16.0"
 	}
 }
 
@@ -225,7 +225,7 @@
 	dependency {
 		groupId = "org.mockito"
 		artifactId = "mockito-core"
-		version = "5.14.2"
+		version = "5.15.2"
 	}
 }
 
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.35.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.35.tpd
new file mode 100644
index 0000000..9e47c1c
--- /dev/null
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.35.tpd
@@ -0,0 +1,27 @@
+target "orbit-4.35" with source configurePhase
+// see https://download.eclipse.org/tools/orbit/downloads/
+
+location "https://download.eclipse.org/tools/orbit/simrel/orbit-aggregation/2025-03" {
+	com.jcraft.jsch [0.1.55.v20230916-1400,0.1.55.v20230916-1400]
+	com.jcraft.jsch.source [0.1.55.v20230916-1400,0.1.55.v20230916-1400]
+	com.jcraft.jzlib [1.1.3.v20230916-1400,1.1.3.v20230916-1400]
+	com.jcraft.jzlib.source [1.1.3.v20230916-1400,1.1.3.v20230916-1400]
+	net.i2p.crypto.eddsa [0.3.0,0.3.0]
+	net.i2p.crypto.eddsa.source [0.3.0,0.3.0]
+	org.apache.ant [1.10.15.v20240901-1000,1.10.15.v20240901-1000]
+	org.apache.ant.source [1.10.15.v20240901-1000,1.10.15.v20240901-1000]
+	org.apache.httpcomponents.httpclient [4.5.14,4.5.14]
+	org.apache.httpcomponents.httpclient.source [4.5.14,4.5.14]
+	org.apache.httpcomponents.httpcore [4.4.16,4.4.16]
+	org.apache.httpcomponents.httpcore.source [4.4.16,4.4.16]
+	org.hamcrest.core [1.3.0.v20230809-1000,1.3.0.v20230809-1000]
+	org.hamcrest.core.source [1.3.0.v20230809-1000,1.3.0.v20230809-1000]
+	org.hamcrest.library [1.3.0.v20230809-1000,1.3.0.v20230809-1000]
+	org.hamcrest.library.source [1.3.0.v20230809-1000,1.3.0.v20230809-1000]
+	org.junit [4.13.2.v20240929-1000,4.13.2.v20240929-1000]
+	org.junit.source [4.13.2.v20240929-1000,4.13.2.v20240929-1000]
+	org.objenesis [3.4,3.4]
+	org.objenesis.source [3.4,3.4]
+	org.osgi.service.cm [1.6.1.202109301733,1.6.1.202109301733]
+	org.osgi.service.cm.source [1.6.1.202109301733,1.6.1.202109301733]
+}
diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml
index a68be76..5bc67b4 100644
--- a/org.eclipse.jgit.packaging/pom.xml
+++ b/org.eclipse.jgit.packaging/pom.xml
@@ -16,7 +16,7 @@
 
   <groupId>org.eclipse.jgit</groupId>
   <artifactId>jgit.tycho.parent</artifactId>
-  <version>7.1.1-SNAPSHOT</version>
+  <version>7.2.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>JGit Tycho Parent</name>
@@ -30,7 +30,7 @@
 
   <properties>
     <java.version>17</java.version>
-    <tycho-version>4.0.8</tycho-version>
+    <tycho-version>4.0.10</tycho-version>
     <target-platform>jgit-4.32</target-platform>
     <project.build.outputTimestamp>${git.commit.time}</project.build.outputTimestamp>
   </properties>
@@ -174,7 +174,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
-        <version>3.4.1</version>
+        <version>3.5.0</version>
         <executions>
           <execution>
             <id>enforce-maven</id>
@@ -204,7 +204,7 @@
       <plugin>
         <groupId>org.cyclonedx</groupId>
         <artifactId>cyclonedx-maven-plugin</artifactId>
-        <version>2.8.0</version>
+        <version>2.9.1</version>
         <configuration>
           <projectType>library</projectType>
           <schemaVersion>1.4</schemaVersion>
@@ -233,7 +233,7 @@
       <plugin>
         <groupId>io.github.git-commit-id</groupId>
         <artifactId>git-commit-id-maven-plugin</artifactId>
-        <version>8.0.2</version>
+        <version>9.0.1</version>
         <executions>
           <execution>
             <id>get-the-git-infos</id>
@@ -273,7 +273,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-jar-plugin</artifactId>
-          <version>3.4.1</version>
+          <version>3.4.2</version>
           <configuration>
             <archive>
               <manifestEntries>
@@ -381,7 +381,7 @@
         <plugin>
           <groupId>org.eclipse.cbi.maven.plugins</groupId>
           <artifactId>eclipse-jarsigner-plugin</artifactId>
-          <version>1.4.3</version>
+          <version>1.5.2</version>
         </plugin>
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
@@ -390,27 +390,27 @@
         </plugin>
         <plugin>
           <artifactId>maven-clean-plugin</artifactId>
-          <version>3.3.2</version>
+          <version>3.4.0</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-deploy-plugin</artifactId>
-          <version>3.1.2</version>
+          <version>3.1.3</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-install-plugin</artifactId>
-          <version>3.1.2</version>
+          <version>3.1.3</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-site-plugin</artifactId>
-          <version>4.0.0-M14</version>
+          <version>4.0.0-M16</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-artifact-plugin</artifactId>
-          <version>3.5.1</version>
+          <version>3.5.3</version>
           <configuration>
             <ignore>**/*cyclonedx.json</ignore>
             <reproducible>true</reproducible>
diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
index c6addb5..60a60bb 100644
--- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
@@ -3,30 +3,30 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.pgm.test
 Bundle-SymbolicName: org.eclipse.jgit.pgm.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Import-Package: org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.diff;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.dircache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.merge;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.pgm;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.pgm.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.pgm.opt;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.io;version="[7.1.1,7.2.0)",
+Import-Package: org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.diff;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.dircache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.merge;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.pgm;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.pgm.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.pgm.opt;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.io;version="[7.2.0,7.3.0)",
  org.hamcrest.core;bundle-version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml
index e04c42b..9195a36 100644
--- a/org.eclipse.jgit.pgm.test/pom.xml
+++ b/org.eclipse.jgit.pgm.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm.test</artifactId>
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java
index a1fb9fb..c56cc6b 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java
@@ -126,7 +126,7 @@ private RevCommit createSecondCommit() throws Exception {
 		JGitTestUtil.writeTrashFile(db, "Test.txt", "Some change");
 		git.add().addFilepattern("Test.txt").call();
 		return git.commit()
-				.setCommitter(new PersonIdent(this.committer, tr.getDate()))
+				.setCommitter(new PersonIdent(this.committer, tr.getInstant()))
 				.setMessage("Second commit").call();
 	}
 
@@ -134,7 +134,7 @@ private RevCommit createThirdCommit() throws Exception {
 		JGitTestUtil.writeTrashFile(db, "change.txt", "another change");
 		git.add().addFilepattern("change.txt").call();
 		return git.commit()
-				.setCommitter(new PersonIdent(this.committer, tr.getDate()))
+				.setCommitter(new PersonIdent(this.committer, tr.getInstant()))
 				.setMessage("Third commit").call();
 	}
 
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java
index 6a95f9a..6339831 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java
@@ -93,7 +93,7 @@ public void testEmptyToolName() throws Exception {
 
 		createMergeConflict();
 
-		String araxisErrorLine = "compare: unrecognized option `-wait' @ error/compare.c/CompareImageCommand/1123.";
+		String araxisErrorLine = "compare-im6.q16: unrecognized option `-wait' @ error/compare.c/CompareImageCommand/1131.";
 		String[] expectedErrorOutput = { araxisErrorLine, araxisErrorLine, };
 		runAndCaptureUsingInitRaw(Arrays.asList(expectedErrorOutput),
 				MERGE_TOOL, "--no-prompt");
diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
index ac4a20a3..fbcab95 100644
--- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.pgm
 Bundle-SymbolicName: org.eclipse.jgit.pgm
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -14,49 +14,49 @@
  org.eclipse.jetty.server.handler;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util;version="[12.0.0,13.0.0)",
  org.eclipse.jetty.util.component;version="[12.0.0,13.0.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.archive;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.awtui;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.blame;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.diff;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.dircache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.gitrepo;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.io;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.pack;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.server;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.server.fs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs.server.s3;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.merge;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.notes;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revplot;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.pack;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http.apache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.resolver;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.ssh.jsch;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.sshd;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.io;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.archive;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.awtui;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.blame;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.diff;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.dircache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.gitrepo;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.io;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.server;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs.server.s3;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.merge;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.notes;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revplot;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.pack;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http.apache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.ssh.jsch;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.sshd;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.io;version="[7.2.0,7.3.0)",
  org.kohsuke.args4j;version="[2.33.0,3.0.0)",
  org.kohsuke.args4j.spi;version="[2.33.0,3.0.0)"
-Export-Package: org.eclipse.jgit.console;version="7.1.1";
+Export-Package: org.eclipse.jgit.console;version="7.2.0";
  uses:="org.eclipse.jgit.transport,
   org.eclipse.jgit.util",
- org.eclipse.jgit.pgm;version="7.1.1";
+ org.eclipse.jgit.pgm;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util.io,
    org.eclipse.jgit.awtui,
@@ -68,14 +68,14 @@
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.api,
    javax.swing",
- org.eclipse.jgit.pgm.debug;version="7.1.1";
+ org.eclipse.jgit.pgm.debug;version="7.2.0";
   uses:="org.eclipse.jgit.util.io,
    org.eclipse.jgit.pgm,
    org.eclipse.jetty.servlet",
- org.eclipse.jgit.pgm.internal;version="7.1.1";
+ org.eclipse.jgit.pgm.internal;version="7.2.0";
   x-friends:="org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.test",
- org.eclipse.jgit.pgm.opt;version="7.1.1";
+ org.eclipse.jgit.pgm.opt;version="7.2.0";
   uses:="org.kohsuke.args4j,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
diff --git a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
index 38f4bcb..0101464 100644
--- a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.pgm - Sources
 Bundle-SymbolicName: org.eclipse.jgit.pgm.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml
index a9d5712..81efa44 100644
--- a/org.eclipse.jgit.pgm/pom.xml
+++ b/org.eclipse.jgit.pgm/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm</artifactId>
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java
index d2285ae..285fe2a 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java
@@ -18,7 +18,7 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
-import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -91,7 +91,7 @@ void ignoreAllSpace(@SuppressWarnings("unused") boolean on) {
 
 	private final Map<RevCommit, String> abbreviatedCommits = new HashMap<>();
 
-	private SimpleDateFormat dateFmt;
+	private DateTimeFormatter dateFmt;
 
 	private int begin;
 
@@ -125,9 +125,9 @@ protected void run() {
 		}
 
 		if (showRawTimestamp) {
-			dateFmt = new SimpleDateFormat("ZZZZ"); //$NON-NLS-1$
+			dateFmt = DateTimeFormatter.ofPattern("ZZ"); //$NON-NLS-1$
 		} else {
-			dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZZ"); //$NON-NLS-1$
+			dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss ZZ"); //$NON-NLS-1$
 		}
 
 		try (ObjectReader reader = db.newObjectReader();
@@ -335,12 +335,14 @@ private String date(int line) {
 		if (author == null)
 			return ""; //$NON-NLS-1$
 
-		dateFmt.setTimeZone(author.getTimeZone());
-		if (!showRawTimestamp)
-			return dateFmt.format(author.getWhen());
+		if (!showRawTimestamp) {
+			return dateFmt.withZone(author.getZoneId())
+					.format(author.getWhenAsInstant());
+		}
 		return String.format("%d %s", //$NON-NLS-1$
-				Long.valueOf(author.getWhen().getTime() / 1000L),
-				dateFmt.format(author.getWhen()));
+				Long.valueOf(author.getWhenAsInstant().getEpochSecond()),
+				dateFmt.withZone(author.getZoneId())
+						.format(author.getWhenAsInstant()));
 	}
 
 	private String abbreviate(ObjectReader reader, RevCommit commit)
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
index 1576792..a3a6782 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
@@ -14,11 +14,10 @@
 
 import java.io.BufferedOutputStream;
 import java.io.IOException;
-import java.text.DateFormat;
 import java.text.MessageFormat;
-import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.Locale;
-import java.util.TimeZone;
 
 import org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.diff.RawTextComparator;
@@ -51,9 +50,9 @@
 
 @Command(common = true, usage = "usage_show")
 class Show extends TextBuiltin {
-	private final TimeZone myTZ = TimeZone.getDefault();
+	private final ZoneId myTZ = ZoneId.systemDefault();
 
-	private final DateFormat fmt;
+	private final DateTimeFormatter fmt;
 
 	private DiffFormatter diffFmt;
 
@@ -157,7 +156,8 @@ void noPrefix(@SuppressWarnings("unused") boolean on) {
 	// END -- Options shared with Diff
 
 	Show() {
-		fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy ZZZZZ", Locale.US); //$NON-NLS-1$
+		fmt = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss yyyy ZZ", //$NON-NLS-1$
+				Locale.US);
 	}
 
 	@Override
@@ -232,15 +232,17 @@ private void show(RevTag tag) throws IOException {
 		outw.print(tag.getTagName());
 		outw.println();
 
-		final PersonIdent tagger = tag.getTaggerIdent();
+		PersonIdent tagger = tag.getTaggerIdent();
 		if (tagger != null) {
 			outw.println(MessageFormat.format(CLIText.get().taggerInfo,
 					tagger.getName(), tagger.getEmailAddress()));
 
-			final TimeZone taggerTZ = tagger.getTimeZone();
-			fmt.setTimeZone(taggerTZ != null ? taggerTZ : myTZ);
+			ZoneId taggerTZ = tagger.getZoneId();
+			String formattedTaggerTime = fmt
+					.withZone(taggerTZ != null ? taggerTZ : myTZ)
+					.format(tagger.getWhenAsInstant());
 			outw.println(MessageFormat.format(CLIText.get().dateInfo,
-					fmt.format(tagger.getWhen())));
+					formattedTaggerTime));
 		}
 
 		outw.println();
@@ -293,10 +295,12 @@ private void show(RevWalk rw, RevCommit c) throws IOException {
 		outw.println(MessageFormat.format(CLIText.get().authorInfo,
 				author.getName(), author.getEmailAddress()));
 
-		final TimeZone authorTZ = author.getTimeZone();
-		fmt.setTimeZone(authorTZ != null ? authorTZ : myTZ);
+		final ZoneId authorTZ = author.getZoneId();
+		String formattedAuthorTime = fmt
+				.withZone(authorTZ != null ? authorTZ : myTZ)
+				.format(author.getWhenAsInstant());
 		outw.println(MessageFormat.format(CLIText.get().dateInfo,
-				fmt.format(author.getWhen())));
+				formattedAuthorTime));
 
 		outw.println();
 		final String[] lines = c.getFullMessage().split("\n"); //$NON-NLS-1$
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
index 2f96ef7..22d9e34 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
@@ -18,8 +18,8 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.text.MessageFormat;
+import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
@@ -166,7 +166,8 @@ private void recreateCommitGraph() throws IOException {
 
 					final CommitBuilder newc = new CommitBuilder();
 					newc.setTreeId(emptyTree);
-					newc.setAuthor(new PersonIdent(me, new Date(t.commitTime)));
+					newc.setAuthor(new PersonIdent(me,
+							Instant.ofEpochSecond(t.commitTime)));
 					newc.setCommitter(newc.getAuthor());
 					newc.setParentIds(newParents);
 					newc.setMessage("ORIGINAL " + t.oldId.name() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java
index faa2bce..7aff2dd 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java
@@ -24,6 +24,8 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -209,14 +211,15 @@ private static List<LogEntry> readLog(String logPath)
 				}
 				String ref = m.group(1);
 				double t = Double.parseDouble(m.group(2));
-				long time = ((long) t) * 1000L;
+				Instant time = Instant.ofEpochSecond((long) t);
 				long index = (long) (t * 1e6);
 				String user = m.group(3);
 				ObjectId oldId = parseId(m.group(4));
 				ObjectId newId = parseId(m.group(5));
 				String msg = m.group(6);
 				String email = user + "@gerrit"; //$NON-NLS-1$
-				PersonIdent who = new PersonIdent(user, email, time, -480);
+				PersonIdent who = new PersonIdent(user, email, time,
+						ZoneOffset.ofHours(-8));
 				log.add(new LogEntry(ref, index, who, oldId, newId, msg));
 			}
 		}
diff --git a/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
index ac73327..6eeb24d 100644
--- a/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
@@ -2,16 +2,16 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.agent;singleton:=true
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/agent
 Bundle-Vendor: %Bundle-Vendor
-Fragment-Host: org.eclipse.jgit.ssh.apache;bundle-version="[7.1.1,7.2.0)"
+Fragment-Host: org.eclipse.jgit.ssh.apache;bundle-version="[7.2.0,7.3.0)"
 Bundle-ActivationPolicy: lazy
 Automatic-Module-Name: org.eclipse.jgit.ssh.apache.agent
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Import-Package: org.eclipse.jgit.transport.sshd;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)"
+Import-Package: org.eclipse.jgit.transport.sshd;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)"
 Require-Bundle: com.sun.jna;bundle-version="[5.8.0,6.0.0)",
  com.sun.jna.platform;bundle-version="[5.8.0,6.0.0)"
-Export-Package: org.eclipse.jgit.internal.transport.sshd.agent.connector;version="7.1.1";x-internal:=true
+Export-Package: org.eclipse.jgit.internal.transport.sshd.agent.connector;version="7.2.0";x-internal:=true
diff --git a/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF
index 67c7459..30437f2 100644
--- a/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ssh.apache.agent - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.agent.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache.agent;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache.agent;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.apache.agent/pom.xml b/org.eclipse.jgit.ssh.apache.agent/pom.xml
index b2972b2..feec706 100644
--- a/org.eclipse.jgit.ssh.apache.agent/pom.xml
+++ b/org.eclipse.jgit.ssh.apache.agent/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache.agent</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
index 3699248..f266ce1 100644
--- a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ssh.apache.test
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -23,19 +23,19 @@
  org.apache.sshd.core;version="[2.14.0,2.15.0)",
  org.apache.sshd.server;version="[2.14.0,2.15.0)",
  org.apache.sshd.server.forward;version="[2.14.0,2.15.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.signing.ssh;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.sshd.proxy;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit.ssh;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.sshd;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.sshd.agent;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.signing.ssh;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.sshd.proxy;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit.ssh;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.sshd;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.sshd.agent;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13.0,5.0.0)",
diff --git a/org.eclipse.jgit.ssh.apache.test/pom.xml b/org.eclipse.jgit.ssh.apache.test/pom.xml
index 9a50c8b..2df07f7 100644
--- a/org.eclipse.jgit.ssh.apache.test/pom.xml
+++ b/org.eclipse.jgit.ssh.apache.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache.test</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/internal/signing/ssh/AllowedSignersParseTest.java b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/internal/signing/ssh/AllowedSignersParseTest.java
index 90fde3f..84d8179 100644
--- a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/internal/signing/ssh/AllowedSignersParseTest.java
+++ b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/internal/signing/ssh/AllowedSignersParseTest.java
@@ -168,6 +168,14 @@ public void testValidLine() throws Exception {
 				"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGATOZ8PcOKdY978fzIstnZ0+FuefIWKp7wRZynQLdzO"),
 				AllowedSigners.parseLine(
 						"*@a.com,*@b.a.com cert-authority namespaces=\"git\" valid-after=\"20240901\" valid-before=\"202409011200Z\" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGATOZ8PcOKdY978fzIstnZ0+FuefIWKp7wRZynQLdzO"));
+		assertEquals(new AllowedSigners.AllowedEntry(
+				new String[] { "foo@a.com" },
+				false, new String[] { "git" },
+				Instant.parse("2024-09-01T03:30:00.00Z"),
+				Instant.parse("2024-09-01T12:00:00.00Z"),
+				"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGxkz2AUld8eitmyIYlVV+Sot4jT3CigyBmvFRff0q4cSsKLx4x2TxGQeKKVueJEawtsUC2GNRV9FxXsTCUGcZU="),
+				AllowedSigners.parseLine(
+						"foo@a.com namespaces=\"git\" valid-after=\"20240901\" valid-before=\"202409011200Z\" ecdsa-sha2-nistp256   AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGxkz2AUld8eitmyIYlVV+Sot4jT3CigyBmvFRff0q4cSsKLx4x2TxGQeKKVueJEawtsUC2GNRV9FxXsTCUGcZU="));
 	}
 
 	@Test
@@ -183,6 +191,8 @@ public void testInvalidLine() {
 		assertThrows(Exception.class, () -> AllowedSigners.parseLine(
 				"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGATOZ8PcOKdY978fzIstnZ0+FuefIWKp7wRZynQLdzO"));
 		assertThrows(Exception.class, () -> AllowedSigners.parseLine(
+				"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGATOZ8PcOKdY978fzIstnZ0+FuefIWKp7wRZynQLdzO foo@bar.com"));
+		assertThrows(Exception.class, () -> AllowedSigners.parseLine(
 				"AAAAC3NzaC1lZDI1NTE5AAAAIGATOZ8PcOKdY978fzIstnZ0+FuefIWKp7wRZynQLdzO"));
 		assertThrows(Exception.class, () -> AllowedSigners.parseLine(
 				"a@a.com namespaces=\"\" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGATOZ8PcOKdY978fzIstnZ0+FuefIWKp7wRZynQLdzO"));
diff --git a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
index 1fb5492..b6b528c 100644
--- a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
@@ -6,10 +6,10 @@
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-ActivationPolicy: lazy
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Export-Package: org.eclipse.jgit.internal.signing.ssh;version="7.1.1";x-friends:="org.eclipse.jgit.ssh.apache.test",
- org.eclipse.jgit.internal.transport.sshd;version="7.1.1";x-internal:=true;
+Export-Package: org.eclipse.jgit.internal.signing.ssh;version="7.2.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
+ org.eclipse.jgit.internal.transport.sshd;version="7.2.0";x-internal:=true;
   uses:="org.apache.sshd.client,
    org.apache.sshd.client.auth,
    org.apache.sshd.client.auth.keyboard,
@@ -24,19 +24,19 @@
    org.apache.sshd.common.signature,
    org.apache.sshd.common.util.buffer,
    org.eclipse.jgit.transport",
- org.eclipse.jgit.internal.transport.sshd.agent;version="7.1.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.auth;version="7.1.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.pkcs11;version="7.1.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.proxy;version="7.1.1";x-friends:="org.eclipse.jgit.ssh.apache.test",
- org.eclipse.jgit.signing.ssh;version="7.1.1";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.transport.sshd;version="7.1.1";
+ org.eclipse.jgit.internal.transport.sshd.agent;version="7.2.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.auth;version="7.2.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.pkcs11;version="7.2.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.proxy;version="7.2.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
+ org.eclipse.jgit.signing.ssh;version="7.2.0";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.transport.sshd;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.apache.sshd.client.config.hosts,
    org.apache.sshd.common.keyprovider,
    org.eclipse.jgit.util,
    org.apache.sshd.client.session,
    org.apache.sshd.client.keyverifier",
- org.eclipse.jgit.transport.sshd.agent;version="7.1.1",
+ org.eclipse.jgit.transport.sshd.agent;version="7.2.0",
  sun.security.x509
 Import-Package: net.i2p.crypto.eddsa;version="[0.3.0,0.4.0)",
  org.apache.sshd.agent;version="[2.14.0,2.15.0)",
@@ -91,14 +91,14 @@
  org.apache.sshd.sftp;version="[2.14.0,2.15.0)",
  org.apache.sshd.sftp.client;version="[2.14.0,2.15.0)",
  org.apache.sshd.sftp.common;version="[2.14.0,2.15.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.fnmatch;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.fnmatch;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
diff --git a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
index 8061820..c19e0aa 100644
--- a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ssh.apache - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.apache/pom.xml b/org.eclipse.jgit.ssh.apache/pom.xml
index e1224df..a002290 100644
--- a/org.eclipse.jgit.ssh.apache/pom.xml
+++ b/org.eclipse.jgit.ssh.apache/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/signing/ssh/AllowedSigners.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/signing/ssh/AllowedSigners.java
index cfbe7a7..80b171f 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/signing/ssh/AllowedSigners.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/signing/ssh/AllowedSigners.java
@@ -21,6 +21,7 @@
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
@@ -36,8 +37,6 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.TimeZone;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -64,8 +63,6 @@ final class AllowedSigners extends ModifiableFileWatcher {
 
 	private static final String VALID_BEFORE = "valid-before="; //$NON-NLS-1$
 
-	private static final String SSH_KEY_PREFIX = "ssh-"; //$NON-NLS-1$
-
 	private static final DateTimeFormatter SSH_DATE_FORMAT = new DateTimeFormatterBuilder()
 			.appendValue(ChronoField.YEAR, 4)
 			.appendValue(ChronoField.MONTH_OF_YEAR, 2)
@@ -323,8 +320,7 @@ static AllowedEntry parseLine(String line)
 				&& Character.isWhitespace(line.charAt(CERT_AUTHORITY.length())))
 				|| matches(line, NAMESPACES, 0)
 				|| matches(line, VALID_AFTER, 0)
-				|| matches(line, VALID_BEFORE, 0)
-				|| matches(line, SSH_KEY_PREFIX, 0)) {
+				|| matches(line, VALID_BEFORE, 0)) {
 			throw new StreamCorruptedException(
 					SshdText.get().signAllowedSignersNoIdentities);
 		}
@@ -449,7 +445,9 @@ static String parsePublicKey(String s, int from)
 					s.substring(start)));
 		}
 		String keyType = s.substring(start, endOfKeyType);
-		if (!keyType.startsWith(SSH_KEY_PREFIX)) {
+		String key = s.substring(startOfKey, i);
+		if (!key.startsWith("AAAA")) { //$NON-NLS-1$
+			// base64 encoded SSH keys always start with four 'A's.
 			throw new StreamCorruptedException(MessageFormat.format(
 					SshdText.get().signAllowedSignersPublicKeyParsing,
 					s.substring(start)));
@@ -482,12 +480,8 @@ static Instant parseDate(String input) {
 		if (isUTC) {
 			return time.atOffset(ZoneOffset.UTC).toInstant();
 		}
-		TimeZone tz = SystemReader.getInstance().getTimeZone();
-		// Since there are a few TimeZone IDs that are not recognized by ZoneId,
-		// use offsets.
-		return time.atOffset(ZoneOffset.ofTotalSeconds(
-				(int) TimeUnit.MILLISECONDS.toSeconds(tz.getRawOffset())))
-				.toInstant();
+		ZoneId tz = SystemReader.getInstance().getTimeZoneId();
+		return time.atZone(tz).toInstant();
 	}
 
 	// OpenSSH uses the backslash *only* to quote the double-quote.
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/auth/BasicAuthentication.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/auth/BasicAuthentication.java
index 8866976..3e1fab3 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/auth/BasicAuthentication.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/auth/BasicAuthentication.java
@@ -17,8 +17,6 @@
 import java.net.PasswordAuthentication;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.concurrent.CancellationException;
 
@@ -113,13 +111,12 @@ public void process() throws Exception {
 	 */
 	protected void askCredentials() {
 		clearPassword();
-		PasswordAuthentication auth = AccessController.doPrivileged(
-				(PrivilegedAction<PasswordAuthentication>) () -> Authenticator
-						.requestPasswordAuthentication(proxy.getHostString(),
-								proxy.getAddress(), proxy.getPort(),
-								SshConstants.SSH_SCHEME,
-								SshdText.get().proxyPasswordPrompt, "Basic", //$NON-NLS-1$
-								null, RequestorType.PROXY));
+		PasswordAuthentication auth = Authenticator
+				.requestPasswordAuthentication(proxy.getHostString(),
+						proxy.getAddress(), proxy.getPort(),
+						SshConstants.SSH_SCHEME,
+						SshdText.get().proxyPasswordPrompt, "Basic", //$NON-NLS-1$
+						null, RequestorType.PROXY);
 		if (auth == null) {
 			user = ""; //$NON-NLS-1$
 			throw new CancellationException(
diff --git a/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
index feef17a..9cf812c 100644
--- a/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
@@ -3,20 +3,20 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ssh.jsch.test
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Require-Bundle: org.hamcrest.core;bundle-version="[1.3.0,2.0.0)"
 Import-Package: com.jcraft.jsch;version="[0.1.54,0.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit.ssh;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.ssh.jsch;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit.ssh;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.ssh.jsch;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.ssh.jsch.test/pom.xml b/org.eclipse.jgit.ssh.jsch.test/pom.xml
index 0873a31..e84ac4d 100644
--- a/org.eclipse.jgit.ssh.jsch.test/pom.xml
+++ b/org.eclipse.jgit.ssh.jsch.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.jsch.test</artifactId>
diff --git a/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
index 05ad1a4..ed6115b 100644
--- a/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
@@ -3,19 +3,19 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ssh.jsch
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch;singleton:=true
-Fragment-Host: org.eclipse.jgit;bundle-version="[7.1.1,7.2.0)"
+Fragment-Host: org.eclipse.jgit;bundle-version="[7.2.0,7.3.0)"
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/jsch
 Bundle-ActivationPolicy: lazy
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Export-Package: org.eclipse.jgit.transport.ssh.jsch;version="7.1.1"
+Export-Package: org.eclipse.jgit.transport.ssh.jsch;version="7.2.0"
 Import-Package: com.jcraft.jsch;version="[0.1.37,0.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.io;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.io;version="[7.2.0,7.3.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
diff --git a/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
index 883b7e4..4e8da25 100644
--- a/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ssh.jsch - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.jsch;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.jsch;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.jsch/pom.xml b/org.eclipse.jgit.ssh.jsch/pom.xml
index eacd219..fdc5ffb 100644
--- a/org.eclipse.jgit.ssh.jsch/pom.xml
+++ b/org.eclipse.jgit.ssh.jsch/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.jsch</artifactId>
diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
index d33d3e1..5a5dd88 100644
--- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.test
 Bundle-SymbolicName: org.eclipse.jgit.test
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -20,65 +20,66 @@
  org.apache.commons.compress.compressors.xz;version="[1.15.0,2.0)",
  org.apache.commons.io;version="[2.15.0,3.0.0)",
  org.apache.commons.io.output;version="[2.15.0,3.0.0)",
+ org.apache.commons.lang3;version="[3.17.0,4.0.0)",
  org.assertj.core.api;version="[3.14.0,4.0.0)",
- org.eclipse.jgit.annotations;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.api.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.archive;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.attributes;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.awtui;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.blame;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.diff;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.dircache;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.events;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.fnmatch;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.gitrepo;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.hooks;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.ignore;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.ignore.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.diff;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.fsck;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.commitgraph;version="7.1.1",
- org.eclipse.jgit.internal.storage.dfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.io;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.memory;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.pack;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.connectivity;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.parser;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.junit.time;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lfs;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.logging;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.merge;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.notes;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.patch;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.pgm;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.pgm.internal;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revplot;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.file;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.storage.pack;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.submodule;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.http;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport.resolver;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.io;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util.sha1;version="[7.1.1,7.2.0)",
+ org.eclipse.jgit.annotations;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.api.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.archive;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.attributes;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.awtui;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.blame;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.diff;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.dircache;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.events;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.fnmatch;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.gitrepo;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.hooks;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.ignore;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.ignore.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.diff;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.fsck;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.commitgraph;version="7.2.0",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.io;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.memory;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.connectivity;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.parser;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.junit.time;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lfs;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.logging;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.merge;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.notes;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.patch;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.pgm;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.pgm.internal;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revplot;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.file;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.storage.pack;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.submodule;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.http;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.io;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util.sha1;version="[7.2.0,7.3.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
  org.junit.function;version="[4.13.0,5.0.0)",
diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml
index c3b80ef..c936b09 100644
--- a/org.eclipse.jgit.test/pom.xml
+++ b/org.eclipse.jgit.test/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.test</artifactId>
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
index 3a4ea8e..9c2b16a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
@@ -267,7 +267,10 @@ private void archiveHeadAllFilesWithCompression(String fmt) throws Exception {
 			archive(git, archive, fmt, Map.of("compression-level", 9));
 			int sizeCompression9 = getNumBytes(archive);
 
-			assertTrue(sizeCompression1 > sizeCompression9);
+			assertTrue(
+					"Expected sizeCompression1 = " + sizeCompression1
+							+ " > sizeCompression9 = " + sizeCompression9,
+					sizeCompression1 > sizeCompression9);
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
index be3b33a..3f5c5da 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
@@ -34,6 +34,7 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.lib.RepositoryState;
 import org.eclipse.jgit.merge.ContentMergeStrategy;
@@ -529,10 +530,11 @@ private void doCherryPickAndCheckResult(final Git git,
 		assertEquals(RepositoryState.SAFE, db.getRepositoryState());
 
 		if (reason == null) {
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("cherry-pick: "));
-			reader = db.getReflogReader(db.getBranch());
+			reader = refDb.getReflogReader(db.getFullBranch());
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("cherry-pick: "));
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
index 63ab809..f5fd73b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
@@ -182,7 +182,8 @@ private static boolean isLocalHead(Ref ref) {
 
 	private static boolean hasRefLog(Repository repo, Ref ref) {
 		try {
-			return repo.getReflogReader(ref.getName()).getLastEntry() != null;
+			return repo.getRefDatabase().getReflogReader(ref)
+					.getLastEntry() != null;
 		} catch (IOException ioe) {
 			throw new IllegalStateException(ioe);
 		}
@@ -647,7 +648,8 @@ public void testCloneRepositoryWithSubmodules() throws Exception {
 					new File(git.getRepository().getWorkTree(), walk.getPath()),
 					subRepo.getWorkTree());
 			assertEquals(new File(new File(git.getRepository().getDirectory(),
-					"modules"), walk.getPath()), subRepo.getDirectory());
+					"modules"), walk.getPath()).getCanonicalPath(),
+					subRepo.getDirectory().getCanonicalPath());
 		}
 
 		File directory = createTempDirectory("testCloneRepositoryWithSubmodules");
@@ -681,8 +683,8 @@ public void testCloneRepositoryWithSubmodules() throws Exception {
 					walk.getPath()), clonedSub1.getWorkTree());
 			assertEquals(
 					new File(new File(git2.getRepository().getDirectory(),
-							"modules"), walk.getPath()),
-					clonedSub1.getDirectory());
+							"modules"), walk.getPath()).getCanonicalPath(),
+					clonedSub1.getDirectory().getCanonicalPath());
 		}
 	}
 
@@ -770,8 +772,8 @@ public void testCloneRepositoryWithNestedSubmodules() throws Exception {
 						walk.getPath()), clonedSub1.getWorkTree());
 				assertEquals(
 						new File(new File(git2.getRepository().getDirectory(),
-								"modules"), walk.getPath()),
-						clonedSub1.getDirectory());
+								"modules"), walk.getPath()).getCanonicalPath(),
+						clonedSub1.getDirectory().getCanonicalPath());
 				status = new SubmoduleStatusCommand(clonedSub1);
 				statuses = status.call();
 			}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java
index 57e5d49..4e5f44e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java
@@ -26,6 +26,7 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -69,10 +70,11 @@ public void testSomeCommits() throws Exception {
 				l--;
 			}
 			assertEquals(l, -1);
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
 			assertTrue(
 					reader.getLastEntry().getComment().startsWith("commit:"));
-			reader = db.getReflogReader(db.getBranch());
+			reader = refDb.getReflogReader(db.getFullBranch());
 			assertTrue(
 					reader.getLastEntry().getComment().startsWith("commit:"));
 		}
@@ -248,10 +250,11 @@ public void testCommitAmend() throws Exception {
 				c++;
 			}
 			assertEquals(1, c);
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("commit (amend):"));
-			reader = db.getReflogReader(db.getBranch());
+			reader = refDb.getReflogReader(db.getFullBranch());
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("commit (amend):"));
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java
index e74e234..21cfcc4 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java
@@ -19,9 +19,9 @@
 import static org.junit.Assume.assumeTrue;
 
 import java.io.File;
-import java.util.Date;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.List;
-import java.util.TimeZone;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.eclipse.jgit.api.CherryPickResult.CherryPickStatus;
@@ -435,10 +435,12 @@ public void commitAfterSquashMerge() throws Exception {
 
 			assertEquals(1, squashedCommit.getParentCount());
 			assertNull(db.readSquashCommitMsg());
-			assertEquals("commit: Squashed commit of the following:", db
-					.getReflogReader(Constants.HEAD).getLastEntry().getComment());
-			assertEquals("commit: Squashed commit of the following:", db
-					.getReflogReader(db.getBranch()).getLastEntry().getComment());
+			assertEquals("commit: Squashed commit of the following:",
+					db.getRefDatabase().getReflogReader(Constants.HEAD)
+							.getLastEntry().getComment());
+			assertEquals("commit: Squashed commit of the following:",
+					db.getRefDatabase().getReflogReader(db.getFullBranch())
+							.getLastEntry().getComment());
 		}
 	}
 
@@ -455,12 +457,15 @@ public void testReflogs() throws Exception {
 			git.commit().setMessage("c3").setAll(true)
 					.setReflogComment("testRl").call();
 
-			db.getReflogReader(Constants.HEAD).getReverseEntries();
+			db.getRefDatabase().getReflogReader(Constants.HEAD)
+					.getReverseEntries();
 
 			assertEquals("testRl;commit (initial): c1;", reflogComments(
-					db.getReflogReader(Constants.HEAD).getReverseEntries()));
+					db.getRefDatabase().getReflogReader(Constants.HEAD)
+							.getReverseEntries()));
 			assertEquals("testRl;commit (initial): c1;", reflogComments(
-					db.getReflogReader(db.getBranch()).getReverseEntries()));
+					db.getRefDatabase().getReflogReader(db.getFullBranch())
+							.getReverseEntries()));
 		}
 	}
 
@@ -486,11 +491,11 @@ public void commitAmendWithoutAuthorShouldSetOriginalAuthorAndAuthorTime()
 			writeTrashFile("file1", "file1");
 			git.add().addFilepattern("file1").call();
 
-			final String authorName = "First Author";
-			final String authorEmail = "author@example.org";
-			final Date authorDate = new Date(1349621117000L);
+			String authorName = "First Author";
+			String authorEmail = "author@example.org";
+			Instant authorDate = Instant.ofEpochSecond(1349621117L);
 			PersonIdent firstAuthor = new PersonIdent(authorName, authorEmail,
-					authorDate, TimeZone.getTimeZone("UTC"));
+					authorDate, ZoneOffset.UTC);
 			git.commit().setMessage("initial commit").setAuthor(firstAuthor).call();
 
 			RevCommit amended = git.commit().setAmend(true)
@@ -499,7 +504,8 @@ public void commitAmendWithoutAuthorShouldSetOriginalAuthorAndAuthorTime()
 			PersonIdent amendedAuthor = amended.getAuthorIdent();
 			assertEquals(authorName, amendedAuthor.getName());
 			assertEquals(authorEmail, amendedAuthor.getEmailAddress());
-			assertEquals(authorDate.getTime(), amendedAuthor.getWhen().getTime());
+			assertEquals(authorDate.getEpochSecond(),
+					amendedAuthor.getWhenAsInstant().getEpochSecond());
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
index 3ec454c..3731347 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
@@ -92,8 +92,8 @@ public void testFetchHasRefLogForRemoteRef() throws Exception {
 
 		assertTrue(remoteRef.getName().startsWith(Constants.R_REMOTES));
 		assertEquals(defaultBranchSha1, remoteRef.getObjectId());
-		assertNotNull(git.getRepository().getReflogReader(remoteRef.getName())
-				.getLastEntry());
+		assertNotNull(git.getRepository().getRefDatabase()
+				.getReflogReader(remoteRef.getName()).getLastEntry());
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GarbageCollectCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GarbageCollectCommandTest.java
index f98db34..6090d5e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GarbageCollectCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GarbageCollectCommandTest.java
@@ -11,12 +11,11 @@
 
 import static org.junit.Assert.assertTrue;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.Properties;
 
 import org.eclipse.jgit.junit.RepositoryTestCase;
-import org.eclipse.jgit.util.GitDateParser;
-import org.eclipse.jgit.util.SystemReader;
+import org.eclipse.jgit.util.GitTimeParser;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -36,9 +35,8 @@ public void setUp() throws Exception {
 
 	@Test
 	public void testGConeCommit() throws Exception {
-		Date expire = GitDateParser.parse("now", null, SystemReader
-				.getInstance().getLocale());
-		Properties res = git.gc().setExpire(expire).call();
+		Instant expireNow = GitTimeParser.parseInstant("now");
+		Properties res = git.gc().setExpire(expireNow).call();
 		assertTrue(res.size() == 8);
 	}
 
@@ -52,11 +50,8 @@ public void testGCmoreCommits() throws Exception {
 		writeTrashFile("b.txt", "a couple of words for gc to pack more 2");
 		writeTrashFile("c.txt", "a couple of words for gc to pack more 3");
 		git.commit().setAll(true).setMessage("commit3").call();
-		Properties res = git
-				.gc()
-				.setExpire(
-						GitDateParser.parse("now", null, SystemReader
-								.getInstance().getLocale())).call();
+		Instant expireNow = GitTimeParser.parseInstant("now");
+		Properties res = git.gc().setExpire(expireNow).call();
 		assertTrue(res.size() == 8);
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GitConstructionTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GitConstructionTest.java
index 7693434..e847e72 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GitConstructionTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GitConstructionTest.java
@@ -14,6 +14,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.time.Instant;
 
 import org.eclipse.jgit.api.ListBranchCommand.ListMode;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -100,7 +101,7 @@ public void testClose() throws IOException, JGitInternalException,
 			GitAPIException {
 		File workTree = db.getWorkTree();
 		Git git = Git.open(workTree);
-		git.gc().setExpire(null).call();
+		git.gc().setExpire((Instant) null).call();
 		git.checkout().setName(git.getRepository().resolve("HEAD^").getName())
 				.call();
 		try {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java
index 917b6c3..503fef9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java
@@ -33,6 +33,7 @@
 import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.RepositoryState;
 import org.eclipse.jgit.lib.Sets;
@@ -76,12 +77,12 @@ public void testMergeInItself() throws Exception {
 			assertEquals(MergeResult.MergeStatus.ALREADY_UP_TO_DATE, result.getMergeStatus());
 		}
 		// no reflog entry written by merge
-		assertEquals("commit (initial): initial commit",
-				db
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals("commit (initial): initial commit", refDb
 				.getReflogReader(Constants.HEAD).getLastEntry().getComment());
-		assertEquals("commit (initial): initial commit",
-				db
-				.getReflogReader(db.getBranch()).getLastEntry().getComment());
+		assertEquals("commit (initial): initial commit", refDb
+				.getReflogReader(db.getFullBranch()).getLastEntry()
+				.getComment());
 	}
 
 	@Test
@@ -96,10 +97,11 @@ public void testAlreadyUpToDate() throws Exception {
 			assertEquals(second, result.getNewHead());
 		}
 		// no reflog entry written by merge
-		assertEquals("commit: second commit", db
+		assertEquals("commit: second commit", db.getRefDatabase()
 				.getReflogReader(Constants.HEAD).getLastEntry().getComment());
-		assertEquals("commit: second commit", db
-				.getReflogReader(db.getBranch()).getLastEntry().getComment());
+		assertEquals("commit: second commit", db.getRefDatabase()
+				.getReflogReader(db.getFullBranch()).getLastEntry()
+				.getComment());
 	}
 
 	@Test
@@ -117,10 +119,13 @@ public void testFastForward() throws Exception {
 			assertEquals(MergeResult.MergeStatus.FAST_FORWARD, result.getMergeStatus());
 			assertEquals(second, result.getNewHead());
 		}
+		RefDatabase refDb = db.getRefDatabase();
 		assertEquals("merge refs/heads/master: Fast-forward",
-				db.getReflogReader(Constants.HEAD).getLastEntry().getComment());
+				refDb.getReflogReader(Constants.HEAD)
+						.getLastEntry().getComment());
 		assertEquals("merge refs/heads/master: Fast-forward",
-				db.getReflogReader(db.getBranch()).getLastEntry().getComment());
+				refDb.getReflogReader(db.getFullBranch())
+						.getLastEntry().getComment());
 	}
 
 	@Test
@@ -140,10 +145,12 @@ public void testFastForwardNoCommit() throws Exception {
 					result.getMergeStatus());
 			assertEquals(second, result.getNewHead());
 		}
-		assertEquals("merge refs/heads/master: Fast-forward", db
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals("merge refs/heads/master: Fast-forward", refDb
 				.getReflogReader(Constants.HEAD).getLastEntry().getComment());
-		assertEquals("merge refs/heads/master: Fast-forward", db
-				.getReflogReader(db.getBranch()).getLastEntry().getComment());
+		assertEquals("merge refs/heads/master: Fast-forward", refDb
+				.getReflogReader(db.getFullBranch()).getLastEntry()
+				.getComment());
 	}
 
 	@Test
@@ -171,10 +178,12 @@ public void testFastForwardWithFiles() throws Exception {
 			assertEquals(MergeResult.MergeStatus.FAST_FORWARD, result.getMergeStatus());
 			assertEquals(second, result.getNewHead());
 		}
-		assertEquals("merge refs/heads/master: Fast-forward",
-				db.getReflogReader(Constants.HEAD).getLastEntry().getComment());
-		assertEquals("merge refs/heads/master: Fast-forward",
-				db.getReflogReader(db.getBranch()).getLastEntry().getComment());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals("merge refs/heads/master: Fast-forward", refDb
+				.getReflogReader(Constants.HEAD).getLastEntry().getComment());
+		assertEquals("merge refs/heads/master: Fast-forward", refDb
+				.getReflogReader(db.getFullBranch()).getLastEntry()
+				.getComment());
 	}
 
 	@Test
@@ -229,14 +238,17 @@ public void testMergeSuccessAllStrategies(MergeStrategy mergeStrategy)
 					.include(db.exactRef(R_HEADS + MASTER)).call();
 			assertEquals(MergeStatus.MERGED, result.getMergeStatus());
 		}
+		RefDatabase refDb = db.getRefDatabase();
 		assertEquals(
 				"merge refs/heads/master: Merge made by "
 						+ mergeStrategy.getName() + ".",
-				db.getReflogReader(Constants.HEAD).getLastEntry().getComment());
+				refDb.getReflogReader(Constants.HEAD).getLastEntry()
+						.getComment());
 		assertEquals(
 				"merge refs/heads/master: Merge made by "
 						+ mergeStrategy.getName() + ".",
-				db.getReflogReader(db.getBranch()).getLastEntry().getComment());
+				refDb.getReflogReader(db.getFullBranch()).getLastEntry()
+						.getComment());
 	}
 
 	@Theory
@@ -662,14 +674,17 @@ public void testMultipleCreationsSameContent() throws Exception {
 					.setStrategy(MergeStrategy.RESOLVE).call();
 			assertEquals(MergeStatus.MERGED, result.getMergeStatus());
 			assertEquals("1\nb(1)\n3\n", read(new File(db.getWorkTree(), "b")));
-			assertEquals("merge " + secondCommit.getId().getName()
-					+ ": Merge made by resolve.", db
-					.getReflogReader(Constants.HEAD)
-					.getLastEntry().getComment());
-			assertEquals("merge " + secondCommit.getId().getName()
-					+ ": Merge made by resolve.", db
-					.getReflogReader(db.getBranch())
-					.getLastEntry().getComment());
+			RefDatabase refDb = db.getRefDatabase();
+			assertEquals(
+					"merge " + secondCommit.getId().getName()
+							+ ": Merge made by resolve.",
+					refDb.getReflogReader(Constants.HEAD).getLastEntry()
+							.getComment());
+			assertEquals(
+					"merge " + secondCommit.getId().getName()
+							+ ": Merge made by resolve.",
+					refDb.getReflogReader(db.getFullBranch()).getLastEntry()
+							.getComment());
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java
index 70e990d..d1696d6 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java
@@ -22,6 +22,7 @@
 import java.io.PrintStream;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
 import java.util.Properties;
 
 import org.eclipse.jgit.api.errors.DetachedHeadException;
@@ -1146,7 +1147,7 @@ public void testPushAfterGC() throws Exception {
 			RevCommit commit2 = git2.commit().setMessage("adding a").call();
 
 			// run a gc to ensure we have a bitmap index
-			Properties res = git1.gc().setExpire(null).call();
+			Properties res = git1.gc().setExpire((Instant) null).call();
 			assertEquals(8, res.size());
 
 			// create another commit so we have something else to push
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
index 02e3a2e..4c8cf06 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
@@ -24,6 +24,8 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -55,6 +57,7 @@
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.RebaseTodoLine;
 import org.eclipse.jgit.lib.RebaseTodoLine.Action;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.ReflogEntry;
 import org.eclipse.jgit.lib.RepositoryState;
@@ -131,11 +134,12 @@ public void testFastForwardWithNewFile() throws Exception {
 		checkFile(file2, "file2");
 		assertEquals(Status.FAST_FORWARD, res.getStatus());
 
-		List<ReflogEntry> headLog = db.getReflogReader(Constants.HEAD)
+		RefDatabase refDb = db.getRefDatabase();
+		List<ReflogEntry> headLog = refDb.getReflogReader(Constants.HEAD)
 				.getReverseEntries();
-		List<ReflogEntry> topicLog = db.getReflogReader("refs/heads/topic")
+		List<ReflogEntry> topicLog = refDb.getReflogReader("refs/heads/topic")
 				.getReverseEntries();
-		List<ReflogEntry> masterLog = db.getReflogReader("refs/heads/master")
+		List<ReflogEntry> masterLog = refDb.getReflogReader("refs/heads/master")
 				.getReverseEntries();
 		assertEquals("rebase finished: returning to refs/heads/topic", headLog
 				.get(0).getComment());
@@ -177,11 +181,12 @@ public void testFastForwardWithMultipleCommits() throws Exception {
 		checkFile(file2, "file2 new content");
 		assertEquals(Status.FAST_FORWARD, res.getStatus());
 
-		List<ReflogEntry> headLog = db.getReflogReader(Constants.HEAD)
+		RefDatabase refDb = db.getRefDatabase();
+		List<ReflogEntry> headLog = refDb.getReflogReader(Constants.HEAD)
 				.getReverseEntries();
-		List<ReflogEntry> topicLog = db.getReflogReader("refs/heads/topic")
+		List<ReflogEntry> topicLog = refDb.getReflogReader("refs/heads/topic")
 				.getReverseEntries();
-		List<ReflogEntry> masterLog = db.getReflogReader("refs/heads/master")
+		List<ReflogEntry> masterLog = refDb.getReflogReader("refs/heads/master")
 				.getReverseEntries();
 		assertEquals("rebase finished: returning to refs/heads/topic", headLog
 				.get(0).getComment());
@@ -445,13 +450,14 @@ public void testRebaseShouldIgnoreMergeCommits()
 			assertEquals(a, rw.next());
 		}
 
-		List<ReflogEntry> headLog = db.getReflogReader(Constants.HEAD)
+		RefDatabase refDb = db.getRefDatabase();
+		List<ReflogEntry> headLog = refDb.getReflogReader(Constants.HEAD)
 				.getReverseEntries();
-		List<ReflogEntry> sideLog = db.getReflogReader("refs/heads/side")
+		List<ReflogEntry> sideLog = refDb.getReflogReader("refs/heads/side")
 				.getReverseEntries();
-		List<ReflogEntry> topicLog = db.getReflogReader("refs/heads/topic")
+		List<ReflogEntry> topicLog = refDb.getReflogReader("refs/heads/topic")
 				.getReverseEntries();
-		List<ReflogEntry> masterLog = db.getReflogReader("refs/heads/master")
+		List<ReflogEntry> masterLog = refDb.getReflogReader("refs/heads/master")
 				.getReverseEntries();
 		assertEquals("rebase finished: returning to refs/heads/topic", headLog
 				.get(0).getComment());
@@ -766,9 +772,10 @@ public void testRebaseParentOntoHeadShouldBeUptoDate() throws Exception {
 		RebaseResult result = git.rebase().setUpstream(parent).call();
 		assertEquals(Status.UP_TO_DATE, result.getStatus());
 
-		assertEquals(2, db.getReflogReader(Constants.HEAD).getReverseEntries()
-				.size());
-		assertEquals(2, db.getReflogReader("refs/heads/master")
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(2, refDb.getReflogReader(Constants.HEAD)
+				.getReverseEntries().size());
+		assertEquals(2, refDb.getReflogReader("refs/heads/master")
 				.getReverseEntries().size());
 	}
 
@@ -784,9 +791,10 @@ public void testUpToDate() throws Exception {
 		RebaseResult res = git.rebase().setUpstream(first).call();
 		assertEquals(Status.UP_TO_DATE, res.getStatus());
 
-		assertEquals(1, db.getReflogReader(Constants.HEAD).getReverseEntries()
-				.size());
-		assertEquals(1, db.getReflogReader("refs/heads/master")
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(1, refDb.getReflogReader(Constants.HEAD)
+				.getReverseEntries().size());
+		assertEquals(1, refDb.getReflogReader("refs/heads/master")
 				.getReverseEntries().size());
 	}
 
@@ -844,11 +852,12 @@ public void testConflictFreeWithSingleFile() throws Exception {
 					db.resolve(Constants.HEAD)).getParent(0));
 		}
 		assertEquals(origHead, db.readOrigHead());
-		List<ReflogEntry> headLog = db.getReflogReader(Constants.HEAD)
+		RefDatabase refDb = db.getRefDatabase();
+		List<ReflogEntry> headLog = refDb.getReflogReader(Constants.HEAD)
 				.getReverseEntries();
-		List<ReflogEntry> topicLog = db.getReflogReader("refs/heads/topic")
+		List<ReflogEntry> topicLog = refDb.getReflogReader("refs/heads/topic")
 				.getReverseEntries();
-		List<ReflogEntry> masterLog = db.getReflogReader("refs/heads/master")
+		List<ReflogEntry> masterLog = refDb.getReflogReader("refs/heads/master")
 				.getReverseEntries();
 		assertEquals(2, masterLog.size());
 		assertEquals(3, topicLog.size());
@@ -896,8 +905,8 @@ public void testDetachedHead() throws Exception {
 					db.resolve(Constants.HEAD)).getParent(0));
 		}
 
-		List<ReflogEntry> headLog = db.getReflogReader(Constants.HEAD)
-				.getReverseEntries();
+		List<ReflogEntry> headLog = db.getRefDatabase()
+				.getReflogReader(Constants.HEAD).getReverseEntries();
 		assertEquals(8, headLog.size());
 		assertEquals("rebase: change file1 in topic", headLog.get(0)
 				.getComment());
@@ -1603,7 +1612,7 @@ public void testStopOnConflictFileCreationAndDeletion() throws Exception {
 	public void testAuthorScriptConverter() throws Exception {
 		// -1 h timezone offset
 		PersonIdent ident = new PersonIdent("Author name", "a.mail@some.com",
-				123456789123L, -60);
+				Instant.ofEpochMilli(123456789123L), ZoneOffset.ofHours(-1));
 		String convertedAuthor = git.rebase().toAuthorScript(ident);
 		String[] lines = convertedAuthor.split("\n");
 		assertEquals("GIT_AUTHOR_NAME='Author name'", lines[0]);
@@ -1615,12 +1624,14 @@ public void testAuthorScriptConverter() throws Exception {
 		assertEquals(ident.getName(), parsedIdent.getName());
 		assertEquals(ident.getEmailAddress(), parsedIdent.getEmailAddress());
 		// this is rounded to the last second
-		assertEquals(123456789000L, parsedIdent.getWhen().getTime());
-		assertEquals(ident.getTimeZoneOffset(), parsedIdent.getTimeZoneOffset());
+		assertEquals(123456789000L,
+				parsedIdent.getWhenAsInstant().toEpochMilli());
+		assertEquals(ident.getZoneId(), parsedIdent.getZoneId());
 
 		// + 9.5h timezone offset
 		ident = new PersonIdent("Author name", "a.mail@some.com",
-				123456789123L, +570);
+				Instant.ofEpochMilli(123456789123L),
+				ZoneOffset.ofHoursMinutes(9, 30));
 		convertedAuthor = git.rebase().toAuthorScript(ident);
 		lines = convertedAuthor.split("\n");
 		assertEquals("GIT_AUTHOR_NAME='Author name'", lines[0]);
@@ -1631,8 +1642,9 @@ public void testAuthorScriptConverter() throws Exception {
 				convertedAuthor.getBytes(UTF_8));
 		assertEquals(ident.getName(), parsedIdent.getName());
 		assertEquals(ident.getEmailAddress(), parsedIdent.getEmailAddress());
-		assertEquals(123456789000L, parsedIdent.getWhen().getTime());
-		assertEquals(ident.getTimeZoneOffset(), parsedIdent.getTimeZoneOffset());
+		assertEquals(123456789000L,
+				parsedIdent.getWhenAsInstant().toEpochMilli());
+		assertEquals(ident.getZoneId(), parsedIdent.getZoneId());
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
index 8a479a0..4265806 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
@@ -36,6 +36,7 @@
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
@@ -557,43 +558,45 @@ public void testHardResetOnUnbornBranch() throws Exception {
 	private void assertReflog(ObjectId prevHead, ObjectId head)
 			throws IOException {
 		// Check the reflog for HEAD
-		String actualHeadMessage = db.getReflogReader(Constants.HEAD)
+		RefDatabase refDb = db.getRefDatabase();
+		String actualHeadMessage = refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getComment();
 		String expectedHeadMessage = head.getName() + ": updating HEAD";
 		assertEquals(expectedHeadMessage, actualHeadMessage);
-		assertEquals(head.getName(), db.getReflogReader(Constants.HEAD)
+		assertEquals(head.getName(), refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getNewId().getName());
-		assertEquals(prevHead.getName(), db.getReflogReader(Constants.HEAD)
+		assertEquals(prevHead.getName(), refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getOldId().getName());
 
 		// The reflog for master contains the same as the one for HEAD
-		String actualMasterMessage = db.getReflogReader("refs/heads/master")
+		String actualMasterMessage = refDb.getReflogReader("refs/heads/master")
 				.getLastEntry().getComment();
 		String expectedMasterMessage = head.getName() + ": updating HEAD"; // yes!
 		assertEquals(expectedMasterMessage, actualMasterMessage);
-		assertEquals(head.getName(), db.getReflogReader(Constants.HEAD)
+		assertEquals(head.getName(), refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getNewId().getName());
-		assertEquals(prevHead.getName(), db
-				.getReflogReader("refs/heads/master").getLastEntry().getOldId()
-				.getName());
+		assertEquals(prevHead.getName(),
+				refDb.getReflogReader("refs/heads/master").getLastEntry()
+						.getOldId().getName());
 	}
 
 	private void assertReflogDisabled(ObjectId head)
 			throws IOException {
+		RefDatabase refDb = db.getRefDatabase();
 		// Check the reflog for HEAD
-		String actualHeadMessage = db.getReflogReader(Constants.HEAD)
+		String actualHeadMessage = refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getComment();
 		String expectedHeadMessage = "commit: adding a.txt and dir/b.txt";
 		assertEquals(expectedHeadMessage, actualHeadMessage);
-		assertEquals(head.getName(), db.getReflogReader(Constants.HEAD)
+		assertEquals(head.getName(), refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getOldId().getName());
 
 		// The reflog for master contains the same as the one for HEAD
-		String actualMasterMessage = db.getReflogReader("refs/heads/master")
+		String actualMasterMessage = refDb.getReflogReader("refs/heads/master")
 				.getLastEntry().getComment();
 		String expectedMasterMessage = "commit: adding a.txt and dir/b.txt";
 		assertEquals(expectedMasterMessage, actualMasterMessage);
-		assertEquals(head.getName(), db.getReflogReader(Constants.HEAD)
+		assertEquals(head.getName(), refDb.getReflogReader(Constants.HEAD)
 				.getLastEntry().getOldId().getName());
 	}
 	/**
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RevertCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RevertCommandTest.java
index 4ebe994..89fdb32 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RevertCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RevertCommandTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011, Robin Rosenberg and others
+ * Copyright (C) 2011, 2024 Robin Rosenberg and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -29,6 +29,7 @@
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.lib.RepositoryState;
 import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
@@ -59,7 +60,9 @@ public void testRevert() throws IOException, JGitInternalException,
 			writeTrashFile("a",
 					"first line\nsecond line\nthird line\nfourth line\n");
 			git.add().addFilepattern("a").call();
-			RevCommit fixingA = git.commit().setMessage("fixed a").call();
+			// Commit message with a non-empty second line on purpose
+			RevCommit fixingA = git.commit().setMessage("fixed a\nsecond line")
+					.call();
 
 			writeTrashFile("b", "first line\n");
 			git.add().addFilepattern("b").call();
@@ -78,16 +81,18 @@ public void testRevert() throws IOException, JGitInternalException,
 					+ "This reverts commit " + fixingA.getId().getName() + ".\n";
 			assertEquals(expectedMessage, revertCommit.getFullMessage());
 			assertEquals("fixed b", history.next().getFullMessage());
-			assertEquals("fixed a", history.next().getFullMessage());
+			assertEquals("fixed a\nsecond line",
+					history.next().getFullMessage());
 			assertEquals("enlarged a", history.next().getFullMessage());
 			assertEquals("create b", history.next().getFullMessage());
 			assertEquals("create a", history.next().getFullMessage());
 			assertFalse(history.hasNext());
 
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("revert: Revert \""));
-			reader = db.getReflogReader(db.getBranch());
+			reader = refDb.getReflogReader(db.getFullBranch());
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("revert: Revert \""));
 		}
@@ -167,10 +172,11 @@ public void testRevertMultiple() throws IOException, JGitInternalException,
 			assertEquals("add first", history.next().getFullMessage());
 			assertFalse(history.hasNext());
 
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("revert: Revert \""));
-			reader = db.getReflogReader(db.getBranch());
+			reader = refDb.getReflogReader(db.getFullBranch());
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("revert: Revert \""));
 		}
@@ -220,10 +226,11 @@ public void testRevertMultipleWithFail() throws IOException,
 			assertEquals("add first", history.next().getFullMessage());
 			assertFalse(history.hasNext());
 
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("revert: Revert \""));
-			reader = db.getReflogReader(db.getBranch());
+			reader = refDb.getReflogReader(db.getFullBranch());
 			assertTrue(reader.getLastEntry().getComment()
 					.startsWith("revert: Revert \""));
 		}
@@ -428,12 +435,13 @@ private void doRevertAndCheckResult(final Git git,
 		assertEquals(RepositoryState.SAFE, db.getRepositoryState());
 
 		if (reason == null) {
-			ReflogReader reader = db.getReflogReader(Constants.HEAD);
-			assertTrue(reader.getLastEntry().getComment()
-					.startsWith("revert: "));
-			reader = db.getReflogReader(db.getBranch());
-			assertTrue(reader.getLastEntry().getComment()
-					.startsWith("revert: "));
+			RefDatabase refDb = db.getRefDatabase();
+			ReflogReader reader = refDb.getReflogReader(Constants.HEAD);
+			assertTrue(
+					reader.getLastEntry().getComment().startsWith("revert: "));
+			reader = refDb.getReflogReader(db.getFullBranch());
+			assertTrue(
+					reader.getLastEntry().getComment().startsWith("revert: "));
 		}
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java
index 5d0ab05..18cd21a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java
@@ -409,8 +409,8 @@ public void refLogIncludesCommitMessage() throws Exception {
 		assertEquals("content", read(committedFile));
 		validateStashedCommit(stashed);
 
-		ReflogReader reader = git.getRepository().getReflogReader(
-				Constants.R_STASH);
+		ReflogReader reader = git.getRepository().getRefDatabase()
+				.getReflogReader(Constants.R_STASH);
 		ReflogEntry entry = reader.getLastEntry();
 		assertNotNull(entry);
 		assertEquals(ObjectId.zeroId(), entry.getOldId());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java
index c81731d..d937579 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java
@@ -92,8 +92,8 @@ public void dropSingleStashedCommit() throws Exception {
 		stashRef = git.getRepository().exactRef(Constants.R_STASH);
 		assertNull(stashRef);
 
-		ReflogReader reader = git.getRepository().getReflogReader(
-				Constants.R_STASH);
+		ReflogReader reader = git.getRepository().getRefDatabase()
+				.getReflogReader(Constants.R_STASH);
 		assertNull(reader);
 	}
 
@@ -120,8 +120,8 @@ public void dropAll() throws Exception {
 		assertNull(git.stashDrop().setAll(true).call());
 		assertNull(git.getRepository().exactRef(Constants.R_STASH));
 
-		ReflogReader reader = git.getRepository().getReflogReader(
-				Constants.R_STASH);
+		ReflogReader reader = git.getRepository().getRefDatabase()
+				.getReflogReader(Constants.R_STASH);
 		assertNull(reader);
 	}
 
@@ -150,8 +150,8 @@ public void dropFirstStashedCommit() throws Exception {
 		assertNotNull(stashRef);
 		assertEquals(firstStash, stashRef.getObjectId());
 
-		ReflogReader reader = git.getRepository().getReflogReader(
-				Constants.R_STASH);
+		ReflogReader reader = git.getRepository().getRefDatabase()
+				.getReflogReader(Constants.R_STASH);
 		List<ReflogEntry> entries = reader.getReverseEntries();
 		assertEquals(1, entries.size());
 		assertEquals(ObjectId.zeroId(), entries.get(0).getOldId());
@@ -192,8 +192,8 @@ public void dropMiddleStashCommit() throws Exception {
 		assertNotNull(stashRef);
 		assertEquals(thirdStash, stashRef.getObjectId());
 
-		ReflogReader reader = git.getRepository().getReflogReader(
-				Constants.R_STASH);
+		ReflogReader reader = git.getRepository().getRefDatabase()
+				.getReflogReader(Constants.R_STASH);
 		List<ReflogEntry> entries = reader.getReverseEntries();
 		assertEquals(2, entries.size());
 		assertEquals(ObjectId.zeroId(), entries.get(1).getOldId());
@@ -250,8 +250,8 @@ public void dropBoundaryStashedCommits() throws Exception {
 		assertNotNull(stashRef);
 		assertEquals(thirdStash, stashRef.getObjectId());
 
-		ReflogReader reader = git.getRepository().getReflogReader(
-				Constants.R_STASH);
+		ReflogReader reader = git.getRepository().getRefDatabase()
+				.getReflogReader(Constants.R_STASH);
 		List<ReflogEntry> entries = reader.getReverseEntries();
 		assertEquals(2, entries.size());
 		assertEquals(ObjectId.zeroId(), entries.get(1).getOldId());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeDirCacheIteratorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeDirCacheIteratorTest.java
index f23469e..35b9533 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeDirCacheIteratorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeDirCacheIteratorTest.java
@@ -26,6 +26,7 @@
 import org.eclipse.jgit.dircache.DirCacheIterator;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.junit.Before;
 import org.junit.Test;
@@ -230,10 +231,10 @@ private void assertAttributesNode(TreeWalk walk, String pathName,
 		else {
 
 			Attributes entryAttributes = new Attributes();
-			new AttributesHandler(walk).mergeAttributes(attributesNode,
-					pathName,
-					false,
-					entryAttributes);
+			new AttributesHandler(walk,
+					() -> walk.getTree(CanonicalTreeParser.class))
+							.mergeAttributes(attributesNode, pathName, false,
+									entryAttributes);
 
 			if (nodeAttrs != null && !nodeAttrs.isEmpty()) {
 				for (Attribute attribute : nodeAttrs) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeTest.java
index 1fcfbaf..dbbcb75 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeTest.java
@@ -20,6 +20,7 @@
 
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.junit.After;
 import org.junit.Test;
@@ -156,8 +157,9 @@ public void testDoubleAsteriskAtEnd() throws IOException {
 	private void assertAttribute(String path, AttributesNode node,
 			Attributes attrs) throws IOException {
 		Attributes attributes = new Attributes();
-		new AttributesHandler(DUMMY_WALK).mergeAttributes(node, path, false,
-				attributes);
+		new AttributesHandler(DUMMY_WALK,
+				() -> DUMMY_WALK.getTree(CanonicalTreeParser.class))
+						.mergeAttributes(node, path, false, attributes);
 		assertEquals(attrs, attributes);
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeWorkingTreeIteratorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeWorkingTreeIteratorTest.java
index 7b573e1..c6c9138 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeWorkingTreeIteratorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesNodeWorkingTreeIteratorTest.java
@@ -26,6 +26,7 @@
 import org.eclipse.jgit.junit.JGitTestUtil;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.FileTreeIterator;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.WorkingTreeIterator;
@@ -194,9 +195,10 @@ private void assertAttributesNode(TreeWalk walk, String pathName,
 		else {
 
 			Attributes entryAttributes = new Attributes();
-			new AttributesHandler(walk).mergeAttributes(attributesNode,
-					pathName, false,
-					entryAttributes);
+			new AttributesHandler(walk,
+					() -> walk.getTree(CanonicalTreeParser.class))
+							.mergeAttributes(attributesNode, pathName, false,
+									entryAttributes);
 
 			if (nodeAttrs != null && !nodeAttrs.isEmpty()) {
 				for (Attribute attribute : nodeAttrs) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java
index f9fbfe8..00a3760 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java
@@ -17,10 +17,9 @@
 
 import java.io.IOException;
 import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Date;
-import java.util.GregorianCalendar;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jgit.internal.storage.commitgraph.CommitGraph;
@@ -50,7 +49,7 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.storage.pack.PackConfig;
 import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.util.GitDateParser;
+import org.eclipse.jgit.util.GitTimeParser;
 import org.eclipse.jgit.util.SystemReader;
 import org.junit.After;
 import org.junit.Before;
@@ -1294,23 +1293,22 @@ public void gitGCWithRefLogExpire() throws Exception {
 		DfsPackDescription t1 = odb.newPack(INSERT);
 		Ref next = new ObjectIdRef.PeeledNonTag(Ref.Storage.LOOSE,
 				"refs/heads/next", commit0.copy());
-		long currentDay = new Date().getTime();
-		GregorianCalendar cal = new GregorianCalendar(SystemReader
-				.getInstance().getTimeZone(), SystemReader.getInstance()
-				.getLocale());
-		long ten_days_ago = GitDateParser.parse("10 days ago",cal,SystemReader.getInstance()
-				.getLocale()).getTime() ;
-		long twenty_days_ago = GitDateParser.parse("20 days ago",cal,SystemReader.getInstance()
-				.getLocale()).getTime() ;
-		long thirty_days_ago = GitDateParser.parse("30 days ago",cal,SystemReader.getInstance()
-				.getLocale()).getTime() ;;
-		long fifty_days_ago = GitDateParser.parse("50 days ago",cal,SystemReader.getInstance()
-				.getLocale()).getTime() ;
-		PersonIdent who2 = new PersonIdent("J.Author", "authemail", currentDay, -8 * 60);
-		PersonIdent who3 = new PersonIdent("J.Author", "authemail", ten_days_ago, -8 * 60);
-		PersonIdent who4 = new PersonIdent("J.Author", "authemail", twenty_days_ago, -8 * 60);
-		PersonIdent who5 = new PersonIdent("J.Author", "authemail", thirty_days_ago, -8 * 60);
-		PersonIdent who6 = new PersonIdent("J.Author", "authemail", fifty_days_ago, -8 * 60);
+		Instant currentDay = Instant.now();
+		Instant ten_days_ago = GitTimeParser.parseInstant("10 days ago");
+		Instant twenty_days_ago = GitTimeParser.parseInstant("20 days ago");
+		Instant thirty_days_ago = GitTimeParser.parseInstant("30 days ago");
+		Instant fifty_days_ago = GitTimeParser.parseInstant("50 days ago");
+		final ZoneOffset offset = ZoneOffset.ofHours(-8);
+		PersonIdent who2 = new PersonIdent("J.Author", "authemail", currentDay,
+				offset);
+		PersonIdent who3 = new PersonIdent("J.Author", "authemail",
+				ten_days_ago, offset);
+		PersonIdent who4 = new PersonIdent("J.Author", "authemail",
+				twenty_days_ago, offset);
+		PersonIdent who5 = new PersonIdent("J.Author", "authemail",
+				thirty_days_ago, offset);
+		PersonIdent who6 = new PersonIdent("J.Author", "authemail",
+				fifty_days_ago, offset);
 
 		try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) {
 			ReftableWriter w = new ReftableWriter(out);
@@ -1332,7 +1330,7 @@ public void gitGCWithRefLogExpire() throws Exception {
 		gc = new DfsGarbageCollector(repo);
 		gc.setReftableConfig(new ReftableConfig());
 		// Expire ref log entries older than 30 days
-		gc.setRefLogExpire(Instant.ofEpochMilli(thirty_days_ago));
+		gc.setRefLogExpire(thirty_days_ago);
 		run(gc);
 
 		// Single GC pack present with all objects.
@@ -1360,9 +1358,7 @@ public void gitGCWithRefLogExpire() throws Exception {
 			assertEquals(lc.getRefName(),"refs/heads/branch2");
 			// Old entries are purged
 			assertFalse(lc.next());
-
 		}
-
 	}
 
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/BatchRefUpdateTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/BatchRefUpdateTest.java
index 1af42cb..a0afc3e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/BatchRefUpdateTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/BatchRefUpdateTest.java
@@ -1263,7 +1263,7 @@ private Map<String, ReflogEntry> getLastReflogs(String... names)
 	}
 
 	private ReflogEntry getLastReflog(String name) throws IOException {
-		ReflogReader r = diskRepo.getReflogReader(name);
+		ReflogReader r = diskRepo.getRefDatabase().getReflogReader(name);
 		if (r == null) {
 			return null;
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java
index 32342e3..758ee93 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java
@@ -87,13 +87,13 @@ public void testRacyReload() throws Exception {
 
 						u.setNewObjectId(id);
 						r = u.update();
-						assertEquals(r, Result.NEW);
+						assertEquals(Result.NEW, r);
 					}
 				}
 			}
 
 			// only the first one succeeds
-			assertEquals(retry, 19);
+			assertEquals(19, retry);
 		}
 	}
 
@@ -105,13 +105,13 @@ public void testCompactFully() throws Exception {
 			RefUpdate u = db.updateRef("refs/heads/master");
 			u.setForceUpdate(true);
 			u.setNewObjectId((i%2) == 0 ? c1 : c2);
-			assertEquals(u.update(), FORCED);
+			assertEquals(FORCED, u.update());
 		}
 
 		File tableDir = new File(db.getDirectory(), Constants.REFTABLE);
 		assertTrue(tableDir.listFiles().length > 2);
 		((FileReftableDatabase)db.getRefDatabase()).compactFully();
-		assertEquals(tableDir.listFiles().length,2);
+		assertEquals(2, tableDir.listFiles().length);
 	}
 
 	@Test
@@ -171,9 +171,10 @@ public void testConvertToRefdirReflog() throws Exception {
 		v.update();
 
 		db.convertToPackedRefs(true, false);
-		List<ReflogEntry> logs = db.getReflogReader("refs/heads/master").getReverseEntries(2);
-		assertEquals(logs.get(0).getComment(), "banana");
-		assertEquals(logs.get(1).getComment(), "apple");
+		List<ReflogEntry> logs = db.getRefDatabase()
+				.getReflogReader("refs/heads/master").getReverseEntries(2);
+		assertEquals("banana", logs.get(0).getComment());
+		assertEquals("apple", logs.get(1).getComment());
 	}
 
 	@Test
@@ -185,8 +186,9 @@ public void testBatchrefUpdate() throws Exception {
 		ReceiveCommand rc1 = new ReceiveCommand(ObjectId.zeroId(), cur, "refs/heads/batch1");
 		ReceiveCommand rc2 = new ReceiveCommand(ObjectId.zeroId(), prev, "refs/heads/batch2");
 		String msg =  "message";
+		RefDatabase refDb = db.getRefDatabase();
 		try (RevWalk rw = new RevWalk(db)) {
-			db.getRefDatabase().newBatchUpdate()
+			refDb.newBatchUpdate()
 					.addCommand(rc1, rc2)
 					.setAtomic(true)
 					.setRefLogIdent(person)
@@ -194,15 +196,17 @@ public void testBatchrefUpdate() throws Exception {
 					.execute(rw, NullProgressMonitor.INSTANCE);
 		}
 
-		assertEquals(rc1.getResult(), ReceiveCommand.Result.OK);
-		assertEquals(rc2.getResult(), ReceiveCommand.Result.OK);
+		assertEquals(ReceiveCommand.Result.OK, rc1.getResult());
+		assertEquals(ReceiveCommand.Result.OK, rc2.getResult());
 
-		ReflogEntry e = db.getReflogReader("refs/heads/batch1").getLastEntry();
+		ReflogEntry e = refDb.getReflogReader("refs/heads/batch1")
+				.getLastEntry();
 		assertEquals(msg, e.getComment());
 		assertEquals(person, e.getWho());
 		assertEquals(cur, e.getNewId());
 
-		e = db.getReflogReader("refs/heads/batch2").getLastEntry();
+		e = refDb.getReflogReader("refs/heads/batch2")
+				.getLastEntry();
 		assertEquals(msg, e.getComment());
 		assertEquals(person, e.getWho());
 		assertEquals(prev, e.getNewId());
@@ -267,7 +271,7 @@ public void testDelete() throws Exception {
 		RefUpdate up = db.getRefDatabase().newUpdate("refs/heads/a", false);
 		up.setForceUpdate(true);
 		RefUpdate.Result res = up.delete();
-		assertEquals(res, FORCED);
+		assertEquals(FORCED, res);
 		assertNull(db.exactRef("refs/heads/a"));
 	}
 
@@ -309,7 +313,7 @@ public void testUpdateRefDetached() throws Exception {
 
 		// the branch HEAD referred to is left untouched
 		assertEquals(pid, db.resolve("refs/heads/master"));
-		ReflogReader reflogReader = db.getReflogReader("HEAD");
+		ReflogReader reflogReader = db.getRefDatabase().getReflogReader("HEAD");
 		ReflogEntry e = reflogReader.getReverseEntries().get(0);
 		assertEquals(ppid, e.getNewId());
 		assertEquals("GIT_COMMITTER_EMAIL", e.getWho().getEmailAddress());
@@ -330,12 +334,13 @@ public void testWriteReflog() throws Exception {
 		updateRef.setForceUpdate(true);
 		RefUpdate.Result update = updateRef.update();
 		assertEquals(FORCED, update); // internal
-		ReflogReader r = db.getReflogReader("refs/heads/master");
+		ReflogReader r = db.getRefDatabase()
+				.getReflogReader("refs/heads/master");
 
 		ReflogEntry e = r.getLastEntry();
-		assertEquals(e.getNewId(), pid);
-		assertEquals(e.getComment(), "REFLOG!: FORCED");
-		assertEquals(e.getWho(), person);
+		assertEquals(pid, e.getNewId());
+		assertEquals("REFLOG!: FORCED", e.getComment());
+		assertEquals(person, e.getWho());
 	}
 
 	@Test
@@ -352,10 +357,11 @@ public void testLooseDelete() throws IOException {
 		ref = db.updateRef(newRef);
 		ref.setNewObjectId(db.resolve(Constants.HEAD));
 
-		assertEquals(ref.delete(), RefUpdate.Result.NO_CHANGE);
+		assertEquals(RefUpdate.Result.NO_CHANGE, ref.delete());
 
 		// Differs from RefupdateTest. Deleting a loose ref leaves reflog trail.
-		ReflogReader reader = db.getReflogReader("refs/heads/abc");
+		ReflogReader reader = db.getRefDatabase()
+				.getReflogReader("refs/heads/abc");
 		assertEquals(ObjectId.zeroId(), reader.getReverseEntry(1).getOldId());
 		assertEquals(nonZero, reader.getReverseEntry(1).getNewId());
 		assertEquals(nonZero, reader.getReverseEntry(0).getOldId());
@@ -382,8 +388,9 @@ public void testNoCacheObjectIdSubclass() throws IOException {
 		assertNotSame(newid, r.getObjectId());
 		assertSame(ObjectId.class, r.getObjectId().getClass());
 		assertEquals(newid, r.getObjectId());
-		List<ReflogEntry> reverseEntries1 = db.getReflogReader("refs/heads/abc")
-				.getReverseEntries();
+		RefDatabase refDb = db.getRefDatabase();
+		List<ReflogEntry> reverseEntries1 = refDb
+				.getReflogReader("refs/heads/abc").getReverseEntries();
 		ReflogEntry entry1 = reverseEntries1.get(0);
 		assertEquals(1, reverseEntries1.size());
 		assertEquals(ObjectId.zeroId(), entry1.getOldId());
@@ -392,7 +399,7 @@ public void testNoCacheObjectIdSubclass() throws IOException {
 		assertEquals(new PersonIdent(db).toString(),
 				entry1.getWho().toString());
 		assertEquals("", entry1.getComment());
-		List<ReflogEntry> reverseEntries2 = db.getReflogReader("HEAD")
+		List<ReflogEntry> reverseEntries2 = refDb.getReflogReader("HEAD")
 				.getReverseEntries();
 		assertEquals(0, reverseEntries2.size());
 	}
@@ -431,7 +438,7 @@ public void writeUnbornHead() throws Exception {
 
 		Ref head = db.exactRef("HEAD");
 		assertTrue(head.isSymbolic());
-		assertEquals(head.getTarget().getName(), "refs/heads/unborn");
+		assertEquals("refs/heads/unborn", head.getTarget().getName());
 	}
 
 	/**
@@ -455,7 +462,7 @@ public void testUpdateRefDetachedUnbornHead() throws Exception {
 
 		// the branch HEAD referred to is left untouched
 		assertNull(db.resolve("refs/heads/unborn"));
-		ReflogReader reflogReader = db.getReflogReader("HEAD");
+		ReflogReader reflogReader = db.getRefDatabase().getReflogReader("HEAD");
 		ReflogEntry e = reflogReader.getReverseEntries().get(0);
 		assertEquals(ObjectId.zeroId(), e.getOldId());
 		assertEquals(ppid, e.getNewId());
@@ -499,7 +506,7 @@ public void testRenameCurrentBranch() throws IOException {
 		names.add("refs/heads/new/name");
 
 		for (String nm : names) {
-			ReflogReader rd = db.getReflogReader(nm);
+			ReflogReader rd = db.getRefDatabase().getReflogReader(nm);
 			assertNotNull(rd);
 			ReflogEntry last = rd.getLastEntry();
 			ObjectId id = last.getNewId();
@@ -573,10 +580,10 @@ public void compactFully() throws Exception {
 			assertTrue(res == Result.NEW || res == FORCED);
 		}
 
-		assertEquals(refDb.exactRef(refName).getObjectId(), bId);
+		assertEquals(bId, refDb.exactRef(refName).getObjectId());
 		assertTrue(randomStr.equals(refDb.getReflogReader(refName).getReverseEntry(1).getComment()));
 		refDb.compactFully();
-		assertEquals(refDb.exactRef(refName).getObjectId(), bId);
+		assertEquals(bId, refDb.exactRef(refName).getObjectId());
 		assertTrue(randomStr.equals(refDb.getReflogReader(refName).getReverseEntry(1).getComment()));
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java
index 6cad8b6..434f7e4 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java
@@ -16,9 +16,9 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Date;
 import java.util.List;
 
 import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
@@ -206,7 +206,7 @@ public void testDonePruneTooYoungPacks() throws Exception {
 
 		// The old packfile is too young to be deleted. We should end up with
 		// two pack files
-		gc.setExpire(new Date(oldPackfile.lastModified() - 1));
+		gc.setExpire(Instant.ofEpochMilli(oldPackfile.lastModified() - 1));
 		gc.gc().get();
 		stats = gc.getStatistics();
 		assertEquals(0, stats.numberOfLooseObjects);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java
index ca0f684..84ec132 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java
@@ -16,8 +16,8 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.time.Instant;
 import java.util.Collections;
-import java.util.Date;
 
 import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
 import org.eclipse.jgit.lib.ObjectId;
@@ -30,7 +30,7 @@ public class GcPruneNonReferencedTest extends GcTestCase {
 	@Test
 	public void nonReferencedNonExpiredObject_notPruned() throws Exception {
 		RevBlob a = tr.blob("a");
-		gc.setExpire(new Date(lastModified(a)));
+		gc.setExpire(Instant.ofEpochMilli(lastModified(a)));
 		gc.prune(Collections.<ObjectId> emptySet());
 		assertTrue(repo.getObjectDatabase().has(a));
 	}
@@ -58,7 +58,7 @@ public void nonReferencedExpiredObjectTree_pruned() throws Exception {
 	@Test
 	public void nonReferencedObjects_onlyExpiredPruned() throws Exception {
 		RevBlob a = tr.blob("a");
-		gc.setExpire(new Date(lastModified(a) + 1));
+		gc.setExpire(Instant.ofEpochMilli(lastModified(a) + 1));
 
 		fsTick();
 		RevBlob b = tr.blob("b");
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
index d1342c0..7d298ee 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
@@ -49,7 +49,9 @@
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 import java.io.File;
@@ -66,6 +68,7 @@
 
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -221,19 +224,21 @@ public void testOpenLooseObjectSuppressStaleFileHandleException()
 		verify(unpackedObjectCacheMock).remove(id);
 	}
 
-	@Test
+	@Test(expected = IOException.class)
 	public void testOpenLooseObjectPropagatesIOExceptions() throws Exception {
 		ObjectId id = ObjectId
 				.fromString("873fb8d667d05436d728c52b1d7a09528e6eb59b");
 		WindowCursor curs = new WindowCursor(db.getObjectDatabase());
 
-		LooseObjects mock = mock(LooseObjects.class);
+		Config config = new Config();
+		config.setString("core", null, "trustFolderStat", "false");
+		LooseObjects spy = spy(new LooseObjects(config,
+				db.getObjectDatabase().getDirectory()));
 
-		Mockito.when(mock.getObjectLoader(any(), any(), any()))
-				.thenThrow(new IOException("some IO failure"));
-		Mockito.when(mock.open(curs, id)).thenCallRealMethod();
+		doThrow(new IOException("some IO failure")).when(spy)
+				.getObjectLoader(any(), any(), any());
 
-		assertThrows(IOException.class, () -> mock.open(curs, id));
+		spy.open(curs, id);
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
index cb977bd..acc36d7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
@@ -40,6 +40,7 @@
 import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefRename;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.RefUpdate.Result;
@@ -111,16 +112,17 @@ public void testNoCacheObjectIdSubclass() throws IOException {
 		assertNotSame(newid, r.getObjectId());
 		assertSame(ObjectId.class, r.getObjectId().getClass());
 		assertEquals(newid, r.getObjectId());
-		List<ReflogEntry> reverseEntries1 = db
+		List<ReflogEntry> reverseEntries1 = db.getRefDatabase()
 				.getReflogReader("refs/heads/abc").getReverseEntries();
 		ReflogEntry entry1 = reverseEntries1.get(0);
 		assertEquals(1, reverseEntries1.size());
 		assertEquals(ObjectId.zeroId(), entry1.getOldId());
 		assertEquals(r.getObjectId(), entry1.getNewId());
-		assertEquals(new PersonIdent(db).toString(),  entry1.getWho().toString());
+		assertEquals(new PersonIdent(db).toString(),
+				entry1.getWho().toString());
 		assertEquals("", entry1.getComment());
-		List<ReflogEntry> reverseEntries2 = db.getReflogReader("HEAD")
-				.getReverseEntries();
+		List<ReflogEntry> reverseEntries2 = db.getRefDatabase()
+				.getReflogReader("HEAD").getReverseEntries();
 		assertEquals(0, reverseEntries2.size());
 	}
 
@@ -136,8 +138,11 @@ public void testNewNamespaceConflictWithLoosePrefixNameExists()
 		final RefUpdate ru2 = updateRef(newRef2);
 		Result update2 = ru2.update();
 		assertEquals(Result.LOCK_FAILURE, update2);
-		assertEquals(1, db.getReflogReader("refs/heads/z").getReverseEntries().size());
-		assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(1, refDb.getReflogReader("refs/heads/z")
+				.getReverseEntries().size());
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 	}
 
 	@Test
@@ -147,8 +152,10 @@ public void testNewNamespaceConflictWithPackedPrefixNameExists()
 		final RefUpdate ru = updateRef(newRef);
 		Result update = ru.update();
 		assertEquals(Result.LOCK_FAILURE, update);
-		assertNull(db.getReflogReader("refs/heads/master/x"));
-		assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertNull(refDb.getReflogReader("refs/heads/master/x"));
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 	}
 
 	@Test
@@ -163,9 +170,12 @@ public void testNewNamespaceConflictWithLoosePrefixOfExisting()
 		final RefUpdate ru2 = updateRef(newRef2);
 		Result update2 = ru2.update();
 		assertEquals(Result.LOCK_FAILURE, update2);
-		assertEquals(1, db.getReflogReader("refs/heads/z/a").getReverseEntries().size());
-		assertNull(db.getReflogReader("refs/heads/z"));
-		assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(1, refDb.getReflogReader("refs/heads/z/a")
+				.getReverseEntries().size());
+		assertNull(refDb.getReflogReader("refs/heads/z"));
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 	}
 
 	@Test
@@ -175,8 +185,10 @@ public void testNewNamespaceConflictWithPackedPrefixOfExisting()
 		final RefUpdate ru = updateRef(newRef);
 		Result update = ru.update();
 		assertEquals(Result.LOCK_FAILURE, update);
-		assertNull(db.getReflogReader("refs/heads/prefix"));
-		assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertNull(refDb.getReflogReader("refs/heads/prefix"));
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 	}
 
 	/**
@@ -197,8 +209,11 @@ public void testDeleteHEADreferencedRef() throws IOException {
 		Result delete = updateRef2.delete();
 		assertEquals(Result.REJECTED_CURRENT_BRANCH, delete);
 		assertEquals(pid, db.resolve("refs/heads/master"));
-		assertEquals(1,db.getReflogReader("refs/heads/master").getReverseEntries().size());
-		assertEquals(0,db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(1, refDb.getReflogReader("refs/heads/master")
+				.getReverseEntries().size());
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 	}
 
 	@Test
@@ -209,7 +224,8 @@ public void testWriteReflog() throws IOException {
 		updateRef.setForceUpdate(true);
 		Result update = updateRef.update();
 		assertEquals(Result.FORCED, update);
-		assertEquals(1,db.getReflogReader("refs/heads/master").getReverseEntries().size());
+		assertEquals(1, db.getRefDatabase().getReflogReader("refs/heads/master")
+				.getReverseEntries().size());
 	}
 
 	@Test
@@ -219,15 +235,18 @@ public void testLooseDelete() throws IOException {
 		ref.update(); // create loose ref
 		ref = updateRef(newRef); // refresh
 		delete(ref, Result.NO_CHANGE);
-		assertNull(db.getReflogReader("refs/heads/abc"));
+		assertNull(db.getRefDatabase().getReflogReader("refs/heads/abc"));
 	}
 
 	@Test
 	public void testDeleteHead() throws IOException {
 		final RefUpdate ref = updateRef(Constants.HEAD);
 		delete(ref, Result.REJECTED_CURRENT_BRANCH, true, false);
-		assertEquals(0, db.getReflogReader("refs/heads/master").getReverseEntries().size());
-		assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(0, refDb.getReflogReader("refs/heads/master")
+				.getReverseEntries().size());
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 	}
 
 	@Test
@@ -423,7 +442,7 @@ public void testUpdateRefDetached() throws Exception {
 
 		// the branch HEAD referred to is left untouched
 		assertEquals(pid, db.resolve("refs/heads/master"));
-		ReflogReader reflogReader = db.getReflogReader("HEAD");
+		ReflogReader reflogReader = db.getRefDatabase().getReflogReader("HEAD");
 		ReflogEntry e = reflogReader.getReverseEntries().get(0);
 		assertEquals(pid, e.getOldId());
 		assertEquals(ppid, e.getNewId());
@@ -453,7 +472,7 @@ public void testUpdateRefDetachedUnbornHead() throws Exception {
 
 		// the branch HEAD referred to is left untouched
 		assertNull(db.resolve("refs/heads/unborn"));
-		ReflogReader reflogReader = db.getReflogReader("HEAD");
+		ReflogReader reflogReader = db.getRefDatabase().getReflogReader("HEAD");
 		ReflogEntry e = reflogReader.getReverseEntries().get(0);
 		assertEquals(ObjectId.zeroId(), e.getOldId());
 		assertEquals(ppid, e.getNewId());
@@ -691,9 +710,12 @@ public void testRenameBranchNoPreviousLog() throws IOException {
 		assertEquals(Result.RENAMED, result);
 		assertEquals(rb, db.resolve("refs/heads/new/name"));
 		assertNull(db.resolve("refs/heads/b"));
-		assertEquals(1, db.getReflogReader("new/name").getReverseEntries().size());
-		assertEquals("Branch: renamed b to new/name", db.getReflogReader("new/name")
-				.getLastEntry().getComment());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(1, refDb.getReflogReader("refs/heads/new/name")
+				.getReverseEntries().size());
+		assertEquals("Branch: renamed b to new/name",
+				refDb.getReflogReader("refs/heads/new/name").getLastEntry()
+						.getComment());
 		assertFalse(new File(db.getDirectory(), "logs/refs/heads/b").exists());
 		assertEquals(oldHead, db.resolve(Constants.HEAD)); // unchanged
 	}
@@ -713,11 +735,15 @@ public void testRenameBranchHasPreviousLog() throws IOException {
 		assertEquals(Result.RENAMED, result);
 		assertEquals(rb, db.resolve("refs/heads/new/name"));
 		assertNull(db.resolve("refs/heads/b"));
-		assertEquals(2, db.getReflogReader("new/name").getReverseEntries().size());
-		assertEquals("Branch: renamed b to new/name", db.getReflogReader("new/name")
-				.getLastEntry().getComment());
-		assertEquals("Just a message", db.getReflogReader("new/name")
-				.getReverseEntries().get(1).getComment());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(2, refDb.getReflogReader("refs/heads/new/name")
+				.getReverseEntries().size());
+		assertEquals("Branch: renamed b to new/name",
+				refDb.getReflogReader("refs/heads/new/name").getLastEntry()
+						.getComment());
+		assertEquals("Just a message",
+				refDb.getReflogReader("refs/heads/new/name").getReverseEntries()
+						.get(1).getComment());
 		assertFalse(new File(db.getDirectory(), "logs/refs/heads/b").exists());
 		assertEquals(oldHead, db.resolve(Constants.HEAD)); // unchanged
 	}
@@ -737,13 +763,20 @@ public void testRenameCurrentBranch() throws IOException {
 		assertEquals(Result.RENAMED, result);
 		assertEquals(rb, db.resolve("refs/heads/new/name"));
 		assertNull(db.resolve("refs/heads/b"));
-		assertEquals("Branch: renamed b to new/name", db.getReflogReader(
-				"new/name").getLastEntry().getComment());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals("Branch: renamed b to new/name",
+				refDb.getReflogReader("refs/heads/new/name").getLastEntry()
+						.getComment());
 		assertFalse(new File(db.getDirectory(), "logs/refs/heads/b").exists());
 		assertEquals(rb, db.resolve(Constants.HEAD));
-		assertEquals(2, db.getReflogReader("new/name").getReverseEntries().size());
-		assertEquals("Branch: renamed b to new/name", db.getReflogReader("new/name").getReverseEntries().get(0).getComment());
-		assertEquals("Just a message", db.getReflogReader("new/name").getReverseEntries().get(1).getComment());
+		assertEquals(2, refDb.getReflogReader("refs/heads/new/name")
+				.getReverseEntries().size());
+		assertEquals("Branch: renamed b to new/name",
+				refDb.getReflogReader("refs/heads/new/name").getReverseEntries()
+						.get(0).getComment());
+		assertEquals("Just a message",
+				refDb.getReflogReader("refs/heads/new/name").getReverseEntries()
+						.get(1).getComment());
 	}
 
 	@Test
@@ -766,11 +799,17 @@ public void testRenameBranchAlsoInPack() throws IOException {
 		assertEquals(Result.RENAMED, result);
 		assertEquals(rb2, db.resolve("refs/heads/new/name"));
 		assertNull(db.resolve("refs/heads/b"));
-		assertEquals("Branch: renamed b to new/name", db.getReflogReader(
-				"new/name").getLastEntry().getComment());
-		assertEquals(3, db.getReflogReader("refs/heads/new/name").getReverseEntries().size());
-		assertEquals("Branch: renamed b to new/name", db.getReflogReader("refs/heads/new/name").getReverseEntries().get(0).getComment());
-		assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals("Branch: renamed b to new/name",
+				refDb.getReflogReader("refs/heads/new/name").getLastEntry()
+						.getComment());
+		assertEquals(3, refDb.getReflogReader("refs/heads/new/name")
+				.getReverseEntries().size());
+		assertEquals("Branch: renamed b to new/name",
+				refDb.getReflogReader("refs/heads/new/name").getReverseEntries()
+						.get(0).getComment());
+		assertEquals(0,
+				refDb.getReflogReader("HEAD").getReverseEntries().size());
 		// make sure b's log file is gone too.
 		assertFalse(new File(db.getDirectory(), "logs/refs/heads/b").exists());
 
@@ -789,9 +828,10 @@ public void tryRenameWhenLocked(String toLock, String fromName,
 		ObjectId oldfromId = db.resolve(fromName);
 		ObjectId oldHeadId = db.resolve(Constants.HEAD);
 		writeReflog(db, oldfromId, "Just a message", fromName);
-		List<ReflogEntry> oldFromLog = db
+		RefDatabase refDb = db.getRefDatabase();
+		List<ReflogEntry> oldFromLog = refDb
 				.getReflogReader(fromName).getReverseEntries();
-		List<ReflogEntry> oldHeadLog = oldHeadId != null ? db
+		List<ReflogEntry> oldHeadLog = oldHeadId != null ? refDb
 				.getReflogReader(Constants.HEAD).getReverseEntries() : null;
 
 		assertTrue("internal check, we have a log", new File(db.getDirectory(),
@@ -818,10 +858,10 @@ public void tryRenameWhenLocked(String toLock, String fromName,
 			assertEquals(oldHeadId, db.resolve(Constants.HEAD));
 			assertEquals(oldfromId, db.resolve(fromName));
 			assertNull(db.resolve(toName));
-			assertEquals(oldFromLog.toString(), db.getReflogReader(fromName)
+			assertEquals(oldFromLog.toString(), refDb.getReflogReader(fromName)
 					.getReverseEntries().toString());
 			if (oldHeadId != null && oldHeadLog != null)
-				assertEquals(oldHeadLog.toString(), db.getReflogReader(
+				assertEquals(oldHeadLog.toString(), refDb.getReflogReader(
 						Constants.HEAD).getReverseEntries().toString());
 		} finally {
 			lockFile.unlock();
@@ -942,15 +982,18 @@ public void testRenameRefNameColission1avoided() throws IOException {
 		assertEquals(Result.RENAMED, result);
 		assertNull(db.resolve("refs/heads/a"));
 		assertEquals(rb, db.resolve("refs/heads/a/b"));
-		assertEquals(3, db.getReflogReader("a/b").getReverseEntries().size());
-		assertEquals("Branch: renamed a to a/b", db.getReflogReader("a/b")
-				.getReverseEntries().get(0).getComment());
-		assertEquals("Just a message", db.getReflogReader("a/b")
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(3, refDb.getReflogReader("refs/heads/a/b")
+				.getReverseEntries().size());
+		assertEquals("Branch: renamed a to a/b",
+				refDb.getReflogReader("refs/heads/a/b").getReverseEntries()
+						.get(0).getComment());
+		assertEquals("Just a message", refDb.getReflogReader("refs/heads/a/b")
 				.getReverseEntries().get(1).getComment());
-		assertEquals("Setup", db.getReflogReader("a/b").getReverseEntries()
-				.get(2).getComment());
+		assertEquals("Setup", refDb.getReflogReader("refs/heads/a/b")
+				.getReverseEntries().get(2).getComment());
 		// same thing was logged to HEAD
-		assertEquals("Branch: renamed a to a/b", db.getReflogReader("HEAD")
+		assertEquals("Branch: renamed a to a/b", refDb.getReflogReader("HEAD")
 				.getReverseEntries().get(0).getComment());
 	}
 
@@ -978,15 +1021,20 @@ public void testRenameRefNameColission2avoided() throws IOException {
 
 		assertNull(db.resolve("refs/heads/prefix/a"));
 		assertEquals(rb, db.resolve("refs/heads/prefix"));
-		assertEquals(3, db.getReflogReader("prefix").getReverseEntries().size());
-		assertEquals("Branch: renamed prefix/a to prefix", db.getReflogReader(
-				"prefix").getReverseEntries().get(0).getComment());
-		assertEquals("Just a message", db.getReflogReader("prefix")
-				.getReverseEntries().get(1).getComment());
-		assertEquals("Setup", db.getReflogReader("prefix").getReverseEntries()
-				.get(2).getComment());
-		assertEquals("Branch: renamed prefix/a to prefix", db.getReflogReader(
-				"HEAD").getReverseEntries().get(0).getComment());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(3, refDb.getReflogReader("refs/heads/prefix")
+				.getReverseEntries().size());
+		assertEquals("Branch: renamed prefix/a to prefix",
+				refDb.getReflogReader("refs/heads/prefix").getReverseEntries()
+						.get(0).getComment());
+		assertEquals("Just a message",
+				refDb.getReflogReader("refs/heads/prefix").getReverseEntries()
+						.get(1).getComment());
+		assertEquals("Setup", refDb.getReflogReader("refs/heads/prefix")
+				.getReverseEntries().get(2).getComment());
+		assertEquals("Branch: renamed prefix/a to prefix",
+				refDb.getReflogReader("HEAD").getReverseEntries().get(0)
+						.getComment());
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogReaderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogReaderTest.java
index eb521ff..16645cb 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogReaderTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogReaderTest.java
@@ -27,6 +27,7 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.ReflogEntry;
 import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
@@ -154,18 +155,22 @@ public void testReadRightLog() throws Exception {
 		setupReflog("logs/refs/heads/a", aLine);
 		setupReflog("logs/refs/heads/master", masterLine);
 		setupReflog("logs/HEAD", headLine);
-		assertEquals("branch: change to master", db.getReflogReader("master")
-				.getLastEntry().getComment());
-		assertEquals("branch: change to a", db.getReflogReader("a")
-				.getLastEntry().getComment());
-		assertEquals("branch: change to HEAD", db.getReflogReader("HEAD")
-				.getLastEntry().getComment());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals("branch: change to master",
+				refDb.getReflogReader("refs/heads/master").getLastEntry()
+						.getComment());
+		assertEquals("branch: change to a",
+				refDb.getReflogReader("refs/heads/a").getLastEntry()
+						.getComment());
+		assertEquals("branch: change to HEAD",
+				refDb.getReflogReader("HEAD").getLastEntry().getComment());
 	}
 
 	@Test
 	public void testReadLineWithMissingComment() throws Exception {
 		setupReflog("logs/refs/heads/master", oneLineWithoutComment);
-		final ReflogReader reader = db.getReflogReader("master");
+		final ReflogReader reader = db.getRefDatabase()
+				.getReflogReader("refs/heads/master");
 		ReflogEntry e = reader.getLastEntry();
 		assertEquals(ObjectId
 				.fromString("da85355dfc525c9f6f3927b876f379f46ccf826e"), e
@@ -183,15 +188,18 @@ public void testReadLineWithMissingComment() throws Exception {
 
 	@Test
 	public void testNoLog() throws Exception {
-		assertEquals(0, db.getReflogReader("master").getReverseEntries().size());
-		assertNull(db.getReflogReader("master").getLastEntry());
+		RefDatabase refDb = db.getRefDatabase();
+		assertEquals(0,
+				refDb.getReflogReader("refs/heads/master").getReverseEntries()
+						.size());
+		assertNull(refDb.getReflogReader("refs/heads/master").getLastEntry());
 	}
 
 	@Test
 	public void testCheckout() throws Exception {
 		setupReflog("logs/HEAD", switchBranch);
-		List<ReflogEntry> entries = db.getReflogReader(Constants.HEAD)
-				.getReverseEntries();
+		List<ReflogEntry> entries = db.getRefDatabase()
+				.getReflogReader(Constants.HEAD).getReverseEntries();
 		assertEquals(1, entries.size());
 		ReflogEntry entry = entries.get(0);
 		CheckoutEntry checkout = entry.parseCheckout();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogWriterTest.java
index 8e9b7b8..a836333 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogWriterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ReflogWriterTest.java
@@ -16,6 +16,8 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneOffset;
 
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
@@ -32,7 +34,7 @@ public void shouldFilterLineFeedFromMessage() throws Exception {
 		ReflogWriter writer =
 				new ReflogWriter((RefDirectory) db.getRefDatabase());
 		PersonIdent ident = new PersonIdent("John Doe", "john@doe.com",
-				1243028200000L, 120);
+				Instant.ofEpochMilli(1243028200000L), ZoneOffset.ofHours(2));
 		ObjectId oldId = ObjectId
 				.fromString("da85355dfc525c9f6f3927b876f379f46ccf826e");
 		ObjectId newId = ObjectId
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java
index ea0d92a..a54002b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java
@@ -29,6 +29,8 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -175,7 +177,8 @@ public void hasObjMapRefsSmallTable() throws IOException {
 
 	@Test
 	public void hasObjLogs() throws IOException {
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		String msg = "test";
 		ReftableConfig cfg = new ReftableConfig();
 		cfg.setIndexObjects(false);
@@ -617,7 +620,8 @@ public void invalidReflogWriteOrderUpdateIndex() throws IOException {
 			.setMinUpdateIndex(1)
 			.setMaxUpdateIndex(2)
 			.begin();
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		String msg = "test";
 
 		writer.writeLog(MASTER, 1, who, ObjectId.zeroId(), id(1), msg);
@@ -633,7 +637,8 @@ public void invalidReflogWriteOrderName() throws IOException {
 			.setMinUpdateIndex(1)
 			.setMaxUpdateIndex(1)
 			.begin();
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		String msg = "test";
 
 		writer.writeLog(NEXT, 1, who, ObjectId.zeroId(), id(1), msg);
@@ -647,7 +652,8 @@ public void invalidReflogWriteOrderName() throws IOException {
 	public void withReflog() throws IOException {
 		Ref master = ref(MASTER, 1);
 		Ref next = ref(NEXT, 2);
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		String msg = "test";
 
 		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
@@ -712,11 +718,14 @@ public void reflogReader() throws IOException {
 		writer.writeRef(master);
 		writer.writeRef(next);
 
-		PersonIdent who1 = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who1 = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		writer.writeLog(MASTER, 3, who1, ObjectId.zeroId(), id(1), "1");
-		PersonIdent who2 = new PersonIdent("Log", "Ger", 1500079710, -8 * 60);
+		PersonIdent who2 = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		writer.writeLog(MASTER, 2, who2, id(1), id(2), "2");
-		PersonIdent who3 = new PersonIdent("Log", "Ger", 1500079711, -8 * 60);
+		PersonIdent who3 = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		writer.writeLog(MASTER, 1, who3, id(2), id(3), "3");
 
 		writer.finish();
@@ -753,7 +762,8 @@ public void allRefs() throws IOException {
 				.setMaxUpdateIndex(1)
 				.setConfig(cfg)
 				.begin();
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 
 		// Fill out the 1st ref block.
 		List<String> names = new ArrayList<>();
@@ -782,7 +792,8 @@ public void allRefs() throws IOException {
 
 	@Test
 	public void reflogSeek() throws IOException {
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochSecond(1500079709), ZoneOffset.ofHours(-8));
 		String msg = "test";
 		String msgNext = "test next";
 
@@ -827,7 +838,8 @@ public void reflogSeek() throws IOException {
 
 	@Test
 	public void reflogSeekPrefix() throws IOException {
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 
 		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
 		ReftableWriter writer = new ReftableWriter(buffer)
@@ -850,7 +862,8 @@ public void reflogSeekPrefix() throws IOException {
 
 	@Test
 	public void onlyReflog() throws IOException {
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		String msg = "test";
 
 		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
@@ -916,7 +929,8 @@ public void logScan() throws IOException {
 			writer.writeRef(ref);
 		}
 
-		PersonIdent who = new PersonIdent("Log", "Ger", 1500079709, -8 * 60);
+		PersonIdent who = new PersonIdent("Log", "Ger",
+				Instant.ofEpochMilli(1500079709), ZoneOffset.ofHours(-8));
 		for (Ref ref : refs) {
 			writer.writeLog(ref.getName(), 1, who,
 					ObjectId.zeroId(), ref.getObjectId(),
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java
index 450b753..1581d49 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java
@@ -11,6 +11,7 @@
 package org.eclipse.jgit.junit;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.time.Instant.EPOCH;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -18,7 +19,6 @@
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Date;
 import java.util.regex.Pattern;
 
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
@@ -199,8 +199,8 @@ public void amendRef() throws Exception {
 		assertEquals(orig.getAuthorIdent(), amended.getAuthorIdent());
 
 		// Committer name/email is the same, but time was incremented.
-		assertEquals(new PersonIdent(orig.getCommitterIdent(), new Date(0)),
-				new PersonIdent(amended.getCommitterIdent(), new Date(0)));
+		assertEquals(new PersonIdent(orig.getCommitterIdent(), EPOCH),
+				new PersonIdent(amended.getCommitterIdent(), EPOCH));
 		assertTrue(orig.getCommitTime() < amended.getCommitTime());
 
 		assertEquals("foo contents", blobAsString(amended, "foo"));
@@ -275,9 +275,9 @@ public void cherryPick() throws Exception {
 		RevCommit toPick = tr.commit()
 				.parent(tr.commit().create()) // Can't cherry-pick root.
 				.author(new PersonIdent("Cherrypick Author", "cpa@example.com",
-						tr.getDate(), tr.getTimeZone()))
+						tr.getInstant(), tr.getTimeZoneId()))
 				.author(new PersonIdent("Cherrypick Committer", "cpc@example.com",
-						tr.getDate(), tr.getTimeZone()))
+						tr.getInstant(), tr.getTimeZoneId()))
 				.message("message to cherry-pick")
 				.add("bar", "bar contents\n")
 				.create();
@@ -294,8 +294,8 @@ public void cherryPick() throws Exception {
 		assertEquals(toPick.getAuthorIdent(), result.getAuthorIdent());
 
 		// Committer name/email matches default, and time was incremented.
-		assertEquals(new PersonIdent(head.getCommitterIdent(), new Date(0)),
-				new PersonIdent(result.getCommitterIdent(), new Date(0)));
+		assertEquals(new PersonIdent(head.getCommitterIdent(), EPOCH),
+				new PersonIdent(result.getCommitterIdent(), EPOCH));
 		assertTrue(toPick.getCommitTime() < result.getCommitTime());
 
 		assertEquals("message to cherry-pick", result.getFullMessage());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefDatabaseConflictingNamesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefDatabaseConflictingNamesTest.java
index b02f245..85f9612 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefDatabaseConflictingNamesTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefDatabaseConflictingNamesTest.java
@@ -71,6 +71,11 @@ public List<Ref> getAdditionalRefs() throws IOException {
 		}
 
 		@Override
+		public ReflogReader getReflogReader(Ref ref) throws IOException {
+			return null;
+		}
+
+		@Override
 		public void create() throws IOException {
 			// Not needed
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReflogConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReflogConfigTest.java
index 854180e..a93937e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReflogConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReflogConfigTest.java
@@ -16,6 +16,9 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneOffset;
 
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
@@ -24,22 +27,23 @@
 public class ReflogConfigTest extends RepositoryTestCase {
 	@Test
 	public void testlogAllRefUpdates() throws Exception {
-		long commitTime = 1154236443000L;
-		int tz = -4 * 60;
+		Instant commitTime = Instant.ofEpochSecond(1154236443L);
+		ZoneOffset tz = ZoneOffset.ofHours(-4);
 
 		// check that there are no entries in the reflog and turn off writing
 		// reflogs
-		assertTrue(db.getReflogReader(Constants.HEAD).getReverseEntries()
+		RefDatabase refDb = db.getRefDatabase();
+		assertTrue(refDb.getReflogReader(Constants.HEAD).getReverseEntries()
 				.isEmpty());
-		final FileBasedConfig cfg = db.getConfig();
+		FileBasedConfig cfg = db.getConfig();
 		cfg.setBoolean("core", null, "logallrefupdates", false);
 		cfg.save();
 
 		// do one commit and check that reflog size is 0: no reflogs should be
 		// written
 		commit("A Commit\n", commitTime, tz);
-		commitTime += 60 * 1000;
-		assertTrue("Reflog for HEAD still contain no entry", db
+		commitTime = commitTime.plus(Duration.ofMinutes(1));
+		assertTrue("Reflog for HEAD still contain no entry", refDb
 				.getReflogReader(Constants.HEAD).getReverseEntries().isEmpty());
 
 		// set the logAllRefUpdates parameter to true and check it
@@ -52,10 +56,10 @@ public void testlogAllRefUpdates() throws Exception {
 
 		// do one commit and check that reflog size is increased to 1
 		commit("A Commit\n", commitTime, tz);
-		commitTime += 60 * 1000;
-		assertTrue(
-				"Reflog for HEAD should contain one entry",
-				db.getReflogReader(Constants.HEAD).getReverseEntries().size() == 1);
+		commitTime = commitTime.plus(Duration.ofMinutes(1));
+		assertTrue("Reflog for HEAD should contain one entry",
+				refDb.getReflogReader(Constants.HEAD).getReverseEntries()
+						.size() == 1);
 
 		// set the logAllRefUpdates parameter to false and check it
 		cfg.setBoolean("core", null, "logallrefupdates", false);
@@ -67,10 +71,10 @@ public void testlogAllRefUpdates() throws Exception {
 
 		// do one commit and check that reflog size is 2
 		commit("A Commit\n", commitTime, tz);
-		commitTime += 60 * 1000;
-		assertTrue(
-				"Reflog for HEAD should contain two entries",
-				db.getReflogReader(Constants.HEAD).getReverseEntries().size() == 2);
+		commitTime = commitTime.plus(Duration.ofMinutes(1));
+		assertTrue("Reflog for HEAD should contain two entries",
+				refDb.getReflogReader(Constants.HEAD).getReverseEntries()
+						.size() == 2);
 
 		// set the logAllRefUpdates parameter to false and check it
 		cfg.setEnum("core", null, "logallrefupdates",
@@ -84,13 +88,13 @@ public void testlogAllRefUpdates() throws Exception {
 		// do one commit and check that reflog size is 3
 		commit("A Commit\n", commitTime, tz);
 		assertTrue("Reflog for HEAD should contain three entries",
-				db.getReflogReader(Constants.HEAD).getReverseEntries()
+				refDb.getReflogReader(Constants.HEAD).getReverseEntries()
 						.size() == 3);
 	}
 
-	private void commit(String commitMsg, long commitTime, int tz)
+	private void commit(String commitMsg, Instant commitTime, ZoneOffset tz)
 			throws IOException {
-		final CommitBuilder commit = new CommitBuilder();
+		CommitBuilder commit = new CommitBuilder();
 		commit.setAuthor(new PersonIdent(author, commitTime, tz));
 		commit.setCommitter(new PersonIdent(committer, commitTime, tz));
 		commit.setMessage(commitMsg);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java
index ae811f8..8865ba9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java
@@ -15,6 +15,9 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.time.Instant;
+import java.time.ZoneOffset;
+
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheBuilder;
 import org.eclipse.jgit.junit.RepositoryTestCase;
@@ -162,7 +165,8 @@ private static ObjectId commit(final ObjectInserter odi,
 			final ObjectId[] parentIds) throws Exception {
 		final CommitBuilder c = new CommitBuilder();
 		c.setTreeId(treeB.writeTree(odi));
-		c.setAuthor(new PersonIdent("A U Thor", "a.u.thor", 1L, 0));
+		c.setAuthor(new PersonIdent("A U Thor", "a.u.thor",
+				Instant.ofEpochSecond(1), ZoneOffset.UTC));
 		c.setCommitter(c.getAuthor());
 		c.setParentIds(parentIds);
 		c.setMessage("Tree " + c.getTreeId().name());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/GitlinkMergeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/GitlinkMergeTest.java
index f410960..b1998f3 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/GitlinkMergeTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/GitlinkMergeTest.java
@@ -15,6 +15,8 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneOffset;
 
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.dircache.DirCache;
@@ -357,7 +359,8 @@ private static ObjectId commit(ObjectInserter odi, DirCache treeB,
 			ObjectId[] parentIds) throws Exception {
 		CommitBuilder c = new CommitBuilder();
 		c.setTreeId(treeB.writeTree(odi));
-		c.setAuthor(new PersonIdent("A U Thor", "a.u.thor", 1L, 0));
+		c.setAuthor(new PersonIdent("A U Thor", "a.u.thor",
+				Instant.ofEpochSecond(1), ZoneOffset.UTC));
 		c.setCommitter(c.getAuthor());
 		c.setParentIds(parentIds);
 		c.setMessage("Tree " + c.getTreeId().name());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java
index 798aebe..0016adf 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java
@@ -16,6 +16,8 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneOffset;
 
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheBuilder;
@@ -375,7 +377,8 @@ private static ObjectId commit(ObjectInserter odi, DirCache treeB,
 			ObjectId[] parentIds) throws Exception {
 		CommitBuilder c = new CommitBuilder();
 		c.setTreeId(treeB.writeTree(odi));
-		c.setAuthor(new PersonIdent("A U Thor", "a.u.thor", 1L, 0));
+		c.setAuthor(new PersonIdent("A U Thor", "a.u.thor",
+				Instant.ofEpochMilli(1L), ZoneOffset.UTC));
 		c.setCommitter(c.getAuthor());
 		c.setParentIds(parentIds);
 		c.setMessage("Tree " + c.getTreeId().name());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
index 6872289..014ff92 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009, Google Inc. and others
+ * Copyright (C) 2008, 2024 Google Inc. and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -23,7 +23,9 @@
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
-import java.util.TimeZone;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.lib.CommitBuilder;
@@ -94,18 +96,17 @@ public void testParse_NoParents() throws Exception {
 		assertNotNull(cAuthor);
 		assertEquals(authorName, cAuthor.getName());
 		assertEquals(authorEmail, cAuthor.getEmailAddress());
-		assertEquals((long) authorTime * 1000, cAuthor.getWhen().getTime());
-		assertEquals(TimeZone.getTimeZone("GMT" + authorTimeZone),
-				cAuthor.getTimeZone());
+		assertEquals(Instant.ofEpochSecond(authorTime),
+				cAuthor.getWhenAsInstant());
+		assertEquals(ZoneId.of(authorTimeZone), cAuthor.getZoneId());
 
 		final PersonIdent cCommitter = c.getCommitterIdent();
 		assertNotNull(cCommitter);
 		assertEquals(committerName, cCommitter.getName());
 		assertEquals(committerEmail, cCommitter.getEmailAddress());
-		assertEquals((long) committerTime * 1000,
-				cCommitter.getWhen().getTime());
-		assertEquals(TimeZone.getTimeZone("GMT" + committerTimeZone),
-				cCommitter.getTimeZone());
+		assertEquals(Instant.ofEpochSecond(committerTime),
+				cCommitter.getWhenAsInstant());
+		assertEquals(ZoneId.of(committerTimeZone), cCommitter.getZoneId());
 	}
 
 	private RevCommit create(String msg) throws Exception {
@@ -153,9 +154,13 @@ public void testParse_incompleteAuthorAndCommitter() throws Exception {
 			c.parseCanonical(rw, b.toString().getBytes(UTF_8));
 		}
 		assertEquals(
-				new PersonIdent("", "a_u_thor@example.com", 1218123387000L, 7),
+				new PersonIdent("", "a_u_thor@example.com",
+						Instant.ofEpochMilli(1218123387000L),
+						ZoneOffset.ofHoursMinutes(0, 7)),
 				c.getAuthorIdent());
-		assertEquals(new PersonIdent("", "", 1218123390000L, -5),
+		assertEquals(
+				new PersonIdent("", "", Instant.ofEpochMilli(1218123390000L),
+						ZoneOffset.ofHoursMinutes(0, -5)),
 				c.getCommitterIdent());
 	}
 
@@ -408,6 +413,7 @@ public void testParse_NoMessage() throws Exception {
 		final RevCommit c = create(msg);
 		assertEquals(msg, c.getFullMessage());
 		assertEquals(msg, c.getShortMessage());
+		assertEquals(msg, c.getFirstMessageLine());
 	}
 
 	@Test
@@ -415,6 +421,7 @@ public void testParse_OnlyLFMessage() throws Exception {
 		final RevCommit c = create("\n");
 		assertEquals("\n", c.getFullMessage());
 		assertEquals("", c.getShortMessage());
+		assertEquals("", c.getFirstMessageLine());
 	}
 
 	@Test
@@ -423,6 +430,7 @@ public void testParse_ShortLineOnlyNoLF() throws Exception {
 		final RevCommit c = create(shortMsg);
 		assertEquals(shortMsg, c.getFullMessage());
 		assertEquals(shortMsg, c.getShortMessage());
+		assertEquals(shortMsg, c.getFirstMessageLine());
 	}
 
 	@Test
@@ -432,6 +440,7 @@ public void testParse_ShortLineOnlyEndLF() throws Exception {
 		final RevCommit c = create(fullMsg);
 		assertEquals(fullMsg, c.getFullMessage());
 		assertEquals(shortMsg, c.getShortMessage());
+		assertEquals(shortMsg, c.getFirstMessageLine());
 	}
 
 	@Test
@@ -441,6 +450,7 @@ public void testParse_ShortLineOnlyEmbeddedLF() throws Exception {
 		final RevCommit c = create(fullMsg);
 		assertEquals(fullMsg, c.getFullMessage());
 		assertEquals(shortMsg, c.getShortMessage());
+		assertEquals("This is a", c.getFirstMessageLine());
 	}
 
 	@Test
@@ -450,6 +460,7 @@ public void testParse_ShortLineOnlyEmbeddedAndEndingLF() throws Exception {
 		final RevCommit c = create(fullMsg);
 		assertEquals(fullMsg, c.getFullMessage());
 		assertEquals(shortMsg, c.getShortMessage());
+		assertEquals("This is a", c.getFirstMessageLine());
 	}
 
 	@Test
@@ -461,6 +472,7 @@ public void testParse_GitStyleMessage() throws Exception {
 		final RevCommit c = create(fullMsg);
 		assertEquals(fullMsg, c.getFullMessage());
 		assertEquals(shortMsg, c.getShortMessage());
+		assertEquals(shortMsg, c.getFirstMessageLine());
 	}
 
 	@Test
@@ -480,6 +492,7 @@ public void testParse_PublicParseMethod()
 		assertEquals(author, p.getAuthorIdent());
 		assertEquals(committer, p.getCommitterIdent());
 		assertEquals("Test commit", p.getShortMessage());
+		assertEquals("Test commit", p.getFirstMessageLine());
 		assertEquals(src.getMessage(), p.getFullMessage());
 	}
 
@@ -494,6 +507,7 @@ public void testParse_GitStyleMessageWithCRLF() throws Exception {
 		final RevCommit c = create(fullMsg);
 		assertEquals(fullMsg, c.getFullMessage());
 		assertEquals(shortMsg, c.getShortMessage());
+		assertEquals("This fixes a", c.getFirstMessageLine());
 	}
 
 	private static ObjectId id(String str) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFilterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFilterTest.java
index 81ff4a2..7fece66 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFilterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFilterTest.java
@@ -14,6 +14,7 @@
 import static org.junit.Assert.assertNull;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.Date;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -217,14 +218,132 @@ public void testCommitTimeRevFilter() throws Exception {
 		final RevCommit b = commit(a);
 		tick(100);
 
-		Date since = getDate();
+		Instant since = getInstant();
 		final RevCommit c1 = commit(b);
 		tick(100);
 
 		final RevCommit c2 = commit(b);
 		tick(100);
 
-		Date until = getDate();
+		Instant until = getInstant();
+		final RevCommit d = commit(c1, c2);
+		tick(100);
+
+		final RevCommit e = commit(d);
+
+		{
+			RevFilter after = CommitTimeRevFilter.after(since);
+			assertNotNull(after);
+			rw.setRevFilter(after);
+			markStart(e);
+			assertCommit(e, rw.next());
+			assertCommit(d, rw.next());
+			assertCommit(c2, rw.next());
+			assertCommit(c1, rw.next());
+			assertNull(rw.next());
+		}
+
+		{
+			RevFilter before = CommitTimeRevFilter.before(until);
+			assertNotNull(before);
+			rw.reset();
+			rw.setRevFilter(before);
+			markStart(e);
+			assertCommit(c2, rw.next());
+			assertCommit(c1, rw.next());
+			assertCommit(b, rw.next());
+			assertCommit(a, rw.next());
+			assertNull(rw.next());
+		}
+
+		{
+			RevFilter between = CommitTimeRevFilter.between(since, until);
+			assertNotNull(between);
+			rw.reset();
+			rw.setRevFilter(between);
+			markStart(e);
+			assertCommit(c2, rw.next());
+			assertCommit(c1, rw.next());
+			assertNull(rw.next());
+		}
+	}
+
+	@Test
+	public void testCommitTimeRevFilter_date() throws Exception {
+		// Using deprecated Date api for the commit time rev filter.
+		// Delete this tests when method is removed.
+		final RevCommit a = commit();
+		tick(100);
+
+		final RevCommit b = commit(a);
+		tick(100);
+
+		Date since = Date.from(getInstant());
+		final RevCommit c1 = commit(b);
+		tick(100);
+
+		final RevCommit c2 = commit(b);
+		tick(100);
+
+		Date until = Date.from(getInstant());
+		final RevCommit d = commit(c1, c2);
+		tick(100);
+
+		final RevCommit e = commit(d);
+
+		{
+			RevFilter after = CommitTimeRevFilter.after(since);
+			assertNotNull(after);
+			rw.setRevFilter(after);
+			markStart(e);
+			assertCommit(e, rw.next());
+			assertCommit(d, rw.next());
+			assertCommit(c2, rw.next());
+			assertCommit(c1, rw.next());
+			assertNull(rw.next());
+		}
+
+		{
+			RevFilter before = CommitTimeRevFilter.before(until);
+			assertNotNull(before);
+			rw.reset();
+			rw.setRevFilter(before);
+			markStart(e);
+			assertCommit(c2, rw.next());
+			assertCommit(c1, rw.next());
+			assertCommit(b, rw.next());
+			assertCommit(a, rw.next());
+			assertNull(rw.next());
+		}
+
+		{
+			RevFilter between = CommitTimeRevFilter.between(since, until);
+			assertNotNull(between);
+			rw.reset();
+			rw.setRevFilter(between);
+			markStart(e);
+			assertCommit(c2, rw.next());
+			assertCommit(c1, rw.next());
+			assertNull(rw.next());
+		}
+	}
+
+	@Test
+	public void testCommitTimeRevFilter_long() throws Exception {
+		final RevCommit a = commit();
+		tick(100);
+
+		final RevCommit b = commit(a);
+		tick(100);
+
+		long since = getInstant().toEpochMilli();
+		final RevCommit c1 = commit(b);
+		tick(100);
+
+		final RevCommit c2 = commit(b);
+		tick(100);
+
+		long until = getInstant().toEpochMilli();
 		final RevCommit d = commit(c1, c2);
 		tick(100);
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkTestCase.java
index ec0c0e7..8fa6a83 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkTestCase.java
@@ -12,6 +12,7 @@
 
 import static org.junit.Assert.assertSame;
 
+import java.time.Instant;
 import java.util.Date;
 
 import org.eclipse.jgit.dircache.DirCacheEntry;
@@ -38,8 +39,14 @@ protected RevWalk createRevWalk() {
 		return new RevWalk(db);
 	}
 
+	// Use getInstant() instead
+	@Deprecated
 	protected Date getDate() {
-		return util.getDate();
+		return Date.from(util.getInstant());
+	}
+
+	protected Instant getInstant() {
+		return util.getInstant();
 	}
 
 	protected void tick(int secDelta) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleAddTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleAddTest.java
index 300c869..4306975 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleAddTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleAddTest.java
@@ -114,6 +114,13 @@ public void addSubmodule() throws Exception {
 				try (Repository subModRepo = generator.getRepository()) {
 					assertNotNull(subModRepo);
 					assertEquals(subCommit, commit);
+					String worktreeDir = subModRepo.getConfig().getString(
+							ConfigConstants.CONFIG_CORE_SECTION, null,
+							ConfigConstants.CONFIG_KEY_WORKTREE);
+					assertEquals("../../../sub", worktreeDir);
+					String gitdir = read(new File(subModRepo.getWorkTree(),
+							Constants.DOT_GIT));
+					assertEquals("gitdir: ../.git/modules/sub", gitdir);
 				}
 			}
 			Status status = Git.wrap(db).status().call();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleUpdateTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleUpdateTest.java
index b10bd73..d541170 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleUpdateTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleUpdateTest.java
@@ -17,21 +17,25 @@
 import java.io.IOException;
 import java.util.Collection;
 
+import org.eclipse.jgit.api.CheckoutCommand;
 import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.InitCommand;
+import org.eclipse.jgit.api.SubmoduleAddCommand;
 import org.eclipse.jgit.api.SubmoduleUpdateCommand;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheEditor;
 import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
 import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.junit.JGitTestUtil;
 import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.junit.Test;
 
@@ -40,6 +44,91 @@
  */
 public class SubmoduleUpdateTest extends RepositoryTestCase {
 
+	private Repository submoduleRepo;
+
+	private Git git;
+
+	private AnyObjectId subRepoCommit2;
+
+	private void createSubmoduleRepo() throws IOException, GitAPIException {
+		File directory = createTempDirectory("submodule_repo");
+		InitCommand init = Git.init();
+		init.setDirectory(directory);
+		init.call();
+		submoduleRepo = Git.open(directory).getRepository();
+		try (Git sub = Git.wrap(submoduleRepo)) {
+			// commit something
+			JGitTestUtil.writeTrashFile(submoduleRepo, "commit1.txt",
+					"commit 1");
+			sub.add().addFilepattern("commit1.txt").call();
+			sub.commit().setMessage("commit 1").call().getId();
+
+			JGitTestUtil.writeTrashFile(submoduleRepo, "commit2.txt",
+					"commit 2");
+			sub.add().addFilepattern("commit2.txt").call();
+			subRepoCommit2 = sub.commit().setMessage("commit 2").call().getId();
+		}
+	}
+
+	private void addSubmodule(String path) throws GitAPIException {
+		SubmoduleAddCommand command = new SubmoduleAddCommand(db);
+		command.setPath(path);
+		String uri = submoduleRepo.getDirectory().toURI().toString();
+		command.setURI(uri);
+		try (Repository repo = command.call()) {
+			assertNotNull(repo);
+		}
+		git.add().addFilepattern(path).addFilepattern(Constants.DOT_GIT_MODULES)
+				.call();
+		git.commit().setMessage("adding submodule").call();
+		recursiveDelete(new File(git.getRepository().getWorkTree(), path));
+		recursiveDelete(
+				new File(new File(git.getRepository().getCommonDirectory(),
+						Constants.MODULES), path));
+	}
+
+	@Override
+	public void setUp() throws Exception {
+		super.setUp();
+		createSubmoduleRepo();
+
+		git = Git.wrap(db);
+		// commit something
+		writeTrashFile("initial.txt", "initial");
+		git.add().addFilepattern("initial.txt").call();
+		git.commit().setMessage("initial commit").call();
+	}
+
+	public void updateModeClonedRestoredSubmoduleTemplate(String mode)
+			throws Exception {
+		String path = "sub";
+		addSubmodule(path);
+
+		StoredConfig cfg = git.getRepository().getConfig();
+		if (mode != null) {
+			cfg.load();
+			cfg.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
+					ConfigConstants.CONFIG_KEY_UPDATE, mode);
+			cfg.save();
+		}
+		SubmoduleUpdateCommand update = new SubmoduleUpdateCommand(db);
+		update.call();
+		try (Git subGit = Git.open(new File(db.getWorkTree(), path))) {
+			update.call();
+			assertEquals(subRepoCommit2.getName(),
+					subGit.getRepository().getBranch());
+		}
+
+		recursiveDelete(new File(db.getWorkTree(), path));
+
+		update.call();
+		try (Git subGit = Git.open(new File(db.getWorkTree(), path))) {
+			update.call();
+			assertEquals(subRepoCommit2.getName(),
+					subGit.getRepository().getBranch());
+		}
+	}
+
 	@Test
 	public void repositoryWithNoSubmodules() throws GitAPIException {
 		SubmoduleUpdateCommand command = new SubmoduleUpdateCommand(db);
@@ -50,35 +139,9 @@ public void repositoryWithNoSubmodules() throws GitAPIException {
 
 	@Test
 	public void repositoryWithSubmodule() throws Exception {
-		writeTrashFile("file.txt", "content");
-		Git git = Git.wrap(db);
-		git.add().addFilepattern("file.txt").call();
-		final RevCommit commit = git.commit().setMessage("create file").call();
 
 		final String path = "sub";
-		DirCache cache = db.lockDirCache();
-		DirCacheEditor editor = cache.editor();
-		editor.add(new PathEdit(path) {
-
-			@Override
-			public void apply(DirCacheEntry ent) {
-				ent.setFileMode(FileMode.GITLINK);
-				ent.setObjectId(commit);
-			}
-		});
-		editor.commit();
-
-		StoredConfig config = db.getConfig();
-		config.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
-				ConfigConstants.CONFIG_KEY_URL, db.getDirectory().toURI()
-						.toString());
-		config.save();
-
-		FileBasedConfig modulesConfig = new FileBasedConfig(new File(
-				db.getWorkTree(), Constants.DOT_GIT_MODULES), db.getFS());
-		modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
-				ConfigConstants.CONFIG_KEY_PATH, path);
-		modulesConfig.save();
+		addSubmodule(path);
 
 		SubmoduleUpdateCommand command = new SubmoduleUpdateCommand(db);
 		Collection<String> updated = command.call();
@@ -90,14 +153,22 @@ public void apply(DirCacheEntry ent) {
 			assertTrue(generator.next());
 			try (Repository subRepo = generator.getRepository()) {
 				assertNotNull(subRepo);
-				assertEquals(commit, subRepo.resolve(Constants.HEAD));
+				assertEquals(subRepoCommit2, subRepo.resolve(Constants.HEAD));
+				String worktreeDir = subRepo.getConfig().getString(
+						ConfigConstants.CONFIG_CORE_SECTION, null,
+						ConfigConstants.CONFIG_KEY_WORKTREE);
+				assertEquals("../../../sub", worktreeDir);
+				String gitdir = read(
+						new File(subRepo.getWorkTree(), Constants.DOT_GIT));
+				assertEquals("gitdir: ../.git/modules/sub", gitdir);
+
 			}
 		}
 	}
 
 	@Test
-	public void repositoryWithUnconfiguredSubmodule() throws IOException,
-			GitAPIException {
+	public void repositoryWithUnconfiguredSubmodule()
+			throws IOException, GitAPIException {
 		final ObjectId id = ObjectId
 				.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
 		final String path = "sub";
@@ -113,16 +184,14 @@ public void apply(DirCacheEntry ent) {
 		});
 		editor.commit();
 
-		FileBasedConfig modulesConfig = new FileBasedConfig(new File(
-				db.getWorkTree(), Constants.DOT_GIT_MODULES), db.getFS());
+		FileBasedConfig modulesConfig = new FileBasedConfig(
+				new File(db.getWorkTree(), Constants.DOT_GIT_MODULES),
+				db.getFS());
 		modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
 				ConfigConstants.CONFIG_KEY_PATH, path);
 		String url = "git://server/repo.git";
 		modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
 				ConfigConstants.CONFIG_KEY_URL, url);
-		String update = "rebase";
-		modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
-				ConfigConstants.CONFIG_KEY_UPDATE, update);
 		modulesConfig.save();
 
 		SubmoduleUpdateCommand command = new SubmoduleUpdateCommand(db);
@@ -132,8 +201,8 @@ public void apply(DirCacheEntry ent) {
 	}
 
 	@Test
-	public void repositoryWithInitializedSubmodule() throws IOException,
-			GitAPIException {
+	public void repositoryWithInitializedSubmodule()
+			throws IOException, GitAPIException {
 		final ObjectId id = ObjectId
 				.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
 		final String path = "sub";
@@ -160,4 +229,77 @@ public void apply(DirCacheEntry ent) {
 		assertNotNull(updated);
 		assertTrue(updated.isEmpty());
 	}
+
+	@Test
+	public void updateModeMergeClonedRestoredSubmodule() throws Exception {
+		updateModeClonedRestoredSubmoduleTemplate(
+				ConfigConstants.CONFIG_KEY_MERGE);
+	}
+
+	@Test
+	public void updateModeRebaseClonedRestoredSubmodule() throws Exception {
+		updateModeClonedRestoredSubmoduleTemplate(
+				ConfigConstants.CONFIG_KEY_REBASE);
+	}
+
+	@Test
+	public void updateModeCheckoutClonedRestoredSubmodule() throws Exception {
+		updateModeClonedRestoredSubmoduleTemplate(
+				ConfigConstants.CONFIG_KEY_CHECKOUT);
+	}
+
+	@Test
+	public void updateModeMissingClonedRestoredSubmodule() throws Exception {
+		updateModeClonedRestoredSubmoduleTemplate(null);
+	}
+
+	@Test
+	public void updateMode() throws Exception {
+		String path = "sub";
+		addSubmodule(path);
+
+		StoredConfig cfg = git.getRepository().getConfig();
+		cfg.load();
+		cfg.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
+				ConfigConstants.CONFIG_KEY_UPDATE,
+				ConfigConstants.CONFIG_KEY_REBASE);
+		cfg.save();
+
+		SubmoduleUpdateCommand update = new SubmoduleUpdateCommand(db);
+		update.call();
+		try (Git subGit = Git.open(new File(db.getWorkTree(), path))) {
+			CheckoutCommand checkout = subGit.checkout();
+			checkout.setName("master");
+			checkout.call();
+			update.call();
+			assertEquals("master", subGit.getRepository().getBranch());
+		}
+
+		cfg.load();
+		cfg.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
+				ConfigConstants.CONFIG_KEY_UPDATE,
+				ConfigConstants.CONFIG_KEY_CHECKOUT);
+		cfg.save();
+
+		update.call();
+		try (Git subGit = Git.open(new File(db.getWorkTree(), path))) {
+			assertEquals(subRepoCommit2.getName(),
+					subGit.getRepository().getBranch());
+		}
+
+		cfg.load();
+		cfg.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
+				ConfigConstants.CONFIG_KEY_UPDATE,
+				ConfigConstants.CONFIG_KEY_MERGE);
+		cfg.save();
+
+		update.call();
+		try (Git subGit = Git.open(new File(db.getWorkTree(), path))) {
+			CheckoutCommand checkout = subGit.checkout();
+			checkout.setName("master");
+			checkout.call();
+			update.call();
+			assertEquals("master", subGit.getRepository().getBranch());
+		}
+	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java
index cee023d..6290b79 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java
@@ -138,6 +138,51 @@ public void incompleteCasesMatchPersonIdent() throws Exception {
 				"Me <me@example.com>");
 	}
 
+	@Test
+	public void timezoneRange_hours() {
+		int HOUR_TO_MS = 60 * 60 * 1000;
+
+		// java.util.TimeZone: Hours must be between 0 to 23
+		PushCertificateIdent hourLimit = PushCertificateIdent
+				.parse("A U. Thor <a_u_thor@example.com> 1218123387 +2300");
+		assertEquals(1380, hourLimit.getTimeZoneOffset());
+		assertEquals(23 * HOUR_TO_MS,
+				hourLimit.getTimeZone().getOffset(1218123387));
+
+		PushCertificateIdent hourDubious = PushCertificateIdent
+				.parse("A U. Thor <a_u_thor@example.com> 1218123387 +2400");
+		assertEquals(1440, hourDubious.getTimeZoneOffset());
+		assertEquals(0, hourDubious.getTimeZone().getOffset(1218123387));
+	}
+
+	@Test
+	public void timezoneRange_minutes() {
+		PushCertificateIdent hourLimit = PushCertificateIdent
+				.parse("A U. Thor <a_u_thor@example.com> 1218123387 +0059");
+		assertEquals(59, hourLimit.getTimeZoneOffset());
+		assertEquals(59 * 60 * 1000,
+				hourLimit.getTimeZone().getOffset(1218123387));
+
+		// This becomes one hour and one minute (!)
+		PushCertificateIdent hourDubious = PushCertificateIdent
+				.parse("A U. Thor <a_u_thor@example.com> 1218123387 +0061");
+		assertEquals(61, hourDubious.getTimeZoneOffset());
+		assertEquals(61 * 60 * 1000,
+				hourDubious.getTimeZone().getOffset(1218123387));
+
+		PushCertificateIdent weirdCase = PushCertificateIdent
+				.parse("A U. Thor <a_u_thor@example.com> 1218123387 +0099");
+		assertEquals(99, weirdCase.getTimeZoneOffset());
+		assertEquals(99 * 60 * 1000,
+				weirdCase.getTimeZone().getOffset(1218123387));
+
+		PushCertificateIdent weirdCase2 = PushCertificateIdent
+				.parse("A U. Thor <a_u_thor@example.com> 1218123387 +0199");
+		assertEquals(60 + 99, weirdCase2.getTimeZoneOffset());
+		assertEquals((60 + 99) * 60 * 1000,
+				weirdCase2.getTimeZone().getOffset(1218123387));
+	}
+
 	private static void assertMatchesPersonIdent(String raw,
 			PersonIdent expectedPersonIdent, String expectedUserId) {
 		PushCertificateIdent certIdent = PushCertificateIdent.parse(raw);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateStoreTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateStoreTest.java
index 4f01e4d..a03222b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateStoreTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateStoreTest.java
@@ -23,6 +23,8 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -318,8 +320,8 @@ public void putMatchingWithSomeMatchingRefs() throws Exception {
 	}
 
 	private PersonIdent newIdent() {
-		return new PersonIdent(
-				"A U. Thor", "author@example.com", ts.getAndIncrement(), 0);
+		return new PersonIdent("A U. Thor", "author@example.com",
+				Instant.ofEpochMilli(ts.getAndIncrement()), ZoneOffset.UTC);
 	}
 
 	private PushCertificateStore newStore() {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java
index 029b45e..96d3a58 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java
@@ -14,10 +14,10 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.HttpCookie;
+import java.time.Duration;
 import java.time.Instant;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -101,7 +101,7 @@ public void testProcessResponseCookies() throws IOException {
 						.singletonList("cookie2=some value; Max-Age=1234; Path=/"));
 
 		try (TransportHttp transportHttp = new TransportHttp(db, uri)) {
-			Date creationDate = new Date();
+			Instant creationDate = Instant.now();
 			transportHttp.processResponseCookies(connection);
 
 			// evaluate written cookie file
@@ -112,8 +112,9 @@ public void testProcessResponseCookies() throws IOException {
 			cookie.setPath("/u/2/");
 
 			cookie.setMaxAge(
-					(Instant.parse("2100-01-01T11:00:00.000Z").toEpochMilli()
-							- creationDate.getTime()) / 1000);
+					Duration.between(creationDate,
+							Instant.parse("2100-01-01T11:00:00.000Z"))
+							.getSeconds());
 			cookie.setSecure(true);
 			cookie.setHttpOnly(true);
 			expectedCookies.add(cookie);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
index aaecfd2..5c2f0e5 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
@@ -1,5 +1,6 @@
 package org.eclipse.jgit.transport;
 
+import static java.time.ZoneOffset.UTC;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.containsString;
@@ -18,6 +19,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1506,14 +1508,19 @@ public void testV2FetchDeepenWithoutDone() throws Exception {
 	public void testV2FetchShallowSince() throws Exception {
 		PersonIdent person = new PersonIdent(remote.getRepository());
 
-		RevCommit beyondBoundary = remote.commit()
-			.committer(new PersonIdent(person, 1510000000, 0)).create();
-		RevCommit boundary = remote.commit().parent(beyondBoundary)
-			.committer(new PersonIdent(person, 1520000000, 0)).create();
-		RevCommit tooOld = remote.commit()
-			.committer(new PersonIdent(person, 1500000000, 0)).create();
+		RevCommit beyondBoundary = remote.commit().committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1510000), UTC))
+				.create();
+		RevCommit boundary = remote.commit().parent(beyondBoundary).committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1520000), UTC))
+				.create();
+		RevCommit tooOld = remote.commit().committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1500000), UTC))
+				.create();
 		RevCommit merge = remote.commit().parent(boundary).parent(tooOld)
-			.committer(new PersonIdent(person, 1530000000, 0)).create();
+				.committer(new PersonIdent(person,
+						Instant.ofEpochSecond(1530000), UTC))
+				.create();
 
 		remote.update("branch1", merge);
 
@@ -1559,12 +1566,15 @@ public void testV2FetchShallowSince() throws Exception {
 	public void testV2FetchShallowSince_excludedParentWithMultipleChildren() throws Exception {
 		PersonIdent person = new PersonIdent(remote.getRepository());
 
-		RevCommit base = remote.commit()
-			.committer(new PersonIdent(person, 1500000000, 0)).create();
-		RevCommit child1 = remote.commit().parent(base)
-			.committer(new PersonIdent(person, 1510000000, 0)).create();
-		RevCommit child2 = remote.commit().parent(base)
-			.committer(new PersonIdent(person, 1520000000, 0)).create();
+		RevCommit base = remote.commit().committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1500000), UTC))
+				.create();
+		RevCommit child1 = remote.commit().parent(base).committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1510000), UTC))
+				.create();
+		RevCommit child2 = remote.commit().parent(base).committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1520000), UTC))
+				.create();
 
 		remote.update("branch1", child1);
 		remote.update("branch2", child2);
@@ -1601,8 +1611,9 @@ public void testV2FetchShallowSince_excludedParentWithMultipleChildren() throws
 	public void testV2FetchShallowSince_noCommitsSelected() throws Exception {
 		PersonIdent person = new PersonIdent(remote.getRepository());
 
-		RevCommit tooOld = remote.commit()
-				.committer(new PersonIdent(person, 1500000000, 0)).create();
+		RevCommit tooOld = remote.commit().committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1500000), UTC))
+				.create();
 
 		remote.update("branch1", tooOld);
 
@@ -1726,12 +1737,15 @@ public void testV2FetchDeepenNot_supportAnnotatedTags() throws Exception {
 	public void testV2FetchDeepenNot_excludedParentWithMultipleChildren() throws Exception {
 		PersonIdent person = new PersonIdent(remote.getRepository());
 
-		RevCommit base = remote.commit()
-			.committer(new PersonIdent(person, 1500000000, 0)).create();
-		RevCommit child1 = remote.commit().parent(base)
-			.committer(new PersonIdent(person, 1510000000, 0)).create();
-		RevCommit child2 = remote.commit().parent(base)
-			.committer(new PersonIdent(person, 1520000000, 0)).create();
+		RevCommit base = remote.commit().committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1500000), UTC))
+				.create();
+		RevCommit child1 = remote.commit().parent(base).committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1510000), UTC))
+				.create();
+		RevCommit child2 = remote.commit().parent(base).committer(
+				new PersonIdent(person, Instant.ofEpochSecond(1520000), UTC))
+				.create();
 
 		remote.update("base", base);
 		remote.update("branch1", child1);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/ChangeIdUtilTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/ChangeIdUtilTest.java
index 3265249..e7f2049 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/ChangeIdUtilTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/ChangeIdUtilTest.java
@@ -12,7 +12,9 @@
 
 import static org.junit.Assert.assertEquals;
 
-import java.util.concurrent.TimeUnit;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneId;
 
 import org.eclipse.jgit.junit.MockSystemReader;
 import org.eclipse.jgit.lib.ObjectId;
@@ -53,9 +55,9 @@ public class ChangeIdUtilTest {
 
 	MockSystemReader mockSystemReader = new MockSystemReader();
 
-	final long when = mockSystemReader.getCurrentTime();
+	Instant when = mockSystemReader.now();
 
-	final int tz = new MockSystemReader().getTimezone(when);
+	ZoneId tz = new MockSystemReader().getTimeZoneAt(when);
 
 	PersonIdent author = new PersonIdent("J. Author", "ja@example.com");
 	{
@@ -342,9 +344,7 @@ public void testTimeAltersId() throws Exception {
 
 	/** Increment the {@link #author} and {@link #committer} times. */
 	protected void tick() {
-		final long delta = TimeUnit.MILLISECONDS.convert(5 * 60,
-				TimeUnit.SECONDS);
-		final long now = author.getWhen().getTime() + delta;
+		Instant now = author.getWhenAsInstant().plus(Duration.ofMinutes(5));
 
 		author = new PersonIdent(author, now, tz);
 		committer = new PersonIdent(committer, now, tz);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java
index e517889..6d23db8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java
@@ -107,6 +107,21 @@ public void testParsePersonIdent_malformedCases() {
 		assertPersonIdent("Me <me@example.com 1234567890 -0700", null);
 	}
 
+	@Test
+	public void testParsePersonIdent_badTz() {
+		PersonIdent tooBig = RawParseUtils
+				.parsePersonIdent("Me <me@example.com> 1234567890 +8315");
+		assertEquals(tooBig.getZoneOffset().getTotalSeconds(), 0);
+
+		PersonIdent tooSmall = RawParseUtils
+				.parsePersonIdent("Me <me@example.com> 1234567890 -8315");
+		assertEquals(tooSmall.getZoneOffset().getTotalSeconds(), 0);
+
+		PersonIdent notATime = RawParseUtils
+				.parsePersonIdent("Me <me@example.com> 1234567890 -0370");
+		assertEquals(notATime.getZoneOffset().getTotalSeconds(), 0);
+	}
+
 	private static void assertPersonIdent(String line, PersonIdent expected) {
 		PersonIdent actual = RawParseUtils.parsePersonIdent(line);
 		assertEquals(expected, actual);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RelativeDateFormatterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RelativeDateFormatterTest.java
index 214bbca..a927d8d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RelativeDateFormatterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RelativeDateFormatterTest.java
@@ -16,7 +16,7 @@
 import static org.eclipse.jgit.util.RelativeDateFormatter.YEAR_IN_MILLIS;
 import static org.junit.Assert.assertEquals;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.eclipse.jgit.junit.MockSystemReader;
 import org.junit.After;
@@ -37,9 +37,9 @@ public void tearDown() {
 
 	private static void assertFormat(long ageFromNow, long timeUnit,
 			String expectedFormat) {
-		Date d = new Date(SystemReader.getInstance().getCurrentTime()
-				- ageFromNow * timeUnit);
-		String s = RelativeDateFormatter.format(d);
+		long millis = ageFromNow * timeUnit;
+		Instant aTime = SystemReader.getInstance().now().minusMillis(millis);
+		String s = RelativeDateFormatter.format(aTime);
 		assertEquals(expectedFormat, s);
 	}
 
diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
index 68fd8e3..423d22b 100644
--- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
@@ -4,14 +4,14 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ui
 Bundle-SymbolicName: org.eclipse.jgit.ui
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-17
-Export-Package: org.eclipse.jgit.awtui;version="7.1.1"
-Import-Package: org.eclipse.jgit.errors;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.lib;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.nls;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revplot;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.revwalk;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.transport;version="[7.1.1,7.2.0)",
- org.eclipse.jgit.util;version="[7.1.1,7.2.0)"
+Export-Package: org.eclipse.jgit.awtui;version="7.2.0"
+Import-Package: org.eclipse.jgit.errors;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.lib;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.nls;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revplot;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.revwalk;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.transport;version="[7.2.0,7.3.0)",
+ org.eclipse.jgit.util;version="[7.2.0,7.3.0)"
diff --git a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
index 33c83b4..12363f80 100644
--- a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ui - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ui.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ui;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ui;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml
index 02bc6fe..ada06ed 100644
--- a/org.eclipse.jgit.ui/pom.xml
+++ b/org.eclipse.jgit.ui/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ui</artifactId>
diff --git a/org.eclipse.jgit/.settings/.api_filters b/org.eclipse.jgit/.settings/.api_filters
index 1408a9d..61d6658 100644
--- a/org.eclipse.jgit/.settings/.api_filters
+++ b/org.eclipse.jgit/.settings/.api_filters
@@ -1,74 +1,16 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <component id="org.eclipse.jgit" version="2">
-    <resource path="src/org/eclipse/jgit/diff/DiffDriver.java" type="org.eclipse.jgit.diff.DiffDriver">
-        <filter id="1109393411">
+    <resource path="src/org/eclipse/jgit/lib/RefDatabase.java" type="org.eclipse.jgit.lib.RefDatabase">
+        <filter id="336695337">
             <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="org.eclipse.jgit.diff.DiffDriver"/>
+                <message_argument value="org.eclipse.jgit.lib.RefDatabase"/>
+                <message_argument value="getReflogReader(Ref)"/>
             </message_arguments>
         </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/diff/DiffFormatter.java" type="org.eclipse.jgit.diff.DiffFormatter">
-        <filter id="1142947843">
+        <filter id="336695337">
             <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="format(EditList, RawText, RawText, DiffDriver)"/>
-            </message_arguments>
-        </filter>
-        <filter id="1142947843">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="format(FileHeader, RawText, RawText, DiffDriver)"/>
-            </message_arguments>
-        </filter>
-        <filter id="1142947843">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="writeHunkHeader(int, int, int, int, String)"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/lib/Constants.java" type="org.eclipse.jgit.lib.Constants">
-        <filter id="1142947843">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="ATTR_BUILTIN_UNION_MERGE_DRIVER"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/merge/ContentMergeStrategy.java" type="org.eclipse.jgit.merge.ContentMergeStrategy">
-        <filter id="1176502275">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="UNION"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/merge/ResolveMerger.java" type="org.eclipse.jgit.merge.ResolveMerger">
-        <filter id="336658481">
-            <message_arguments>
-                <message_argument value="org.eclipse.jgit.merge.ResolveMerger"/>
-                <message_argument value="attributesNodeProvider"/>
-            </message_arguments>
-        </filter>
-        <filter id="1142947843">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="attributesNodeProvider"/>
-            </message_arguments>
-        </filter>
-        <filter id="1142947843">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="setAttributesNodeProvider(AttributesNodeProvider)"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/transport/UploadPack.java" type="org.eclipse.jgit.transport.UploadPack$RequestPolicy">
-        <filter id="1176502275">
-            <message_arguments>
-                <message_argument value="6.10.1"/>
-                <message_argument value="implies(UploadPack.RequestPolicy)"/>
+                <message_argument value="org.eclipse.jgit.lib.RefDatabase"/>
+                <message_argument value="getReflogReader(String)"/>
             </message_arguments>
         </filter>
     </resource>
diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF
index 3c864fd..659ad85 100644
--- a/org.eclipse.jgit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/MANIFEST.MF
@@ -3,14 +3,14 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit
 Bundle-SymbolicName: org.eclipse.jgit
-Bundle-Version: 7.1.1.qualifier
+Bundle-Version: 7.2.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
 Service-Component: OSGI-INF/org.eclipse.jgit.internal.util.CleanupService.xml
 Eclipse-ExtensibleAPI: true
-Export-Package: org.eclipse.jgit.annotations;version="7.1.1",
- org.eclipse.jgit.api;version="7.1.1";
+Export-Package: org.eclipse.jgit.annotations;version="7.2.0",
+ org.eclipse.jgit.api;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.notes,
    org.eclipse.jgit.dircache,
@@ -25,18 +25,18 @@
    org.eclipse.jgit.revwalk.filter,
    org.eclipse.jgit.blame,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.api.errors;version="7.1.1";
+ org.eclipse.jgit.api.errors;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.errors",
- org.eclipse.jgit.attributes;version="7.1.1";
+ org.eclipse.jgit.attributes;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.blame;version="7.1.1";
+ org.eclipse.jgit.blame;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.diff",
- org.eclipse.jgit.diff;version="7.1.1";
+ org.eclipse.jgit.diff;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.revwalk,
@@ -44,53 +44,53 @@
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.dircache;version="7.1.1";
+ org.eclipse.jgit.dircache;version="7.2.0";
   uses:="org.eclipse.jgit.events,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.errors;version="7.1.1";
+ org.eclipse.jgit.errors;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.internal.storage.pack",
- org.eclipse.jgit.events;version="7.1.1";
+ org.eclipse.jgit.events;version="7.2.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.fnmatch;version="7.1.1",
- org.eclipse.jgit.gitrepo;version="7.1.1";
+ org.eclipse.jgit.fnmatch;version="7.2.0",
+ org.eclipse.jgit.gitrepo;version="7.2.0";
   uses:="org.xml.sax.helpers,
    org.eclipse.jgit.api,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.xml.sax",
- org.eclipse.jgit.gitrepo.internal;version="7.1.1";x-internal:=true,
- org.eclipse.jgit.hooks;version="7.1.1";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.ignore;version="7.1.1",
- org.eclipse.jgit.ignore.internal;version="7.1.1";
+ org.eclipse.jgit.gitrepo.internal;version="7.2.0";x-internal:=true,
+ org.eclipse.jgit.hooks;version="7.2.0";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.ignore;version="7.2.0",
+ org.eclipse.jgit.ignore.internal;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal;version="7.1.1";
+ org.eclipse.jgit.internal;version="7.2.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.http.test",
- org.eclipse.jgit.internal.diff;version="7.1.1";
+ org.eclipse.jgit.internal.diff;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.diffmergetool;version="7.1.1";
+ org.eclipse.jgit.internal.diffmergetool;version="7.2.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.pgm,
    org.eclipse.egit.ui",
- org.eclipse.jgit.internal.fsck;version="7.1.1";
+ org.eclipse.jgit.internal.fsck;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.revwalk;version="7.1.1";
+ org.eclipse.jgit.internal.revwalk;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.commitgraph;version="7.1.1";
+ org.eclipse.jgit.internal.storage.commitgraph;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.dfs;version="7.1.1";
+ org.eclipse.jgit.internal.storage.dfs;version="7.2.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.http.server,
    org.eclipse.jgit.http.test,
    org.eclipse.jgit.lfs.test",
- org.eclipse.jgit.internal.storage.file;version="7.1.1";
+ org.eclipse.jgit.internal.storage.file;version="7.2.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.junit,
    org.eclipse.jgit.junit.http,
@@ -99,36 +99,36 @@
    org.eclipse.jgit.pgm,
    org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.ssh.apache",
- org.eclipse.jgit.internal.storage.io;version="7.1.1";
+ org.eclipse.jgit.internal.storage.io;version="7.2.0";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.memory;version="7.1.1";
+ org.eclipse.jgit.internal.storage.memory;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.pack;version="7.1.1";
+ org.eclipse.jgit.internal.storage.pack;version="7.2.0";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.reftable;version="7.1.1";
+ org.eclipse.jgit.internal.storage.reftable;version="7.2.0";
   x-friends:="org.eclipse.jgit.http.test,
    org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.submodule;version="7.1.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.connectivity;version="7.1.1";
+ org.eclipse.jgit.internal.submodule;version="7.2.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.connectivity;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.http;version="7.1.1";
+ org.eclipse.jgit.internal.transport.http;version="7.2.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.parser;version="7.1.1";
+ org.eclipse.jgit.internal.transport.parser;version="7.2.0";
   x-friends:="org.eclipse.jgit.http.server,
    org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.ssh;version="7.1.1";
+ org.eclipse.jgit.internal.transport.ssh;version="7.2.0";
   x-friends:="org.eclipse.jgit.ssh.apache,
    org.eclipse.jgit.ssh.jsch,
    org.eclipse.jgit.test",
- org.eclipse.jgit.internal.util;version="7.1.1";
+ org.eclipse.jgit.internal.util;version="7.2.0";
   x-friends:=" org.eclipse.jgit.junit",
- org.eclipse.jgit.lib;version="7.1.1";
+ org.eclipse.jgit.lib;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util.sha1,
    org.eclipse.jgit.dircache,
@@ -142,12 +142,12 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.submodule,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.lib.internal;version="7.1.1";
+ org.eclipse.jgit.lib.internal;version="7.2.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.pgm,
    org.eclipse.egit.ui",
- org.eclipse.jgit.logging;version="7.1.1",
- org.eclipse.jgit.merge;version="7.1.1";
+ org.eclipse.jgit.logging;version="7.2.0",
+ org.eclipse.jgit.merge;version="7.2.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -156,40 +156,40 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.api,
    org.eclipse.jgit.attributes",
- org.eclipse.jgit.nls;version="7.1.1",
- org.eclipse.jgit.notes;version="7.1.1";
+ org.eclipse.jgit.nls;version="7.2.0",
+ org.eclipse.jgit.notes;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.patch;version="7.1.1";
+ org.eclipse.jgit.patch;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.diff",
- org.eclipse.jgit.revplot;version="7.1.1";
+ org.eclipse.jgit.revplot;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk",
- org.eclipse.jgit.revwalk;version="7.1.1";
+ org.eclipse.jgit.revwalk;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.revwalk.filter,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.revwalk.filter;version="7.1.1";
+ org.eclipse.jgit.revwalk.filter;version="7.2.0";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.storage.file;version="7.1.1";
+ org.eclipse.jgit.storage.file;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.storage.pack;version="7.1.1";
+ org.eclipse.jgit.storage.pack;version="7.2.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.submodule;version="7.1.1";
+ org.eclipse.jgit.submodule;version="7.2.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.transport;version="7.1.1";
+ org.eclipse.jgit.transport;version="7.2.0";
   uses:="javax.crypto,
    org.eclipse.jgit.util.io,
    org.eclipse.jgit.lib,
@@ -202,21 +202,21 @@
    org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.storage.pack,
    org.eclipse.jgit.errors",
- org.eclipse.jgit.transport.http;version="7.1.1";
+ org.eclipse.jgit.transport.http;version="7.2.0";
   uses:="javax.net.ssl",
- org.eclipse.jgit.transport.resolver;version="7.1.1";
+ org.eclipse.jgit.transport.resolver;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.lib",
- org.eclipse.jgit.treewalk;version="7.1.1";
+ org.eclipse.jgit.treewalk;version="7.2.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.util",
- org.eclipse.jgit.treewalk.filter;version="7.1.1";
+ org.eclipse.jgit.treewalk.filter;version="7.2.0";
   uses:="org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util;version="7.1.1";
+ org.eclipse.jgit.util;version="7.2.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.hooks,
    org.eclipse.jgit.revwalk,
@@ -229,12 +229,12 @@
    org.eclipse.jgit.treewalk,
    javax.net.ssl,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.util.io;version="7.1.1";
+ org.eclipse.jgit.util.io;version="7.2.0";
   uses:="org.eclipse.jgit.attributes,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util.sha1;version="7.1.1",
- org.eclipse.jgit.util.time;version="7.1.1"
+ org.eclipse.jgit.util.sha1;version="7.2.0",
+ org.eclipse.jgit.util.time;version="7.2.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
  javax.crypto,
diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
index df2e804..0f9ec1f 100644
--- a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit - Sources
 Bundle-SymbolicName: org.eclipse.jgit.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.1.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit;version="7.1.1.qualifier";roots="."
+Bundle-Version: 7.2.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit;version="7.2.0.qualifier";roots="."
diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml
index 1805206..df7ae83 100644
--- a/org.eclipse.jgit/pom.xml
+++ b/org.eclipse.jgit/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>7.1.1-SNAPSHOT</version>
+    <version>7.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit</artifactId>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
index 3e034f1..4a536b9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
@@ -67,6 +67,8 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
 
 	private boolean bare;
 
+	private boolean relativePaths;
+
 	private FS fs;
 
 	private String remote = Constants.DEFAULT_REMOTE_NAME;
@@ -264,6 +266,7 @@ void verifyDirectories(URIish u) {
 	private Repository init() throws GitAPIException {
 		InitCommand command = Git.init();
 		command.setBare(bare);
+		command.setRelativeDirs(relativePaths);
 		if (fs != null) {
 			command.setFs(fs);
 		}
@@ -555,6 +558,20 @@ public CloneCommand setBare(boolean bare) throws IllegalStateException {
 	}
 
 	/**
+	 * Set whether the cloned repository shall use relative paths for GIT_DIR
+	 * and GIT_WORK_TREE
+	 *
+	 * @param relativePaths
+	 *            if true, use relative paths for GIT_DIR and GIT_WORK_TREE
+	 * @return this instance
+	 * @since 7.2
+	 */
+	public CloneCommand setRelativePaths(boolean relativePaths) {
+		this.relativePaths = relativePaths;
+		return this;
+	}
+
+	/**
 	 * Set the file system abstraction to be used for repositories created by
 	 * this command.
 	 *
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
index 805a886..9342457 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
@@ -15,11 +15,11 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -274,10 +274,10 @@ public int compare(Ref o1, Ref o2) {
 			}
 		}
 
-		private Date tagDate(Ref tag) throws IOException {
+		private Instant tagDate(Ref tag) throws IOException {
 			RevTag t = w.parseTag(tag.getObjectId());
 			w.parseBody(t);
-			return t.getTaggerIdent().getWhen();
+			return t.getTaggerIdent().getWhenAsInstant();
 		}
 	};
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
index 88d7e91..f6935e1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
@@ -12,6 +12,7 @@
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.text.ParseException;
+import java.time.Instant;
 import java.util.Date;
 import java.util.Properties;
 import java.util.concurrent.ExecutionException;
@@ -59,7 +60,7 @@ public class GarbageCollectCommand extends GitCommand<Properties> {
 
 	private ProgressMonitor monitor;
 
-	private Date expire;
+	private Instant expire;
 
 	private PackConfig pconfig;
 
@@ -98,8 +99,29 @@ public GarbageCollectCommand setProgressMonitor(ProgressMonitor monitor) {
 	 * @param expire
 	 *            minimal age of objects to be pruned.
 	 * @return this instance
+	 * @deprecated use {@link #setExpire(Instant)} instead
 	 */
+	@Deprecated(since = "7.2")
 	public GarbageCollectCommand setExpire(Date expire) {
+		if (expire != null) {
+			this.expire = expire.toInstant();
+		}
+		return this;
+	}
+
+	/**
+	 * During gc() or prune() each unreferenced, loose object which has been
+	 * created or modified after <code>expire</code> will not be pruned. Only
+	 * older objects may be pruned. If set to null then every object is a
+	 * candidate for pruning. Use {@link org.eclipse.jgit.util.GitTimeParser} to
+	 * parse time formats used by git gc.
+	 *
+	 * @param expire
+	 *            minimal age of objects to be pruned.
+	 * @return this instance
+	 * @since 7.2
+	 */
+	public GarbageCollectCommand setExpire(Instant expire) {
 		this.expire = expire;
 		return this;
 	}
@@ -108,8 +130,8 @@ public GarbageCollectCommand setExpire(Date expire) {
 	 * Whether to use aggressive mode or not. If set to true JGit behaves more
 	 * similar to native git's "git gc --aggressive". If set to
 	 * <code>true</code> compressed objects found in old packs are not reused
-	 * but every object is compressed again. Configuration variables
-	 * pack.window and pack.depth are set to 250 for this GC.
+	 * but every object is compressed again. Configuration variables pack.window
+	 * and pack.depth are set to 250 for this GC.
 	 *
 	 * @since 3.6
 	 * @param aggressive
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java
index 240290f..1da71aa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java
@@ -19,6 +19,7 @@
 import org.eclipse.jgit.api.errors.JGitInternalException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
@@ -44,6 +45,8 @@ public class InitCommand implements Callable<Git> {
 
 	private String initialBranch;
 
+	private boolean relativePaths;
+
 	/**
 	 * {@inheritDoc}
 	 * <p>
@@ -100,7 +103,11 @@ public Git call() throws GitAPIException {
 					: initialBranch);
 			Repository repository = builder.build();
 			if (!repository.getObjectDatabase().exists())
-				repository.create(bare);
+				if (repository instanceof FileRepository) {
+					((FileRepository) repository).create(bare, relativePaths);
+				} else {
+					repository.create(bare);
+				}
 			return new Git(repository, true);
 		} catch (IOException | ConfigInvalidException e) {
 			throw new JGitInternalException(e.getMessage(), e);
@@ -214,4 +221,18 @@ public InitCommand setInitialBranch(String branch)
 		this.initialBranch = branch;
 		return this;
 	}
+
+	/**
+	 * * Set whether the repository shall use relative paths for GIT_DIR and
+	 * GIT_WORK_TREE
+	 *
+	 * @param relativePaths
+	 *            if true, use relative paths for GIT_DIR and GIT_WORK_TREE
+	 * @return {@code this}
+	 * @since 7.2
+	 */
+	public InitCommand setRelativeDirs(boolean relativePaths) {
+		this.relativePaths = relativePaths;
+		return this;
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
index 858bd96..3ae7a6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -18,6 +18,8 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -1835,23 +1837,26 @@ PersonIdent parseAuthor(byte[] raw) {
 
 		// the time is saved as <seconds since 1970> <timezone offset>
 		int timeStart = 0;
-		if (time.startsWith("@")) //$NON-NLS-1$
+		if (time.startsWith("@")) { //$NON-NLS-1$
 			timeStart = 1;
-		else
+		} else {
 			timeStart = 0;
-		long when = Long
-				.parseLong(time.substring(timeStart, time.indexOf(' '))) * 1000;
+		}
+		Instant when = Instant.ofEpochSecond(
+				Long.parseLong(time.substring(timeStart, time.indexOf(' '))));
 		String tzOffsetString = time.substring(time.indexOf(' ') + 1);
 		int multiplier = -1;
-		if (tzOffsetString.charAt(0) == '+')
+		if (tzOffsetString.charAt(0) == '+') {
 			multiplier = 1;
+		}
 		int hours = Integer.parseInt(tzOffsetString.substring(1, 3));
 		int minutes = Integer.parseInt(tzOffsetString.substring(3, 5));
 		// this is in format (+/-)HHMM (hours and minutes)
-		// we need to convert into minutes
-		int tz = (hours * 60 + minutes) * multiplier;
-		if (name != null && email != null)
+		ZoneOffset tz = ZoneOffset.ofHoursMinutes(hours * multiplier,
+				minutes * multiplier);
+		if (name != null && email != null) {
 			return new PersonIdent(name, email, when, tz);
+		}
 		return null;
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java
index dead274..a149649 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java
@@ -68,7 +68,7 @@ public Collection<ReflogEntry> call() throws GitAPIException,
 		checkCallable();
 
 		try {
-			ReflogReader reader = repo.getReflogReader(ref);
+			ReflogReader reader = repo.getRefDatabase().getReflogReader(ref);
 			if (reader == null)
 				throw new RefNotFoundException(MessageFormat.format(
 						JGitText.get().refNotResolved, ref));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
index 855c3b1..6643c83 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com> and others
+ * Copyright (C) 2010, 2024 Christian Halstrick <christian.halstrick@sap.com> and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -143,8 +143,8 @@ public RevCommit call() throws NoMessageException, UnmergedPathsException,
 				merger.setCommitNames(new String[] {
 						"BASE", ourName, revertName }); //$NON-NLS-1$
 
-				String shortMessage = "Revert \"" + srcCommit.getShortMessage() //$NON-NLS-1$
-						+ "\""; //$NON-NLS-1$
+				String shortMessage = "Revert \"" //$NON-NLS-1$
+						+ srcCommit.getFirstMessageLine() + '"';
 				String newMessage = shortMessage + "\n\n" //$NON-NLS-1$
 						+ "This reverts commit " + srcCommit.getId().getName() //$NON-NLS-1$
 						+ ".\n"; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java
index 23fbe01..2dba0ef 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java
@@ -165,7 +165,8 @@ public ObjectId call() throws GitAPIException {
 
 		List<ReflogEntry> entries;
 		try {
-			ReflogReader reader = repo.getReflogReader(R_STASH);
+			ReflogReader reader = repo.getRefDatabase()
+					.getReflogReader(R_STASH);
 			if (reader == null) {
 				throw new RefNotFoundException(MessageFormat
 						.format(JGitText.get().refNotResolved, stashRef));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
index 401f069..5105dfc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
@@ -176,8 +176,9 @@ public Repository call() throws GitAPIException {
 		CloneCommand clone = Git.cloneRepository();
 		configure(clone);
 		clone.setDirectory(moduleDirectory);
-		clone.setGitDir(new File(new File(repo.getCommonDirectory(),
-				Constants.MODULES), path));
+		clone.setGitDir(new File(
+				new File(repo.getCommonDirectory(), Constants.MODULES), path));
+		clone.setRelativePaths(true);
 		clone.setURI(resolvedUri);
 		if (monitor != null)
 			clone.setProgressMonitor(monitor);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java
index 751dabc..5e4b2ee 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java
@@ -28,6 +28,7 @@
 import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
 import org.eclipse.jgit.dircache.DirCacheCheckout;
 import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.file.LockFile;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
@@ -39,6 +40,7 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.submodule.SubmoduleWalk;
 import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
+import org.eclipse.jgit.util.FileUtils;
 
 /**
  * A class used to execute a submodule update command.
@@ -62,6 +64,8 @@ public class SubmoduleUpdateCommand extends
 
 	private boolean fetch = false;
 
+	private boolean clonedRestored;
+
 	/**
 	 * <p>
 	 * Constructor for SubmoduleUpdateCommand.
@@ -116,25 +120,77 @@ public SubmoduleUpdateCommand addPath(String path) {
 		return this;
 	}
 
+	private static boolean submoduleExists(File gitDir) {
+		if (gitDir != null && gitDir.isDirectory()) {
+			File[] files = gitDir.listFiles();
+			return files != null && files.length != 0;
+		}
+		return false;
+	}
+
+	private static void restoreSubmodule(File gitDir, File workingTree)
+			throws IOException {
+		LockFile dotGitLock = new LockFile(
+				new File(workingTree, Constants.DOT_GIT));
+		if (dotGitLock.lock()) {
+			String content = Constants.GITDIR
+					+ getRelativePath(gitDir, workingTree);
+			dotGitLock.write(Constants.encode(content));
+			dotGitLock.commit();
+		}
+	}
+
+	private static String getRelativePath(File gitDir, File workingTree) {
+		File relPath;
+		try {
+			relPath = workingTree.toPath().relativize(gitDir.toPath())
+					.toFile();
+		} catch (IllegalArgumentException e) {
+			relPath = gitDir;
+		}
+		return FileUtils.pathToString(relPath);
+	}
+
+	private String determineUpdateMode(String mode) {
+		if (clonedRestored) {
+			return ConfigConstants.CONFIG_KEY_CHECKOUT;
+		}
+		return mode;
+	}
+
 	private Repository getOrCloneSubmodule(SubmoduleWalk generator, String url)
 			throws IOException, GitAPIException {
 		Repository repository = generator.getRepository();
+		boolean restored = false;
+		boolean cloned = false;
 		if (repository == null) {
-			if (callback != null) {
-				callback.cloningSubmodule(generator.getPath());
+			File gitDir = new File(
+					new File(repo.getCommonDirectory(), Constants.MODULES),
+					generator.getPath());
+			if (submoduleExists(gitDir)) {
+				restoreSubmodule(gitDir, generator.getDirectory());
+				restored = true;
+				clonedRestored = true;
+				repository = generator.getRepository();
+			} else {
+				if (callback != null) {
+					callback.cloningSubmodule(generator.getPath());
+				}
+				CloneCommand clone = Git.cloneRepository();
+				configure(clone);
+				clone.setURI(url);
+				clone.setDirectory(generator.getDirectory());
+				clone.setGitDir(gitDir);
+				clone.setRelativePaths(true);
+				if (monitor != null) {
+					clone.setProgressMonitor(monitor);
+				}
+				repository = clone.call().getRepository();
+				cloned = true;
+				clonedRestored = true;
 			}
-			CloneCommand clone = Git.cloneRepository();
-			configure(clone);
-			clone.setURI(url);
-			clone.setDirectory(generator.getDirectory());
-			clone.setGitDir(
-					new File(new File(repo.getCommonDirectory(), Constants.MODULES),
-							generator.getPath()));
-			if (monitor != null) {
-				clone.setProgressMonitor(monitor);
-			}
-			repository = clone.call().getRepository();
-		} else if (this.fetch) {
+		}
+		if ((this.fetch || restored) && !cloned) {
 			if (fetchCallback != null) {
 				fetchCallback.fetchingSubmodule(generator.getPath());
 			}
@@ -171,15 +227,17 @@ public Collection<String> call() throws InvalidConfigurationException,
 					continue;
 				// Skip submodules not registered in parent repository's config
 				String url = generator.getConfigUrl();
-				if (url == null)
+				if (url == null) {
 					continue;
-
+				}
+				clonedRestored = false;
 				try (Repository submoduleRepo = getOrCloneSubmodule(generator,
 						url); RevWalk walk = new RevWalk(submoduleRepo)) {
 					RevCommit commit = walk
 							.parseCommit(generator.getObjectId());
 
-					String update = generator.getConfigUpdate();
+					String update = determineUpdateMode(
+							generator.getConfigUpdate());
 					if (ConfigConstants.CONFIG_KEY_MERGE.equals(update)) {
 						MergeCommand merge = new MergeCommand(submoduleRepo);
 						merge.include(commit);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
index 6375a60..cbac3f9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
@@ -1334,7 +1334,7 @@ private String getFuncName(RawText text, int startAt,
 					continue;
 				}
 				if (matchesAny(diffDriver.getMatchPatterns(), line)) {
-					String funcName = line.replaceAll("^[ \\t]+", "");
+					String funcName = line.replaceAll("^[ \\t]+", ""); //$NON-NLS-1$//$NON-NLS-2$
 					return funcName.substring(0,
 							Math.min(funcName.length(), 80)).trim();
 				}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java
index e6068a1..199481c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java
@@ -90,7 +90,7 @@ public class DfsGarbageCollector {
 	private long coalesceGarbageLimit = 50 << 20;
 	private long garbageTtlMillis = TimeUnit.DAYS.toMillis(1);
 
-	private long startTimeMillis;
+	private Instant startTime;
 	private List<DfsPackFile> packsBefore;
 	private List<DfsReftable> reftablesBefore;
 	private List<DfsPackFile> expiredGarbagePacks;
@@ -352,7 +352,7 @@ public boolean pack(ProgressMonitor pm) throws IOException {
 			throw new IllegalStateException(
 					JGitText.get().supportOnlyPackIndexVersion2);
 
-		startTimeMillis = SystemReader.getInstance().getCurrentTime();
+		startTime = SystemReader.getInstance().now();
 		ctx = objdb.newReader();
 		try {
 			refdb.refresh();
@@ -435,7 +435,7 @@ private void readPacksBefore() throws IOException {
 		packsBefore = new ArrayList<>(packs.length);
 		expiredGarbagePacks = new ArrayList<>(packs.length);
 
-		long now = SystemReader.getInstance().getCurrentTime();
+		long now = SystemReader.getInstance().now().toEpochMilli();
 		for (DfsPackFile p : packs) {
 			DfsPackDescription d = p.getPackDescription();
 			if (d.getPackSource() != UNREACHABLE_GARBAGE) {
@@ -723,7 +723,7 @@ private DfsPackDescription writePack(PackSource source, PackWriter pw,
 
 		PackStatistics stats = pw.getStatistics();
 		pack.setPackStats(stats);
-		pack.setLastModified(startTimeMillis);
+		pack.setLastModified(startTime.toEpochMilli());
 		newPackDesc.add(pack);
 		newPackStats.add(stats);
 		newPackObj.add(pw.getObjectSet());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
index 3ba74b2..2751cd2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
@@ -28,6 +28,7 @@
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.transport.ReceiveCommand;
 import org.eclipse.jgit.util.RefList;
@@ -177,6 +178,11 @@ public List<Ref> getRefsByPrefixWithExclusions(String include, Set<String> exclu
 	}
 
 	@Override
+	public ReflogReader getReflogReader(Ref ref) throws IOException {
+		return reftableDatabase.getReflogReader(ref.getName());
+	}
+
+	@Override
 	public Set<Ref> getTipsWithSha1(ObjectId id) throws IOException {
 		if (!getReftableConfig().isIndexObjects()) {
 			return super.getTipsWithSha1(id);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java
index 25b7583..6040ad5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java
@@ -90,7 +90,13 @@ public MergedReftable openMergedReftable() throws IOException {
 		};
 	}
 
-	ReflogReader getReflogReader(String refname) throws IOException {
+	@Override
+	public ReflogReader getReflogReader(Ref ref) throws IOException {
+		return reftableDatabase.getReflogReader(ref.getName());
+	}
+
+	@Override
+	public ReflogReader getReflogReader(String refname) throws IOException {
 		return reftableDatabase.getReflogReader(refname);
 	}
 
@@ -557,9 +563,10 @@ private static void writeConvertTable(Repository repo, ReftableWriter w,
 			boolean writeLogs) throws IOException {
 		int size = 0;
 		List<Ref> refs = repo.getRefDatabase().getRefs();
+		RefDatabase refDb = repo.getRefDatabase();
 		if (writeLogs) {
 			for (Ref r : refs) {
-				ReflogReader rlr = repo.getReflogReader(r.getName());
+				ReflogReader rlr = refDb.getReflogReader(r);
 				if (rlr != null) {
 					size = Math.max(rlr.getReverseEntries().size(), size);
 				}
@@ -582,10 +589,7 @@ private static void writeConvertTable(Repository repo, ReftableWriter w,
 		if (writeLogs) {
 			for (Ref r : refs) {
 				long idx = size;
-				ReflogReader reader = repo.getReflogReader(r.getName());
-				if (reader == null) {
-					continue;
-				}
+				ReflogReader reader = refDb.getReflogReader(r);
 				for (ReflogEntry e : reader.getReverseEntries()) {
 					w.writeLog(r.getName(), idx, e.getWho(), e.getOldId(),
 							e.getNewId(), e.getComment());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
index 84c8565..bcf9f1e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
@@ -2,7 +2,7 @@
  * Copyright (C) 2007, Dave Watson <dwatson@mimvista.com>
  * Copyright (C) 2008-2010, Google Inc.
  * Copyright (C) 2006-2010, Robin Rosenberg <robin.rosenberg@dewire.com>
- * Copyright (C) 2006-2008, Shawn O. Pearce <spearce@spearce.org> and others
+ * Copyright (C) 2006-2024, Shawn O. Pearce <spearce@spearce.org> and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -31,7 +31,6 @@
 import java.util.Objects;
 import java.util.Set;
 
-import org.eclipse.jgit.annotations.NonNull;
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -215,6 +214,16 @@ private void loadRepoConfig() throws IOException {
 		}
 	}
 
+	private String getRelativeDir(File base, File other) {
+		File relPath;
+		try {
+			relPath = base.toPath().relativize(other.toPath()).toFile();
+		} catch (IllegalArgumentException e) {
+			relPath = other;
+		}
+		return FileUtils.pathToString(relPath);
+	}
+
 	/**
 	 * {@inheritDoc}
 	 * <p>
@@ -223,6 +232,22 @@ private void loadRepoConfig() throws IOException {
 	 */
 	@Override
 	public void create(boolean bare) throws IOException {
+		create(bare, false);
+	}
+
+	/**
+	 * Create a new Git repository initializing the necessary files and
+	 * directories.
+	 *
+	 * @param bare
+	 *            if true, a bare repository (a repository without a working
+	 *            directory) is created.
+	 * @param relativePaths
+	 *            if true, relative paths are used for GIT_DIR and GIT_WORK_TREE
+	 * @throws IOException
+	 *             in case of IO problem
+	 */
+	public void create(boolean bare, boolean relativePaths) throws IOException {
 		final FileBasedConfig cfg = getConfig();
 		if (cfg.getFile().exists()) {
 			throw new IllegalStateException(MessageFormat.format(
@@ -293,15 +318,25 @@ && getDirectory().getName().startsWith(".")) //$NON-NLS-1$
 		if (!bare) {
 			File workTree = getWorkTree();
 			if (!getDirectory().getParentFile().equals(workTree)) {
+				String workTreePath;
+				String gitDirPath;
+				if (relativePaths) {
+					File canonGitDir = getDirectory().getCanonicalFile();
+					File canonWorkTree = getWorkTree().getCanonicalFile();
+					workTreePath = getRelativeDir(canonGitDir, canonWorkTree);
+					gitDirPath = getRelativeDir(canonWorkTree, canonGitDir);
+				} else {
+					workTreePath = getWorkTree().getAbsolutePath();
+					gitDirPath = getDirectory().getAbsolutePath();
+				}
 				cfg.setString(ConfigConstants.CONFIG_CORE_SECTION, null,
-						ConfigConstants.CONFIG_KEY_WORKTREE, getWorkTree()
-								.getAbsolutePath());
+						ConfigConstants.CONFIG_KEY_WORKTREE, workTreePath);
 				LockFile dotGitLockFile = new LockFile(new File(workTree,
 						Constants.DOT_GIT));
 				try {
 					if (dotGitLockFile.lock()) {
 						dotGitLockFile.write(Constants.encode(Constants.GITDIR
-								+ getDirectory().getAbsolutePath()));
+								+ gitDirPath));
 						dotGitLockFile.commit();
 					}
 				} finally {
@@ -507,29 +542,6 @@ public void notifyIndexChanged(boolean internal) {
 	}
 
 	@Override
-	public ReflogReader getReflogReader(String refName) throws IOException {
-		if (refs instanceof FileReftableDatabase) {
-			// Cannot use findRef: reftable stores log data for deleted or renamed
-			// branches.
-			return ((FileReftableDatabase)refs).getReflogReader(refName);
-		}
-
-		// TODO: use exactRef here, which offers more predictable and therefore preferable
-		// behavior.
-		Ref ref = findRef(refName);
-		if (ref == null) {
-			return null;
-		}
-		return new ReflogReaderImpl(this, ref.getName());
-	}
-
-	@Override
-	public @NonNull ReflogReader getReflogReader(@NonNull Ref ref)
-			throws IOException {
-		return new ReflogReaderImpl(this, ref.getName());
-	}
-
-	@Override
 	public AttributesNodeProvider createAttributesNodeProvider() {
 		return new AttributesNodeProviderImpl(this);
 	}
@@ -661,8 +673,8 @@ void convertToPackedRefs(boolean writeLogs, boolean backup) throws IOException {
 			}
 
 			if (writeLogs) {
-				List<ReflogEntry> logs = oldDb.getReflogReader(r.getName())
-						.getReverseEntries();
+				ReflogReader reflogReader = oldDb.getReflogReader(r);
+				List<ReflogEntry> logs = reflogReader.getReverseEntries();
 				Collections.reverse(logs);
 				for (ReflogEntry e : logs) {
 					logWriter.log(r.getName(), e);
@@ -707,6 +719,8 @@ void convertToPackedRefs(boolean writeLogs, boolean backup) throws IOException {
 		}
 		repoConfig.unset(ConfigConstants.CONFIG_EXTENSIONS_SECTION, null,
 				ConfigConstants.CONFIG_KEY_REF_STORAGE);
+		repoConfig.setLong(ConfigConstants.CONFIG_CORE_SECTION, null,
+				ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION, 0);
 		repoConfig.save();
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java
index b8911f5..b6bde6e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java
@@ -545,7 +545,8 @@ private FileStoreAttributes fileStoreAttributeCache() {
 		return fileStoreAttributeCache;
 	}
 
-	private static BasicFileAttributes getFileAttributes(File path) throws NoSuchElementException {
+	private static BasicFileAttributes getFileAttributes(File path)
+			throws NoSuchElementException {
 		try {
 			try {
 				return FS.DETECTED.fileAttributes(path);
@@ -565,5 +566,5 @@ private static BasicFileAttributes getFileAttributes(File path) throws NoSuchEle
 			LOG.error(e.getMessage(), e);
 		}
 		throw new NoSuchElementException(path.toString());
-  }
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
index 7f33693..15679aa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
@@ -102,9 +102,8 @@
 import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.FS.LockToken;
 import org.eclipse.jgit.util.FileUtils;
-import org.eclipse.jgit.util.GitDateParser;
+import org.eclipse.jgit.util.GitTimeParser;
 import org.eclipse.jgit.util.StringUtils;
-import org.eclipse.jgit.util.SystemReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -160,11 +159,11 @@ public static void setExecutor(ExecutorService e) {
 
 	private long expireAgeMillis = -1;
 
-	private Date expire;
+	private Instant expire;
 
 	private long packExpireAgeMillis = -1;
 
-	private Date packExpire;
+	private Instant packExpire;
 
 	private Boolean packKeptObjects;
 
@@ -698,16 +697,18 @@ private long getExpireDate() throws ParseException {
 
 		if (expire == null && expireAgeMillis == -1) {
 			String pruneExpireStr = getPruneExpireStr();
-			if (pruneExpireStr == null)
+			if (pruneExpireStr == null) {
 				pruneExpireStr = PRUNE_EXPIRE_DEFAULT;
-			expire = GitDateParser.parse(pruneExpireStr, null, SystemReader
-					.getInstance().getLocale());
+			}
+			expire = GitTimeParser.parseInstant(pruneExpireStr);
 			expireAgeMillis = -1;
 		}
-		if (expire != null)
-			expireDate = expire.getTime();
-		if (expireAgeMillis != -1)
+		if (expire != null) {
+			expireDate = expire.toEpochMilli();
+		}
+		if (expireAgeMillis != -1) {
 			expireDate = System.currentTimeMillis() - expireAgeMillis;
+		}
 		return expireDate;
 	}
 
@@ -724,16 +725,18 @@ private long getPackExpireDate() throws ParseException {
 			String prunePackExpireStr = repo.getConfig().getString(
 					ConfigConstants.CONFIG_GC_SECTION, null,
 					ConfigConstants.CONFIG_KEY_PRUNEPACKEXPIRE);
-			if (prunePackExpireStr == null)
+			if (prunePackExpireStr == null) {
 				prunePackExpireStr = PRUNE_PACK_EXPIRE_DEFAULT;
-			packExpire = GitDateParser.parse(prunePackExpireStr, null,
-					SystemReader.getInstance().getLocale());
+			}
+			packExpire = GitTimeParser.parseInstant(prunePackExpireStr);
 			packExpireAgeMillis = -1;
 		}
-		if (packExpire != null)
-			packExpireDate = packExpire.getTime();
-		if (packExpireAgeMillis != -1)
+		if (packExpire != null) {
+			packExpireDate = packExpire.toEpochMilli();
+		}
+		if (packExpireAgeMillis != -1) {
 			packExpireDate = System.currentTimeMillis() - packExpireAgeMillis;
+		}
 		return packExpireDate;
 	}
 
@@ -1154,7 +1157,7 @@ private void deleteTempPacksIdx() {
 	 *             if an IO error occurred
 	 */
 	private Set<ObjectId> listRefLogObjects(Ref ref, long minTime) throws IOException {
-		ReflogReader reflogReader = repo.getReflogReader(ref);
+		ReflogReader reflogReader = repo.getRefDatabase().getReflogReader(ref);
 		List<ReflogEntry> rlEntries = reflogReader
 				.getReverseEntries();
 		if (rlEntries == null || rlEntries.isEmpty())
@@ -1655,12 +1658,31 @@ public void setPackConfig(@NonNull PackConfig pconfig) {
 	 * candidate for pruning.
 	 *
 	 * @param expire
-	 *            instant in time which defines object expiration
-	 *            objects with modification time before this instant are expired
-	 *            objects with modification time newer or equal to this instant
-	 *            are not expired
+	 *            instant in time which defines object expiration objects with
+	 *            modification time before this instant are expired objects with
+	 *            modification time newer or equal to this instant are not
+	 *            expired
+	 * @deprecated use {@link #setExpire(Instant)} instead
 	 */
+	@Deprecated(since = "7.2")
 	public void setExpire(Date expire) {
+		this.expire = expire.toInstant();
+		expireAgeMillis = -1;
+	}
+
+	/**
+	 * During gc() or prune() each unreferenced, loose object which has been
+	 * created or modified after or at <code>expire</code> will not be pruned.
+	 * Only older objects may be pruned. If set to null then every object is a
+	 * candidate for pruning.
+	 *
+	 * @param expire
+	 *            instant in time which defines object expiration objects with
+	 *            modification time before this instant are expired objects with
+	 *            modification time newer or equal to this instant are not
+	 *            expired
+	 */
+	public void setExpire(Instant expire) {
 		this.expire = expire;
 		expireAgeMillis = -1;
 	}
@@ -1673,8 +1695,24 @@ public void setExpire(Date expire) {
 	 *
 	 * @param packExpire
 	 *            instant in time which defines packfile expiration
+	 * @deprecated use {@link #setPackExpire(Instant)} instead
 	 */
+	@Deprecated(since = "7.2")
 	public void setPackExpire(Date packExpire) {
+		this.packExpire = packExpire.toInstant();
+		packExpireAgeMillis = -1;
+	}
+
+	/**
+	 * During gc() or prune() packfiles which are created or modified after or
+	 * at <code>packExpire</code> will not be deleted. Only older packfiles may
+	 * be deleted. If set to null then every packfile is a candidate for
+	 * deletion.
+	 *
+	 * @param packExpire
+	 *            instant in time which defines packfile expiration
+	 */
+	public void setPackExpire(Instant packExpire) {
 		this.packExpire = packExpire;
 		packExpireAgeMillis = -1;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java
index 8647b3e..862aaab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java
@@ -23,8 +23,7 @@
 import org.eclipse.jgit.api.errors.JGitInternalException;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.util.FileUtils;
-import org.eclipse.jgit.util.GitDateParser;
-import org.eclipse.jgit.util.SystemReader;
+import org.eclipse.jgit.util.GitTimeParser;
 
 /**
  * This class manages the gc.log file for a {@link FileRepository}.
@@ -62,8 +61,7 @@ private Instant getLogExpiry() throws ParseException {
 			if (logExpiryStr == null) {
 				logExpiryStr = LOG_EXPIRY_DEFAULT;
 			}
-			gcLogExpire = GitDateParser.parse(logExpiryStr, null,
-					SystemReader.getInstance().getLocale()).toInstant();
+			gcLogExpire = GitTimeParser.parseInstant(logExpiryStr);
 		}
 		return gcLogExpire;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
index 6aa1157..3399651 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
@@ -76,6 +76,7 @@
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.RefWriter;
+import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.SymbolicRef;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -456,6 +457,11 @@ public List<Ref> getAdditionalRefs() throws IOException {
 		return ret;
 	}
 
+	@Override
+	public ReflogReader getReflogReader(Ref ref) throws IOException {
+		return new ReflogReaderImpl(getRepository(), ref.getName());
+	}
+
 	@SuppressWarnings("unchecked")
 	private RefList<Ref> upcast(RefList<? extends Ref> loose) {
 		return (RefList<Ref>) loose;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
index fd80faf..15c125c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
@@ -790,7 +790,9 @@ private void queueRemoveAll(Set<Pack> packs) {
 			}
 			numRemovers++;
 		}
-		for (int numRemoved = 0; removeNextBlock(numRemoved); numRemoved++);
+		for (int numRemoved = 0; removeNextBlock(numRemoved); numRemoved++) {
+			// empty
+		}
 		synchronized (this) {
 			if (numRemovers > 0) {
 				numRemovers--;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java
index dabc1f0..bf87c4c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java
@@ -14,6 +14,7 @@
 import static org.eclipse.jgit.revwalk.RevFlag.SEEN;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -28,16 +29,16 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.revwalk.AddUnseenToBitmapFilter;
 import org.eclipse.jgit.internal.storage.file.BitmapIndexImpl;
+import org.eclipse.jgit.internal.storage.file.BitmapIndexImpl.CompressedBitmap;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndex;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndexBuilder;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndexRemapper;
-import org.eclipse.jgit.internal.storage.file.BitmapIndexImpl.CompressedBitmap;
 import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
 import org.eclipse.jgit.revwalk.BitmapWalker;
 import org.eclipse.jgit.revwalk.ObjectWalk;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -99,10 +100,10 @@ class PackWriterBitmapPreparer {
 		this.excessiveBranchCount = config.getBitmapExcessiveBranchCount();
 		this.excessiveBranchTipCount = Math.max(excessiveBranchCount,
 				config.getBitmapExcessiveBranchTipCount());
-		long now = SystemReader.getInstance().getCurrentTime();
+		Instant now = SystemReader.getInstance().now();
 		long ageInSeconds = (long) config.getBitmapInactiveBranchAgeInDays()
 				* DAY_IN_SECONDS;
-		this.inactiveBranchTimestamp = (now / 1000) - ageInSeconds;
+		this.inactiveBranchTimestamp = now.getEpochSecond() - ageInSeconds;
 	}
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java
index d07713d..e9ff027 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java
@@ -32,6 +32,8 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.Arrays;
 import java.util.zip.DataFormatException;
 import java.util.zip.Inflater;
@@ -245,9 +247,9 @@ private String readValueString() {
 	private PersonIdent readPersonIdent() {
 		String name = readValueString();
 		String email = readValueString();
-		long ms = readVarint64() * 1000;
-		int tz = readInt16();
-		return new PersonIdent(name, email, ms, tz);
+		long epochSeconds = readVarint64();
+		ZoneOffset tz = ZoneOffset.ofTotalSeconds(readInt16() * 60);
+		return new PersonIdent(name, email, Instant.ofEpochSecond(epochSeconds), tz);
 	}
 
 	void readBlock(BlockSource src, long pos, int fileBlockSize)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java
index a57f1b7..5068a6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java
@@ -446,6 +446,13 @@ public final class ConfigConstants {
 	/** The "rebase" key */
 	public static final String CONFIG_KEY_REBASE = "rebase";
 
+	/**
+	 * The "checkout" key
+	 *
+	 * @since 7.2
+	 */
+	public static final String CONFIG_KEY_CHECKOUT = "checkout";
+
 	/** The "url" key */
 	public static final String CONFIG_KEY_URL = "url";
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
index 5d3db9e..50f4a83 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
@@ -12,7 +12,10 @@
 
 package org.eclipse.jgit.lib;
 
+import static java.time.ZoneOffset.UTC;
+
 import java.io.Serializable;
+import java.time.DateTimeException;
 import java.time.Instant;
 import java.time.ZoneId;
 import java.time.ZoneOffset;
@@ -42,7 +45,9 @@ public class PersonIdent implements Serializable {
 	 *            timezone offset as in {@link #getTimeZoneOffset()}.
 	 * @return time zone object for the given offset.
 	 * @since 4.1
+	 * @deprecated use {@link #getZoneId(int)} instead
 	 */
+	@Deprecated(since = "7.2")
 	public static TimeZone getTimeZone(int tzOffset) {
 		StringBuilder tzId = new StringBuilder(8);
 		tzId.append("GMT"); //$NON-NLS-1$
@@ -54,11 +59,15 @@ public static TimeZone getTimeZone(int tzOffset) {
 	 * Translate a minutes offset into a ZoneId
 	 *
 	 * @param tzOffset as minutes east of UTC
-	 * @return a ZoneId  for this offset
+	 * @return a ZoneId for this offset (UTC if invalid)
 	 * @since 7.1
 	 */
 	public static ZoneId getZoneId(int tzOffset) {
-		return ZoneOffset.ofHoursMinutes(tzOffset / 60, tzOffset % 60);
+		try {
+			return ZoneOffset.ofHoursMinutes(tzOffset / 60, tzOffset % 60);
+		} catch (DateTimeException e) {
+			return UTC;
+		}
 	}
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
index 09cb5a8..49d5224 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
@@ -356,6 +356,40 @@ public List<Ref> getRefs() throws IOException {
 	}
 
 	/**
+	 * Get the reflog reader
+	 *
+	 * @param refName
+	 *            a {@link java.lang.String} object.
+	 * @return a {@link org.eclipse.jgit.lib.ReflogReader} for the supplied
+	 *         refname, or {@code null} if the named ref does not exist.
+	 * @throws java.io.IOException
+	 *             the ref could not be accessed.
+	 * @since 7.2
+	 */
+	@Nullable
+	public ReflogReader getReflogReader(String refName) throws IOException {
+		Ref ref = exactRef(refName);
+		if (ref == null) {
+			return null;
+		}
+		return getReflogReader(ref);
+	}
+
+	/**
+	 * Get the reflog reader.
+	 *
+	 * @param ref
+	 *            a Ref
+	 * @return a {@link org.eclipse.jgit.lib.ReflogReader} for the supplied ref.
+	 * @throws IOException
+	 *             if an IO error occurred
+	 * @since 7.2
+	 */
+	@NonNull
+	public abstract ReflogReader getReflogReader(@NonNull Ref ref)
+			throws IOException;
+
+	/**
 	 * Get a section of the reference namespace.
 	 *
 	 * @param prefix
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
index 0562840..7574738 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -1692,10 +1692,13 @@ public void setGitwebDescription(@Nullable String description)
 	 * @throws java.io.IOException
 	 *             the ref could not be accessed.
 	 * @since 3.0
+	 * @deprecated use {@code #getRefDatabase().getReflogReader(String)} instead
 	 */
+	@Deprecated(since = "7.2")
 	@Nullable
-	public abstract ReflogReader getReflogReader(String refName)
-			throws IOException;
+	public ReflogReader getReflogReader(String refName) throws IOException {
+		return getRefDatabase().getReflogReader(refName);
+	}
 
 	/**
 	 * Get the reflog reader. Subclasses should override this method and provide
@@ -1703,15 +1706,17 @@ public abstract ReflogReader getReflogReader(String refName)
 	 *
 	 * @param ref
 	 *            a Ref
-	 * @return a {@link org.eclipse.jgit.lib.ReflogReader} for the supplied ref,
-	 *         or {@code null} if the ref does not exist.
+	 * @return a {@link org.eclipse.jgit.lib.ReflogReader} for the supplied ref.
 	 * @throws IOException
 	 *             if an IO error occurred
 	 * @since 5.13.2
+	 * @deprecated use {@code #getRefDatabase().getReflogReader(Ref)} instead
 	 */
-	public @Nullable ReflogReader getReflogReader(@NonNull	Ref ref)
+	@Deprecated(since = "7.2")
+	@NonNull
+	public ReflogReader getReflogReader(@NonNull Ref ref)
 			throws IOException {
-		return getReflogReader(ref.getName());
+		return getRefDatabase().getReflogReader(ref);
 	}
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
index fc5ab62..f58ef4f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
@@ -18,10 +18,10 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.time.Instant;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
-import java.util.TimeZone;
 import java.util.stream.Collectors;
 
 import org.eclipse.jgit.dircache.DirCache;
@@ -233,12 +233,11 @@ private RevCommit createCommitForTree(ObjectId tree, List<RevCommit> parents)
 	private static PersonIdent mockAuthor(List<RevCommit> parents) {
 		String name = RecursiveMerger.class.getSimpleName();
 		int time = 0;
-		for (RevCommit p : parents)
+		for (RevCommit p : parents) {
 			time = Math.max(time, p.getCommitTime());
-		return new PersonIdent(
-				name, name + "@JGit", //$NON-NLS-1$
-				new Date((time + 1) * 1000L),
-				TimeZone.getTimeZone("GMT+0000")); //$NON-NLS-1$
+		}
+		return new PersonIdent(name, name + "@JGit", //$NON-NLS-1$
+				Instant.ofEpochSecond(time+1), ZoneOffset.UTC);
 	}
 
 	private String failingPathsMessage() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
index 743a8cc..871545f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 2008-2009, Google Inc.
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
+ * Copyright (C) 2008, 2009 Google Inc.
+ * Copyright (C) 2008, 2024 Shawn O. Pearce <spearce@spearce.org> and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -401,13 +401,13 @@ public RevCommit getParent(int nth) {
 	 * @since 5.1
 	 */
 	public final byte[] getRawGpgSignature() {
-		final byte[] raw = buffer;
-		final byte[] header = { 'g', 'p', 'g', 's', 'i', 'g' };
-		final int start = RawParseUtils.headerStart(header, raw, 0);
+		byte[] raw = buffer;
+		byte[] header = { 'g', 'p', 'g', 's', 'i', 'g' };
+		int start = RawParseUtils.headerStart(header, raw, 0);
 		if (start < 0) {
 			return null;
 		}
-		final int end = RawParseUtils.headerEnd(raw, start);
+		int end = RawParseUtils.nextLfSkippingSplitLines(raw, start);
 		return RawParseUtils.headerValue(raw, start, end);
 	}
 
@@ -524,6 +524,30 @@ static boolean hasLF(byte[] r, int b, int e) {
 	}
 
 	/**
+	 * Parse the commit message and return its first line, i.e., everything up
+	 * to but not including the first newline, if any.
+	 *
+	 * @return the first line of the decoded commit message as a string; never
+	 *         {@code null}.
+	 * @since 7.2
+	 */
+	public final String getFirstMessageLine() {
+		int msgB = RawParseUtils.commitMessage(buffer, 0);
+		if (msgB < 0) {
+			return ""; //$NON-NLS-1$
+		}
+		int msgE = msgB;
+		byte[] raw = buffer;
+		while (msgE < raw.length && raw[msgE] != '\n') {
+			msgE++;
+		}
+		if (msgE > msgB && msgE > 0 && raw[msgE - 1] == '\r') {
+			msgE--;
+		}
+		return RawParseUtils.decode(guessEncoding(buffer), buffer, msgB, msgE);
+	}
+
+	/**
 	 * Determine the encoding of the commit message buffer.
 	 * <p>
 	 * Locates the "encoding" header (if present) and returns its value. Due to
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java
index 4100e87..c9186b5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java
@@ -12,6 +12,7 @@
 package org.eclipse.jgit.revwalk.filter;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.Date;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -30,9 +31,24 @@ public abstract class CommitTimeRevFilter extends RevFilter {
 	 * @param ts
 	 *            the point in time to cut on.
 	 * @return a new filter to select commits on or before <code>ts</code>.
+	 *
+	 * @deprecated Use {@link #before(Instant)} instead.
 	 */
+	@Deprecated(since="7.2")
 	public static final RevFilter before(Date ts) {
-		return before(ts.getTime());
+		return before(ts.toInstant());
+	}
+
+	/**
+	 * Create a new filter to select commits before a given date/time.
+	 *
+	 * @param ts
+	 *            the point in time to cut on.
+	 * @return a new filter to select commits on or before <code>ts</code>.
+	 * @since 7.2
+	 */
+	public static RevFilter before(Instant ts) {
+		return new Before(ts);
 	}
 
 	/**
@@ -43,7 +59,7 @@ public static final RevFilter before(Date ts) {
 	 * @return a new filter to select commits on or before <code>ts</code>.
 	 */
 	public static final RevFilter before(long ts) {
-		return new Before(ts);
+		return new Before(Instant.ofEpochMilli(ts));
 	}
 
 	/**
@@ -52,9 +68,24 @@ public static final RevFilter before(long ts) {
 	 * @param ts
 	 *            the point in time to cut on.
 	 * @return a new filter to select commits on or after <code>ts</code>.
+	 *
+	 * @deprecated Use {@link #after(Instant)} instead.
 	 */
+	@Deprecated(since="7.2")
 	public static final RevFilter after(Date ts) {
-		return after(ts.getTime());
+		return after(ts.toInstant());
+	}
+
+	/**
+	 * Create a new filter to select commits after a given date/time.
+	 *
+	 * @param ts
+	 *            the point in time to cut on.
+	 * @return a new filter to select commits on or after <code>ts</code>.
+	 * @since 7.2
+	 */
+	public static RevFilter after(Instant ts) {
+		return new After(ts);
 	}
 
 	/**
@@ -65,7 +96,7 @@ public static final RevFilter after(Date ts) {
 	 * @return a new filter to select commits on or after <code>ts</code>.
 	 */
 	public static final RevFilter after(long ts) {
-		return new After(ts);
+		return after(Instant.ofEpochMilli(ts));
 	}
 
 	/**
@@ -75,9 +106,28 @@ public static final RevFilter after(long ts) {
 	 * @param since the point in time to cut on.
 	 * @param until the point in time to cut off.
 	 * @return a new filter to select commits between the given date/times.
+	 *
+	 * @deprecated Use {@link #between(Instant, Instant)} instead.
 	 */
+	@Deprecated(since="7.2")
 	public static final RevFilter between(Date since, Date until) {
-		return between(since.getTime(), until.getTime());
+		return between(since.toInstant(), until.toInstant());
+	}
+
+	/**
+	 * Create a new filter to select commits after or equal a given date/time
+	 * <code>since</code> and before or equal a given date/time
+	 * <code>until</code>.
+	 *
+	 * @param since
+	 *            the point in time to cut on.
+	 * @param until
+	 *            the point in time to cut off.
+	 * @return a new filter to select commits between the given date/times.
+	 * @since 7.2
+	 */
+	public static RevFilter between(Instant since, Instant until) {
+		return new Between(since, until);
 	}
 
 	/**
@@ -87,9 +137,12 @@ public static final RevFilter between(Date since, Date until) {
 	 * @param since the point in time to cut on, in milliseconds.
 	 * @param until the point in time to cut off, in millisconds.
 	 * @return a new filter to select commits between the given date/times.
+	 *
+	 * @deprecated Use {@link #between(Instant, Instant)} instead.
 	 */
+	@Deprecated(since="7.2")
 	public static final RevFilter between(long since, long until) {
-		return new Between(since, until);
+		return new Between(Instant.ofEpochMilli(since), Instant.ofEpochMilli(until));
 	}
 
 	final int when;
@@ -98,6 +151,10 @@ public static final RevFilter between(long since, long until) {
 		when = (int) (ts / 1000);
 	}
 
+	CommitTimeRevFilter(Instant t) {
+		when = (int) t.getEpochSecond();
+	}
+
 	@Override
 	public RevFilter clone() {
 		return this;
@@ -109,8 +166,8 @@ public boolean requiresCommitBody() {
 	}
 
 	private static class Before extends CommitTimeRevFilter {
-		Before(long ts) {
-			super(ts);
+		Before(Instant t) {
+			super(t);
 		}
 
 		@Override
@@ -123,14 +180,12 @@ public boolean include(RevWalk walker, RevCommit cmit)
 		@SuppressWarnings("nls")
 		@Override
 		public String toString() {
-			return super.toString() + "(" + new Date(when * 1000L) + ")";
+			return super.toString() + "(" + Instant.ofEpochSecond(when) + ")";
 		}
 	}
 
 	private static class After extends CommitTimeRevFilter {
-		After(long ts) {
-			super(ts);
-		}
+		After(Instant t) { super(t); }
 
 		@Override
 		public boolean include(RevWalk walker, RevCommit cmit)
@@ -148,16 +203,16 @@ public boolean include(RevWalk walker, RevCommit cmit)
 		@SuppressWarnings("nls")
 		@Override
 		public String toString() {
-			return super.toString() + "(" + new Date(when * 1000L) + ")";
+			return super.toString() + "(" + Instant.ofEpochSecond(when) + ")";
 		}
 	}
 
 	private static class Between extends CommitTimeRevFilter {
 		private final int until;
 
-		Between(long since, long until) {
+		Between(Instant since, Instant until) {
 			super(since);
-			this.until = (int) (until / 1000);
+			this.until = (int) until.getEpochSecond();
 		}
 
 		@Override
@@ -170,8 +225,8 @@ public boolean include(RevWalk walker, RevCommit cmit)
 		@SuppressWarnings("nls")
 		@Override
 		public String toString() {
-			return super.toString() + "(" + new Date(when * 1000L) + " - "
-					+ new Date(until * 1000L) + ")";
+			return super.toString() + "(" + Instant.ofEpochSecond(when) + " - "
+					+ Instant.ofEpochSecond(until) + ")";
 		}
 
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
index 469a3d6..be0d37b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
@@ -12,10 +12,10 @@
 
 package org.eclipse.jgit.transport;
 
-import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_DELIM;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_DEEPEN;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_DEEPEN_NOT;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_DEEPEN_SINCE;
+import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_DELIM;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_DONE;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_END;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_ERR;
@@ -32,7 +32,6 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -715,7 +714,7 @@ private void markReachable(Collection<Ref> want, Set<ObjectId> have,
 			// wind up later matching up against things we want and we
 			// can avoid asking for something we already happen to have.
 			//
-			final Date maxWhen = new Date(maxTime * 1000L);
+			Instant maxWhen = Instant.ofEpochSecond(maxTime);
 			walk.sort(RevSort.COMMIT_TIME_DESC);
 			walk.markStart(reachableCommits);
 			walk.setRevFilter(CommitTimeRevFilter.after(maxWhen));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java
index a9e93b6..6bdaf0e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java
@@ -24,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -329,7 +330,7 @@ public RefUpdate.Result save() throws IOException {
 		if (newId == null) {
 			return RefUpdate.Result.NO_CHANGE;
 		}
-		try (ObjectInserter inserter = db.newObjectInserter()) {
+		try {
 			RefUpdate.Result result = updateRef(newId);
 			switch (result) {
 				case FAST_FORWARD:
@@ -404,8 +405,8 @@ private ObjectId write() throws IOException {
 	}
 
 	private static void sortPending(List<PendingCert> pending) {
-		Collections.sort(pending, (PendingCert a, PendingCert b) -> Long.signum(
-				a.ident.getWhen().getTime() - b.ident.getWhen().getTime()));
+		Collections.sort(pending,
+				Comparator.comparing((PendingCert a) -> a.ident.getWhenAsInstant()));
 	}
 
 	private DirCache newDirCache() throws IOException {
@@ -503,7 +504,7 @@ private static String buildMessage(PushCertificate cert) {
 		} else {
 			sb.append(MessageFormat.format(
 					JGitText.get().storePushCertMultipleRefs,
-					Integer.valueOf(cert.getCommands().size())));
+					cert.getCommands().size()));
 		}
 		return sb.append('\n').toString();
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index d972067..41ab8ac 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -2226,7 +2226,7 @@ private boolean wantSatisfied(RevObject want) throws IOException {
 		walk.resetRetain(SAVE);
 		walk.markStart((RevCommit) want);
 		if (oldestTime != 0)
-			walk.setRevFilter(CommitTimeRevFilter.after(oldestTime * 1000L));
+			walk.setRevFilter(CommitTimeRevFilter.after(Instant.ofEpochSecond(oldestTime)));
 		for (;;) {
 			final RevCommit c = walk.next();
 			if (c == null)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
index b789c51..31c216b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
@@ -38,12 +38,12 @@
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.CoreConfig.EolStreamType;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.MutableObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.CoreConfig.EolStreamType;
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
@@ -1594,6 +1594,9 @@ private String getFilterCommandDefinition(String filterDriverName,
 		String filterCommand = filterCommandsByNameDotType.get(key);
 		if (filterCommand != null)
 			return filterCommand;
+		if (config == null) {
+			return null;
+		}
 		filterCommand = config.getString(ConfigConstants.CONFIG_FILTER_SECTION,
 				filterDriverName, filterCommandType);
 		boolean useBuiltin = config.getBoolean(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java
index e6bf497..332e659 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java
@@ -10,10 +10,10 @@
 
 package org.eclipse.jgit.util;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
 import java.util.Locale;
-import java.util.TimeZone;
 
 import org.eclipse.jgit.lib.PersonIdent;
 
@@ -26,9 +26,9 @@
  */
 public class GitDateFormatter {
 
-	private DateFormat dateTimeInstance;
+	private DateTimeFormatter dateTimeFormat;
 
-	private DateFormat dateTimeInstance2;
+	private DateTimeFormatter dateTimeFormat2;
 
 	private final Format format;
 
@@ -96,30 +96,34 @@ public GitDateFormatter(Format format) {
 		default:
 			break;
 		case DEFAULT: // Not default:
-			dateTimeInstance = new SimpleDateFormat(
+			dateTimeFormat = DateTimeFormatter.ofPattern(
 					"EEE MMM dd HH:mm:ss yyyy Z", Locale.US); //$NON-NLS-1$
 			break;
 		case ISO:
-			dateTimeInstance = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", //$NON-NLS-1$
+			dateTimeFormat = DateTimeFormatter.ofPattern(
+					"yyyy-MM-dd HH:mm:ss Z", //$NON-NLS-1$
 					Locale.US);
 			break;
 		case LOCAL:
-			dateTimeInstance = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy", //$NON-NLS-1$
+			dateTimeFormat = DateTimeFormatter.ofPattern(
+					"EEE MMM dd HH:mm:ss yyyy", //$NON-NLS-1$
 					Locale.US);
 			break;
 		case RFC:
-			dateTimeInstance = new SimpleDateFormat(
+			dateTimeFormat = DateTimeFormatter.ofPattern(
 					"EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); //$NON-NLS-1$
 			break;
 		case SHORT:
-			dateTimeInstance = new SimpleDateFormat("yyyy-MM-dd", Locale.US); //$NON-NLS-1$
+			dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd", //$NON-NLS-1$
+					Locale.US);
 			break;
 		case LOCALE:
 		case LOCALELOCAL:
-			SystemReader systemReader = SystemReader.getInstance();
-			dateTimeInstance = systemReader.getDateTimeInstance(
-					DateFormat.DEFAULT, DateFormat.DEFAULT);
-			dateTimeInstance2 = systemReader.getSimpleDateFormat("Z"); //$NON-NLS-1$
+			dateTimeFormat = DateTimeFormatter
+					.ofLocalizedDateTime(FormatStyle.MEDIUM)
+					.withLocale(Locale.US);
+			dateTimeFormat2 = DateTimeFormatter.ofPattern("Z", //$NON-NLS-1$
+					Locale.US);
 			break;
 		}
 	}
@@ -135,39 +139,45 @@ public GitDateFormatter(Format format) {
 	@SuppressWarnings("boxing")
 	public String formatDate(PersonIdent ident) {
 		switch (format) {
-		case RAW:
-			int offset = ident.getTimeZoneOffset();
+		case RAW: {
+			int offset = ident.getZoneOffset().getTotalSeconds();
 			String sign = offset < 0 ? "-" : "+"; //$NON-NLS-1$ //$NON-NLS-2$
 			int offset2;
-			if (offset < 0)
+			if (offset < 0) {
 				offset2 = -offset;
-			else
+			} else {
 				offset2 = offset;
-			int hours = offset2 / 60;
-			int minutes = offset2 % 60;
+			}
+			int minutes = (offset2 / 60) % 60;
+			int hours = offset2 / 60 / 60;
 			return String.format("%d %s%02d%02d", //$NON-NLS-1$
-					ident.getWhen().getTime() / 1000, sign, hours, minutes);
+					ident.getWhenAsInstant().getEpochSecond(), sign, hours,
+					minutes);
+		}
 		case RELATIVE:
-			return RelativeDateFormatter.format(ident.getWhen());
+			return RelativeDateFormatter.format(ident.getWhenAsInstant());
 		case LOCALELOCAL:
 		case LOCAL:
-			dateTimeInstance.setTimeZone(SystemReader.getInstance()
-					.getTimeZone());
-			return dateTimeInstance.format(ident.getWhen());
-		case LOCALE:
-			TimeZone tz = ident.getTimeZone();
-			if (tz == null)
-				tz = SystemReader.getInstance().getTimeZone();
-			dateTimeInstance.setTimeZone(tz);
-			dateTimeInstance2.setTimeZone(tz);
-			return dateTimeInstance.format(ident.getWhen()) + " " //$NON-NLS-1$
-					+ dateTimeInstance2.format(ident.getWhen());
-		default:
-			tz = ident.getTimeZone();
-			if (tz == null)
-				tz = SystemReader.getInstance().getTimeZone();
-			dateTimeInstance.setTimeZone(ident.getTimeZone());
-			return dateTimeInstance.format(ident.getWhen());
+			return dateTimeFormat
+					.withZone(SystemReader.getInstance().getTimeZoneId())
+					.format(ident.getWhenAsInstant());
+		case LOCALE: {
+			ZoneId tz = ident.getZoneId();
+			if (tz == null) {
+				tz = SystemReader.getInstance().getTimeZoneId();
+			}
+			return dateTimeFormat.withZone(tz).format(ident.getWhenAsInstant())
+					+ " " //$NON-NLS-1$
+					+ dateTimeFormat2.withZone(tz)
+							.format(ident.getWhenAsInstant());
+		}
+		default: {
+			ZoneId tz = ident.getZoneId();
+			if (tz == null) {
+				tz = SystemReader.getInstance().getTimeZoneId();
+			}
+			return dateTimeFormat.withZone(tz).format(ident.getWhenAsInstant());
+		}
 		}
 	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitTimeParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitTimeParser.java
index 7d00fcd..acaa1ce 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitTimeParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitTimeParser.java
@@ -11,6 +11,7 @@
 
 import java.text.MessageFormat;
 import java.text.ParseException;
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -97,6 +98,40 @@ public static LocalDateTime parse(String dateStr) throws ParseException {
 		return parse(dateStr, SystemReader.getInstance().civilNow());
 	}
 
+	/**
+	 * Parses a string into a {@link java.time.Instant} using the default
+	 * locale. Since this parser also supports relative formats (e.g.
+	 * "yesterday") the caller can specify the reference date. These types of
+	 * strings can be parsed:
+	 * <ul>
+	 * <li>"never"</li>
+	 * <li>"now"</li>
+	 * <li>"yesterday"</li>
+	 * <li>"(x) years|months|weeks|days|hours|minutes|seconds ago"<br>
+	 * Multiple specs can be combined like in "2 weeks 3 days ago". Instead of '
+	 * ' one can use '.' to separate the words</li>
+	 * <li>"yyyy-MM-dd HH:mm:ss Z" (ISO)</li>
+	 * <li>"EEE, dd MMM yyyy HH:mm:ss Z" (RFC)</li>
+	 * <li>"yyyy-MM-dd"</li>
+	 * <li>"yyyy.MM.dd"</li>
+	 * <li>"MM/dd/yyyy",</li>
+	 * <li>"dd.MM.yyyy"</li>
+	 * <li>"EEE MMM dd HH:mm:ss yyyy Z" (DEFAULT)</li>
+	 * <li>"EEE MMM dd HH:mm:ss yyyy" (LOCAL)</li>
+	 * </ul>
+	 *
+	 * @param dateStr
+	 *            the string to be parsed
+	 * @return the parsed {@link java.time.Instant}
+	 * @throws java.text.ParseException
+	 *             if the given dateStr was not recognized
+	 * @since 7.2
+	 */
+	public static Instant parseInstant(String dateStr) throws ParseException {
+		return parse(dateStr).atZone(SystemReader.getInstance().getTimeZoneId())
+				.toInstant();
+	}
+
 	// Only tests seem to use this method
 	static LocalDateTime parse(String dateStr, LocalDateTime now)
 			throws ParseException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
index 2ce8690..3ed7251 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
@@ -13,6 +13,8 @@
 
 import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.time.Instant.EPOCH;
+import static java.time.ZoneOffset.UTC;
 import static org.eclipse.jgit.lib.ObjectChecker.author;
 import static org.eclipse.jgit.lib.ObjectChecker.committer;
 import static org.eclipse.jgit.lib.ObjectChecker.encoding;
@@ -30,6 +32,10 @@
 import java.nio.charset.CodingErrorAction;
 import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
+import java.time.DateTimeException;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
@@ -459,6 +465,29 @@ public static final int parseTimeZoneOffset(final byte[] b, int ptr,
 	}
 
 	/**
+	 * Parse a Git style timezone string in [+-]hhmm format
+	 *
+	 * @param b
+	 *            buffer to scan.
+	 * @param ptr
+	 *            position within buffer to start parsing digits at.
+	 * @param ptrResult
+	 *            optional location to return the new ptr value through. If null
+	 *            the ptr value will be discarded.
+	 * @return the ZoneOffset represention of the timezone offset string.
+	 *         Invalid offsets default to UTC.
+	 */
+	private static ZoneId parseZoneOffset(final byte[] b, int ptr,
+			MutableInteger ptrResult) {
+		int hhmm = parseBase10(b, ptr, ptrResult);
+		try {
+			return ZoneOffset.ofHoursMinutes(hhmm / 100, hhmm % 100);
+		} catch (DateTimeException e) {
+			return UTC;
+		}
+	}
+
+	/**
 	 * Locate the first position after a given character.
 	 *
 	 * @param b
@@ -1027,17 +1056,19 @@ public static PersonIdent parsePersonIdent(byte[] raw, int nameB) {
 		// character if there is no trailing LF.
 		final int tzBegin = lastIndexOfTrim(raw, ' ',
 				nextLF(raw, emailE - 1) - 2) + 1;
-		if (tzBegin <= emailE) // No time/zone, still valid
-			return new PersonIdent(name, email, 0, 0);
+		if (tzBegin <= emailE) { // No time/zone, still valid
+			return new PersonIdent(name, email, EPOCH, UTC);
+		}
 
 		final int whenBegin = Math.max(emailE,
 				lastIndexOfTrim(raw, ' ', tzBegin - 1) + 1);
-		if (whenBegin >= tzBegin - 1) // No time/zone, still valid
-			return new PersonIdent(name, email, 0, 0);
+		if (whenBegin >= tzBegin - 1) { // No time/zone, still valid
+			return new PersonIdent(name, email, EPOCH, UTC);
+		}
 
-		final long when = parseLongBase10(raw, whenBegin, null);
-		final int tz = parseTimeZoneOffset(raw, tzBegin);
-		return new PersonIdent(name, email, when * 1000L, tz);
+		long when = parseLongBase10(raw, whenBegin, null);
+		return new PersonIdent(name, email, Instant.ofEpochSecond(when),
+				parseZoneOffset(raw, tzBegin, null));
 	}
 
 	/**
@@ -1075,16 +1106,16 @@ public static PersonIdent parsePersonIdentOnly(final byte[] raw,
 			name = decode(raw, nameB, stop);
 
 		final MutableInteger ptrout = new MutableInteger();
-		long when;
-		int tz;
+		Instant when;
+		ZoneId tz;
 		if (emailE < stop) {
-			when = parseLongBase10(raw, emailE + 1, ptrout);
-			tz = parseTimeZoneOffset(raw, ptrout.value);
+			when = Instant.ofEpochSecond(parseLongBase10(raw, emailE + 1, ptrout));
+			tz = parseZoneOffset(raw, ptrout.value, null);
 		} else {
-			when = 0;
-			tz = 0;
+			when = EPOCH;
+			tz = UTC;
 		}
-		return new PersonIdent(name, email, when * 1000L, tz);
+		return new PersonIdent(name, email, when, tz);
 	}
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java
index 5611b1e..b6b19e0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java
@@ -10,6 +10,8 @@
 package org.eclipse.jgit.util;
 
 import java.text.MessageFormat;
+import java.time.Duration;
+import java.time.Instant;
 import java.util.Date;
 
 import org.eclipse.jgit.internal.JGitText;
@@ -42,12 +44,29 @@ public class RelativeDateFormatter {
 	 * @return age of given {@link java.util.Date} compared to now formatted in
 	 *         the same relative format as returned by
 	 *         {@code git log --relative-date}
+	 * @deprecated Use {@link #format(Instant)} instead.
 	 */
+	@Deprecated(since = "7.2")
 	@SuppressWarnings("boxing")
 	public static String format(Date when) {
+		return format(when.toInstant());
+	}
 
-		long ageMillis = SystemReader.getInstance().getCurrentTime()
-				- when.getTime();
+	/**
+	 * Get age of given {@link java.time.Instant} compared to now formatted in the
+	 * same relative format as returned by {@code git log --relative-date}
+	 *
+	 * @param when
+	 *            an instant to format
+	 * @return age of given instant compared to now formatted in
+	 *         the same relative format as returned by
+	 *         {@code git log --relative-date}
+	 * @since 7.2
+	 */
+	@SuppressWarnings("boxing")
+	public static String format(Instant when) {
+		long ageMillis = Duration
+				.between(when, SystemReader.getInstance().now()).toMillis();
 
 		// shouldn't happen in a perfect world
 		if (ageMillis < 0)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SignatureUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SignatureUtils.java
index 90524db..e3e3e04 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SignatureUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SignatureUtils.java
@@ -45,12 +45,15 @@ private SignatureUtils() {
 	public static String toString(SignatureVerification verification,
 			PersonIdent creator, GitDateFormatter formatter) {
 		StringBuilder result = new StringBuilder();
-		// Use the creator's timezone for the signature date
-		PersonIdent dateId = new PersonIdent(creator,
-				verification.creationDate());
-		result.append(MessageFormat.format(JGitText.get().verifySignatureMade,
-				formatter.formatDate(dateId)));
-		result.append('\n');
+		if (verification.creationDate() != null) {
+			// Use the creator's timezone for the signature date
+			PersonIdent dateId = new PersonIdent(creator,
+					verification.creationDate().toInstant());
+			result.append(
+					MessageFormat.format(JGitText.get().verifySignatureMade,
+							formatter.formatDate(dateId)));
+			result.append('\n');
+		}
 		result.append(MessageFormat.format(
 				JGitText.get().verifySignatureKey,
 				verification.keyFingerprint().toUpperCase(Locale.ROOT)));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
index 55cc878..22b82b3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
@@ -523,7 +523,7 @@ private void updateAll(Config config)
 	 *
 	 * @deprecated Use {@link #now()}
 	 */
-	@Deprecated
+	@Deprecated(since = "7.1")
 	public abstract long getCurrentTime();
 
 	/**
@@ -569,7 +569,7 @@ public MonotonicClock getClock() {
 	 *
 	 * @deprecated Use {@link #getTimeZoneAt(Instant)} instead.
 	 */
-	@Deprecated
+	@Deprecated(since = "7.1")
 	public abstract int getTimezone(long when);
 
 	/**
@@ -592,7 +592,7 @@ public ZoneOffset getTimeZoneAt(Instant when) {
 	 *
 	 * @deprecated Use {@link #getTimeZoneId()}
 	 */
-	@Deprecated
+	@Deprecated(since = "7.1")
 	public TimeZone getTimeZone() {
 		return TimeZone.getDefault();
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java
index a5ee107..a20eaaf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java
@@ -138,7 +138,10 @@ public Instant instant() {
 	 * Get time since epoch, with up to microsecond resolution.
 	 *
 	 * @return time since epoch, with up to microsecond resolution.
+	 *
+	 * @deprecated Use instant() instead
 	 */
+	@Deprecated(since = "7.2")
 	public Timestamp timestamp() {
 		return Timestamp.from(instant());
 	}
@@ -147,7 +150,10 @@ public Timestamp timestamp() {
 	 * Get time since epoch, with up to millisecond resolution.
 	 *
 	 * @return time since epoch, with up to millisecond resolution.
+	 *
+	 * @deprecated Use instant() instead
 	 */
+	@Deprecated(since = "7.2")
 	public Date date() {
 		return new Date(millis());
 	}
diff --git a/pom.xml b/pom.xml
index 256166b..e6ea748 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
   <groupId>org.eclipse.jgit</groupId>
   <artifactId>org.eclipse.jgit-parent</artifactId>
   <packaging>pom</packaging>
-  <version>7.1.1-SNAPSHOT</version>
+  <version>7.2.0-SNAPSHOT</version>
 
   <name>JGit - Parent</name>
   <url>${jgit-url}</url>
@@ -118,7 +118,7 @@
 
     <project.build.outputTimestamp>${commit.time.iso}</project.build.outputTimestamp>
 
-    <jgit-last-release-version>7.0.0.202409031743-r</jgit-last-release-version>
+    <jgit-last-release-version>7.1.0.202411261347-r</jgit-last-release-version>
     <ant-version>1.10.15</ant-version>
     <apache-sshd-version>2.14.0</apache-sshd-version>
     <jsch-version>0.1.55</jsch-version>
@@ -130,25 +130,25 @@
     <commons-compress-version>1.27.1</commons-compress-version>
     <osgi-core-version>6.0.0</osgi-core-version>
     <servlet-api-version>6.1.0</servlet-api-version>
-    <jetty-version>12.0.15</jetty-version>
-    <japicmp-version>0.21.2</japicmp-version>
+    <jetty-version>12.0.16</jetty-version>
+    <japicmp-version>0.23.0</japicmp-version>
     <httpclient-version>4.5.14</httpclient-version>
     <httpcore-version>4.4.16</httpcore-version>
     <slf4j-version>1.7.36</slf4j-version>
-    <maven-javadoc-plugin-version>3.6.3</maven-javadoc-plugin-version>
+    <maven-javadoc-plugin-version>3.11.2</maven-javadoc-plugin-version>
     <gson-version>2.11.0</gson-version>
-    <bouncycastle-version>1.79</bouncycastle-version>
-    <spotbugs-maven-plugin-version>4.8.5.0</spotbugs-maven-plugin-version>
-    <maven-project-info-reports-plugin-version>3.5.1</maven-project-info-reports-plugin-version>
-    <maven-jxr-plugin-version>3.3.2</maven-jxr-plugin-version>
-    <maven-surefire-plugin-version>3.2.5</maven-surefire-plugin-version>
+    <bouncycastle-version>1.80</bouncycastle-version>
+    <spotbugs-maven-plugin-version>4.8.6.6</spotbugs-maven-plugin-version>
+    <maven-project-info-reports-plugin-version>3.8.0</maven-project-info-reports-plugin-version>
+    <maven-jxr-plugin-version>3.6.0</maven-jxr-plugin-version>
+    <maven-surefire-plugin-version>3.5.2</maven-surefire-plugin-version>
     <maven-surefire-report-plugin-version>${maven-surefire-plugin-version}</maven-surefire-report-plugin-version>
     <maven-compiler-plugin-version>3.13.0</maven-compiler-plugin-version>
     <plexus-compiler-version>2.13.0</plexus-compiler-version>
     <hamcrest-version>2.2</hamcrest-version>
-    <assertj-version>3.26.3</assertj-version>
-    <jna-version>5.15.0</jna-version>
-    <byte-buddy-version>1.15.10</byte-buddy-version>
+    <assertj-version>3.27.3</assertj-version>
+    <jna-version>5.16.0</jna-version>
+    <byte-buddy-version>1.16.1</byte-buddy-version>
 
     <!-- Properties to enable jacoco code coverage analysis -->
     <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
@@ -184,7 +184,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-jar-plugin</artifactId>
-          <version>3.4.1</version>
+          <version>3.4.2</version>
           <configuration>
             <archive>
               <manifestEntries>
@@ -208,13 +208,13 @@
 
         <plugin>
           <artifactId>maven-clean-plugin</artifactId>
-          <version>3.3.2</version>
+          <version>3.4.0</version>
         </plugin>
 
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-shade-plugin</artifactId>
-          <version>3.5.3</version>
+          <version>3.6.0</version>
         </plugin>
 
         <plugin>
@@ -226,7 +226,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-dependency-plugin</artifactId>
-          <version>3.6.1</version>
+          <version>3.8.1</version>
         </plugin>
 
         <plugin>
@@ -277,7 +277,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-pmd-plugin</artifactId>
-          <version>3.22.0</version>
+          <version>3.26.0</version>
           <configuration>
             <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
             <minimumTokens>100</minimumTokens>
@@ -300,7 +300,7 @@
         <plugin>
           <groupId>org.eclipse.cbi.maven.plugins</groupId>
           <artifactId>eclipse-jarsigner-plugin</artifactId>
-          <version>1.4.3</version>
+          <version>1.5.2</version>
         </plugin>
         <plugin>
           <groupId>org.jacoco</groupId>
@@ -310,7 +310,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-site-plugin</artifactId>
-          <version>4.0.0-M14</version>
+          <version>4.0.0-M16</version>
           <dependencies>
             <dependency><!-- add support for ssh/scp -->
               <groupId>org.apache.maven.wagon</groupId>
@@ -337,12 +337,12 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-deploy-plugin</artifactId>
-          <version>3.1.2</version>
+          <version>3.1.3</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-install-plugin</artifactId>
-          <version>3.1.2</version>
+          <version>3.1.3</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
@@ -357,7 +357,7 @@
         <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
-          <version>2.7.18</version>
+          <version>3.4.1</version>
         </plugin>
         <plugin>
           <groupId>org.eclipse.dash</groupId>
@@ -367,12 +367,12 @@
         <plugin>
           <groupId>org.cyclonedx</groupId>
           <artifactId>cyclonedx-maven-plugin</artifactId>
-          <version>2.8.0</version>
+          <version>2.9.1</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-artifact-plugin</artifactId>
-          <version>3.5.1</version>
+          <version>3.5.3</version>
           <configuration>
             <ignore>**/*cyclonedx.json</ignore>
             <reproducible>true</reproducible>
@@ -381,7 +381,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-enforcer-plugin</artifactId>
-          <version>3.4.1</version>
+          <version>3.5.0</version>
         </plugin>
       </plugins>
     </pluginManagement>
@@ -623,7 +623,7 @@
       <plugin>
         <groupId>io.github.git-commit-id</groupId>
         <artifactId>git-commit-id-maven-plugin</artifactId>
-        <version>8.0.2</version>
+        <version>9.0.1</version>
         <executions>
           <execution>
             <id>get-the-git-infos</id>
@@ -642,7 +642,7 @@
       <plugin>
         <groupId>org.codehaus.gmavenplus</groupId>
         <artifactId>gmavenplus-plugin</artifactId>
-        <version>3.0.2</version>
+        <version>4.0.1</version>
         <dependencies>
           <dependency>
             <groupId>org.apache.groovy</groupId>
@@ -886,7 +886,7 @@
       <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
-        <version>1.17.1</version>
+        <version>1.17.2</version>
       </dependency>
 
       <dependency>
@@ -898,7 +898,7 @@
       <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-io</artifactId>
-        <version>2.17.0</version>
+        <version>2.18.0</version>
       </dependency>
 
       <dependency>
@@ -1007,7 +1007,7 @@
       <dependency>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
-        <version>5.14.2</version>
+        <version>5.15.2</version>
       </dependency>
 
       <dependency>