Merge branch 'master' into servlet-4

* master:
  MultiPackIndexWriter: Encode checksum in base64
  DfsMidxWriter: Use the input data instead of rereading the midx
  DfsMidxWriter: Add a param to toggle bitmap writing
  PullCommandTest: Remove unused variable
  Update URL used to download artifacts from repo.eclipse.org
  Fix path of jgit artifacts in local maven repository
  MultiPackIndexWriter: report also the checksum in the result
  RefAdvancerWalk: Move to revwalk package
  pgm.MultiPackIndex: Move writing code to MidxWriter
  Allow extending TernarySearchTree
  MultiPackIndexWriter: Report progress writing chunks
  PackIndexMerger: Add progress monitor to the building process
  Bump minimum dependency for Bouncy Castle to 1.83.0
  Update version of last JGit release to 7.6.0.202603022253-r
  DfsMidxWriter: Split writing midx and its bitmaps
  MultiPackIndexLoader: report what chunk is going over size
  Prepare 7.7.0-SNAPSHOT builds
  Prepare 7.6.1-SNAPSHOT builds
  DfsPackFileMidx: Pass the right pack when building single-pack midx
  JGit v7.6.0.202603022253-r
  Add AddCommand #addFilepatterns methods
  Bazel: Pin jcl-over-slf4j to SLF4J_VERSION
  Prepare 7.6.0-SNAPSHOT builds
  JGit v7.6.0.202602242313-rc1
  Support diff3 conflict style in merges
  RebaseCommand: Honor the commit message cleanup configuration
  Remove the option to create 'blank issues' in GitHub
  Refactor handlePackError method to improve readability
  PackIndexMerger: Accept a midx as input to build another midx
  DfsPackFileMidxNPacks: Use only the list of packs in midx order
  DfsMidxWriterTest: Rename to DfsMidxWriterBitmapsTest
  Update jetty to 12.1.6
  Update bytebuddy to 1.18.5
  Update commons-codec to 1.21.0
  Orbit: update org.objenesis to 3.5.0
  DfsMidxWriter: Pass the PackIndexMerger instead of a Map of sources
  MidxIterators join: compare shifted packId
  DfsPackFileMidx: Offer localIterator
  Prepare 7.6.0-SNAPSHOT builds
  JGit v7.6.0.202602181523-m3
  PackIndexMerger: replace constructor with Builder
  JGit v7.6.0.202602172005-m3
  MidxIterator: Add reset method
  PackIndexMerger: remove rawIterator() method
  PackIndexMerge: Use deduped iterators instead of deduping while
reading
  PackIndexMerger: use MidxIterators instead of its own
  MidxIterators: Helpers around the MidxIterator
  Do not log packfiles moved away or pruned
  RevWalk: abort computation of merged commits if the monitor is
canceled

Change-Id: Ib6b840ac1dcdba0fd6256543de6226700b58f6e5
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..ec4bb38
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
\ No newline at end of file
diff --git a/MODULE.bazel b/MODULE.bazel
index f9e046b..a0629e4 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -23,9 +23,9 @@
 
 BOUNCYCASTLE_VERSION = "1.83"
 
-BYTE_BUDDY_VERSION = "1.18.4"
+BYTE_BUDDY_VERSION = "1.18.5"
 
-JETTY_VERSION = "12.1.5"
+JETTY_VERSION = "12.1.6"
 
 JMH_VERSION = "1.37"
 
@@ -45,7 +45,7 @@
         "com.googlecode.javaewah:JavaEWAH:1.2.3",
         "com.jcraft:jsch:0.1.55",
         "com.jcraft:jzlib:1.1.3",
-        "commons-codec:commons-codec:1.20.0",
+        "commons-codec:commons-codec:1.21.0",
         "commons-io:commons-io:2.21.0",
         "commons-logging:commons-logging:1.3.5",
         "javax.servlet:javax.servlet-api:4.0.1",
@@ -83,6 +83,7 @@
         "org.openjdk.jmh:jmh-core:" + JMH_VERSION,
         "org.openjdk.jmh:jmh-generator-annprocess:" + JMH_VERSION,
         "org.slf4j:slf4j-api:" + SLF4J_VERSION,
+        "org.slf4j:jcl-over-slf4j:" + SLF4J_VERSION,
         "org.slf4j:slf4j-simple:" + SLF4J_VERSION,
         "org.tukaani:xz:1.11",
     ],
diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
index b114e7d..8b99ee9 100644
--- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
@@ -5,14 +5,14 @@
 Automatic-Module-Name: org.eclipse.jgit.ant.test
 Bundle-SymbolicName: org.eclipse.jgit.ant.test
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
 Import-Package: org.apache.tools.ant,
- org.eclipse.jgit.ant.tasks;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.ant.tasks;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.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 483e833..1ed2fb9 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 18acf74..e10e385 100644
--- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
@@ -3,14 +3,14 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ant
 Bundle-SymbolicName: org.eclipse.jgit.ant
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
 Import-Package: org.apache.tools.ant,
-  org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)"
+  org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)"
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.ant;version="7.6.0",
- org.eclipse.jgit.ant.tasks;version="7.6.0";
+Export-Package: org.eclipse.jgit.ant;version="7.7.0",
+ org.eclipse.jgit.ant.tasks;version="7.7.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 d9b3241..08d4b66 100644
--- a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.ant - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ant.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.ant;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.ant;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml
index dab8a3d..8863da9 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 3f9d2c1..9f42812 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -14,18 +14,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.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.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.6.0";
+Export-Package: org.eclipse.jgit.archive;version="7.7.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.6.0";x-internal:=true
+ org.eclipse.jgit.archive.internal;version="7.7.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 86336e3..88f51d1 100644
--- a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.archive - Sources
 Bundle-SymbolicName: org.eclipse.jgit.archive.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.archive;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.archive;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml
index bbe279b..a04e9c6 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 b4daf7d..53d1bfd 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.benchmarks</artifactId>
diff --git a/org.eclipse.jgit.coverage/pom.xml b/org.eclipse.jgit.coverage/pom.xml
index 80b421d..b02657f 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.6.0-SNAPSHOT</version>
+    <version>7.7.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.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ant</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.archive</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.apache</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.server</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.server</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ui</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ssh.apache</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ant.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ssh.apache.test</artifactId>
-      <version>7.6.0-SNAPSHOT</version>
+      <version>7.7.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 647c97d..1b2793a 100644
--- a/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
@@ -3,20 +3,20 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.gpg.bc.test
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc.test
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Import-Package: org.bouncycastle.asn1.cryptlib;version="[1.80.0,2.0.0)",
- org.bouncycastle.jce.provider;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp.operator;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp.operator.jcajce;version="[1.80.0,2.0.0)",
- org.bouncycastle.util.encoders;version="[1.80.0,2.0.0)",
- org.eclipse.jgit.gpg.bc.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.gpg.bc.internal.keys;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.sha1;version="[7.6.0,7.7.0)",
+Import-Package: org.bouncycastle.asn1.cryptlib;version="[1.83.0,2.0.0)",
+ org.bouncycastle.jce.provider;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp.operator;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp.operator.jcajce;version="[1.83.0,2.0.0)",
+ org.bouncycastle.util.encoders;version="[1.83.0,2.0.0)",
+ org.eclipse.jgit.gpg.bc.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.gpg.bc.internal.keys;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.sha1;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.runner;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 05e504e..2ed7ba3 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 cc6eda7..c039403 100644
--- a/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
@@ -3,29 +3,29 @@
 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.6.0,7.7.0)"
+Fragment-Host: org.eclipse.jgit;bundle-version="[7.7.0,7.8.0)"
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/gpg_bc
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Import-Package: org.bouncycastle.asn1;version="[1.80.0,2.0.0)",
- org.bouncycastle.asn1.x9;version="[1.80.0,2.0.0)",
- org.bouncycastle.bcpg;version="[1.80.0,2.0.0)",
- org.bouncycastle.bcpg.sig;version="[1.80.0,2.0.0)",
- org.bouncycastle.crypto.ec;version="[1.80.0,2.0.0)",
- org.bouncycastle.gpg;version="[1.80.0,2.0.0)",
- org.bouncycastle.gpg.keybox;version="[1.80.0,2.0.0)",
- org.bouncycastle.gpg.keybox.jcajce;version="[1.80.0,2.0.0)",
- org.bouncycastle.jcajce.interfaces;version="[1.80.0,2.0.0)",
- org.bouncycastle.jcajce.util;version="[1.80.0,2.0.0)",
- org.bouncycastle.math.ec;version="[1.80.0,2.0.0)",
- org.bouncycastle.math.field;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp.jcajce;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp.operator;version="[1.80.0,2.0.0)",
- org.bouncycastle.openpgp.operator.jcajce;version="[1.80.0,2.0.0)",
- org.bouncycastle.util.encoders;version="[1.80.0,2.0.0)",
+Import-Package: org.bouncycastle.asn1;version="[1.83.0,2.0.0)",
+ org.bouncycastle.asn1.x9;version="[1.83.0,2.0.0)",
+ org.bouncycastle.bcpg;version="[1.83.0,2.0.0)",
+ org.bouncycastle.bcpg.sig;version="[1.83.0,2.0.0)",
+ org.bouncycastle.crypto.ec;version="[1.83.0,2.0.0)",
+ org.bouncycastle.gpg;version="[1.83.0,2.0.0)",
+ org.bouncycastle.gpg.keybox;version="[1.83.0,2.0.0)",
+ org.bouncycastle.gpg.keybox.jcajce;version="[1.83.0,2.0.0)",
+ org.bouncycastle.jcajce.interfaces;version="[1.83.0,2.0.0)",
+ org.bouncycastle.jcajce.util;version="[1.83.0,2.0.0)",
+ org.bouncycastle.math.ec;version="[1.83.0,2.0.0)",
+ org.bouncycastle.math.field;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp.jcajce;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp.operator;version="[1.83.0,2.0.0)",
+ org.bouncycastle.openpgp.operator.jcajce;version="[1.83.0,2.0.0)",
+ org.bouncycastle.util.encoders;version="[1.83.0,2.0.0)",
  org.slf4j;version="[1.7.0,3.0.0)"
-Export-Package: org.eclipse.jgit.gpg.bc.internal;version="7.6.0";x-friends:="org.eclipse.jgit.gpg.bc.test",
- org.eclipse.jgit.gpg.bc.internal.keys;version="7.6.0";x-friends:="org.eclipse.jgit.gpg.bc.test"
+Export-Package: org.eclipse.jgit.gpg.bc.internal;version="7.7.0";x-friends:="org.eclipse.jgit.gpg.bc.test",
+ org.eclipse.jgit.gpg.bc.internal.keys;version="7.7.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 82df526..556d256 100644
--- a/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.gpg.bc - Sources
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.gpg.bc;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.gpg.bc;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.gpg.bc/pom.xml b/org.eclipse.jgit.gpg.bc/pom.xml
index bfc3590..e6b2063 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 9b0f12f..0688783 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
 Bundle-Localization: OSGI-INF/l10n/plugin
@@ -27,11 +27,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.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)"
-Export-Package: org.eclipse.jgit.transport.http.apache;version="7.6.0";
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)"
+Export-Package: org.eclipse.jgit.transport.http.apache;version="7.7.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 cd65a4f..03c16b8 100644
--- a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.http.apache - Sources
 Bundle-SymbolicName: org.eclipse.jgit.http.apache.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml
index 55828b2..51be72e 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.apache</artifactId>
diff --git a/org.eclipse.jgit.http.server/.settings/.api_filters b/org.eclipse.jgit.http.server/.settings/.api_filters
index ad4bc68..9487cfb 100644
--- a/org.eclipse.jgit.http.server/.settings/.api_filters
+++ b/org.eclipse.jgit.http.server/.settings/.api_filters
@@ -28,6 +28,13 @@
                 <message_argument value="hasChunkedEncodingRequestBug(int[], HttpServletRequest)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="hasChunkedEncodingRequestBug(int[], HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/GitFilter.java" type="org.eclipse.jgit.http.server.GitFilter">
         <filter id="337682486">
@@ -96,6 +103,20 @@
                 <message_argument value="addUploadPackFilter(Filter)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="addReceivePackFilter(Filter)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="addUploadPackFilter(Filter)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/GitServlet.java" type="org.eclipse.jgit.http.server.GitServlet">
         <filter id="337682486">
@@ -164,6 +185,20 @@
                 <message_argument value="addUploadPackFilter(Filter)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="addReceivePackFilter(Filter)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="addUploadPackFilter(Filter)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/GitSmartHttpTools.java" type="org.eclipse.jgit.http.server.GitSmartHttpTools">
         <filter id="338792546">
@@ -355,6 +390,55 @@
                 <message_argument value="sendError(HttpServletRequest, HttpServletResponse, int, String)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="getResponseContentType(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="isGitClient(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="isInfoRefs(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="isReceivePack(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="isUploadPack(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="sendError(HttpServletRequest, HttpServletResponse, int)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="sendError(HttpServletRequest, HttpServletResponse, int, String)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/ReceivePackErrorHandler.java" type="org.eclipse.jgit.http.server.ReceivePackErrorHandler">
         <filter id="403804204">
@@ -390,6 +474,13 @@
                 <message_argument value="receive(HttpServletRequest, HttpServletResponse, ReceivePackErrorHandler.ReceivePackRunnable)"/>
             </message_arguments>
         </filter>
+        <filter id="1209008130">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="receive(HttpServletRequest, HttpServletResponse, ReceivePackErrorHandler.ReceivePackRunnable)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/RepositoryFilter.java" type="org.eclipse.jgit.http.server.RepositoryFilter">
         <filter id="337682486">
@@ -547,6 +638,41 @@
                 <message_argument value="sendPlainText(String, HttpServletRequest, HttpServletResponse)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="consumeRequestBody(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="getInputStream(HttpServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="getRepository(ServletRequest)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="send(byte[], HttpServletRequest, HttpServletResponse)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="sendPlainText(String, HttpServletRequest, HttpServletResponse)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/UploadPackErrorHandler.java" type="org.eclipse.jgit.http.server.UploadPackErrorHandler">
         <filter id="403804204">
@@ -582,6 +708,13 @@
                 <message_argument value="upload(HttpServletRequest, HttpServletResponse, UploadPackErrorHandler.UploadPackRunnable)"/>
             </message_arguments>
         </filter>
+        <filter id="1209008130">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="upload(HttpServletRequest, HttpServletResponse, UploadPackErrorHandler.UploadPackRunnable)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/glue/ErrorServlet.java" type="org.eclipse.jgit.http.server.glue.ErrorServlet">
         <filter id="337682486">
@@ -734,6 +867,20 @@
                 <message_argument value="with(HttpServlet)"/>
             </message_arguments>
         </filter>
+        <filter id="1209008130">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="through(Filter)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1209008130">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="with(HttpServlet)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/glue/WrappedRequest.java" type="org.eclipse.jgit.http.server.glue.WrappedRequest">
         <filter id="337682486">
@@ -774,6 +921,13 @@
                 <message_argument value="WrappedRequest(HttpServletRequest, String, String)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="WrappedRequest(HttpServletRequest, String, String)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/resolver/AsIsFileService.java" type="org.eclipse.jgit.http.server.resolver.AsIsFileService">
         <filter id="338792546">
@@ -803,6 +957,13 @@
                 <message_argument value="access(HttpServletRequest, Repository)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="access(HttpServletRequest, Repository)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/resolver/DefaultReceivePackFactory.java" type="org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory">
         <filter id="338792546">
@@ -832,6 +993,13 @@
                 <message_argument value="create(HttpServletRequest, Repository)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="create(HttpServletRequest, Repository)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/http/server/resolver/DefaultUploadPackFactory.java" type="org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory">
         <filter id="338792546">
@@ -861,5 +1029,12 @@
                 <message_argument value="create(HttpServletRequest, Repository)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="create(HttpServletRequest, Repository)"/>
+            </message_arguments>
+        </filter>
     </resource>
 </component>
diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
index 7dd34b1..db7c4ae 100644
--- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
@@ -3,31 +3,31 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.server
 Bundle-SymbolicName: org.eclipse.jgit.http.server
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Export-Package: org.eclipse.jgit.http.server;version="7.6.0",
- org.eclipse.jgit.http.server.glue;version="7.6.0";
+Export-Package: org.eclipse.jgit.http.server;version="7.7.0",
+ org.eclipse.jgit.http.server.glue;version="7.7.0";
   uses:="javax.servlet,
   	javax.servlet.http",
- org.eclipse.jgit.http.server.resolver;version="7.6.0";
+ org.eclipse.jgit.http.server.resolver;version="7.7.0";
   uses:="javax.servlet.http
    org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.transport,
 Import-Package: javax.servlet;version="[4.0.0,5.0.0)",
  javax.servlet.http;version="[4.0.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.parser;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.resolver;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)"
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.parser;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.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 3d42568..520c2fb 100644
--- a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.http.server - Sources
 Bundle-SymbolicName: org.eclipse.jgit.http.server.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml
index 826fc16..1409119 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 d71d636..bbc6eee 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.6.0.qualifier
+Bundle-Version: 7.7.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.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.http.server;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.http.server.glue;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.http.server.resolver;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http.apache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.resolver;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.http.server;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.http.server.glue;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.http.server.resolver;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http.apache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.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.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml
index ca5c99c..f9b623b 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.test</artifactId>
diff --git a/org.eclipse.jgit.junit.http/.settings/.api_filters b/org.eclipse.jgit.junit.http/.settings/.api_filters
index fc06291..bd156c7 100644
--- a/org.eclipse.jgit.junit.http/.settings/.api_filters
+++ b/org.eclipse.jgit.junit.http/.settings/.api_filters
@@ -55,6 +55,20 @@
                 <message_argument value="authBasic(ServletContextHandler, String[])"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="addContext(String)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="authBasic(ServletContextHandler, String[])"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/junit/http/HttpTestCase.java" type="org.eclipse.jgit.junit.http.HttpTestCase">
         <filter id="338792546">
@@ -84,6 +98,13 @@
                 <message_argument value="toURIish(ServletContextHandler, String)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="toURIish(ServletContextHandler, String)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/junit/http/MockServletConfig.java" type="org.eclipse.jgit.junit.http.MockServletConfig">
         <filter id="338792546">
diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
index fa7ef45..16c6c65 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -26,17 +26,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.6.0,7.7.0)",
- org.eclipse.jgit.http.server;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.resolver;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.http.server;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.7.0,7.8.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.6.0";
+Export-Package: org.eclipse.jgit.junit.http;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    javax.servlet,
    javax.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 64d2e4e..a913f90 100644
--- a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.junit.http - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.http.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml
index e549e00..7c90fdf 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 012f00b..04e96f9 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -34,16 +34,16 @@
  org.apache.sshd.server.subsystem;version="[2.17.1,2.18.0)",
  org.apache.sshd.sftp;version="[2.17.1,2.18.0)",
  org.apache.sshd.sftp.server;version="[2.17.1,2.18.0)",
- org.eclipse.jgit.annotations;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.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.6.0"
+Export-Package: org.eclipse.jgit.junit.ssh;version="7.7.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 9c1adcb..479ec13 100644
--- a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.junit.ssh - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.ssh.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit.ssh/pom.xml b/org.eclipse.jgit.junit.ssh/pom.xml
index 8d6d068..94397ab 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit.ssh</artifactId>
diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
index bf52865..78f0584 100644
--- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
@@ -3,38 +3,38 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit
 Bundle-SymbolicName: org.eclipse.jgit.junit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Import-Package: org.eclipse.jgit.annotations;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.dircache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.merge;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="7.6.0",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.io;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.time;version="[7.6.0,7.7.0)",
+Import-Package: org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.dircache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.merge;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="7.7.0",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.io;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.time;version="[7.7.0,7.8.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.6.0";
+Export-Package: org.eclipse.jgit.junit;version="7.7.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -47,4 +47,4 @@
    org.junit.runners.model,
    org.junit.runner,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.junit.time;version="7.6.0";uses:="org.eclipse.jgit.util.time"
+ org.eclipse.jgit.junit.time;version="7.7.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 cb07dc9..c313e01 100644
--- a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.junit - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.junit;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.junit;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml
index fa798c8..907fc47 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit</artifactId>
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 e877dee..43a6a0a 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -27,24 +27,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.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.server;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.server.fs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.test;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.server;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.test;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.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 2527ab9..d5427ac 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
diff --git a/org.eclipse.jgit.lfs.server/.settings/.api_filters b/org.eclipse.jgit.lfs.server/.settings/.api_filters
index 5694eaa..6c82731 100644
--- a/org.eclipse.jgit.lfs.server/.settings/.api_filters
+++ b/org.eclipse.jgit.lfs.server/.settings/.api_filters
@@ -97,6 +97,20 @@
                 <message_argument value="sendError(HttpServletResponse, int, String)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="getObjectToTransfer(HttpServletRequest, HttpServletResponse)"/>
+            </message_arguments>
+        </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="sendError(HttpServletResponse, int, String)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java" type="org.eclipse.jgit.lfs.server.fs.ObjectDownloadListener">
         <filter id="337682486">
@@ -132,6 +146,13 @@
                 <message_argument value="ObjectDownloadListener(FileLfsRepository, AsyncContext, HttpServletResponse, AnyLongObjectId)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="ObjectDownloadListener(FileLfsRepository, AsyncContext, HttpServletResponse, AnyLongObjectId)"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java" type="org.eclipse.jgit.lfs.server.fs.ObjectUploadListener">
         <filter id="337682486">
@@ -167,5 +188,12 @@
                 <message_argument value="ObjectUploadListener(FileLfsRepository, AsyncContext, HttpServletRequest, HttpServletResponse, AnyLongObjectId)"/>
             </message_arguments>
         </filter>
+        <filter id="1141899266">
+            <message_arguments>
+                <message_argument value="7.0"/>
+                <message_argument value="7.7"/>
+                <message_argument value="ObjectUploadListener(FileLfsRepository, AsyncContext, HttpServletRequest, HttpServletResponse, AnyLongObjectId)"/>
+            </message_arguments>
+        </filter>
     </resource>
 </component>
diff --git a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
index 4d024da..7563beb 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
@@ -3,21 +3,21 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.server
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Export-Package: org.eclipse.jgit.lfs.server;version="7.6.0";
+Export-Package: org.eclipse.jgit.lfs.server;version="7.7.0";
   uses:="javax.servlet.http,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.fs;version="7.6.0";
+ org.eclipse.jgit.lfs.server.fs;version="7.7.0";
   uses:="javax.servlet,
    javax.servlet.http,
    org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.internal;version="7.6.0";x-internal:=true,
- org.eclipse.jgit.lfs.server.s3;version="7.6.0";
+ org.eclipse.jgit.lfs.server.internal;version="7.7.0";x-internal:=true,
+ org.eclipse.jgit.lfs.server.s3;version="7.7.0";
   uses:="org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib"
 Import-Package: com.google.gson;version="[2.8.0,3.0.0)",
@@ -25,15 +25,15 @@
  javax.servlet.annotation;version="[4.0.0,5.0.0)",
  javax.servlet.http;version="[4.0.0,5.0.0)",
  org.apache.http;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http.apache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http.apache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.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 c2a8147..9dc8953 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.lfs.server - Sources
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.lfs.server/pom.xml b/org.eclipse.jgit.lfs.server/pom.xml
index 71bcec5..9867e18 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 d79ae9a..b9df9f9 100644
--- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
@@ -3,29 +3,29 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.test
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Import-Package: org.eclipse.jgit.api;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.attributes;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+Import-Package: org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.attributes;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.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.6.0";x-friends:="org.eclipse.jgit.lfs.server.test"
+Export-Package: org.eclipse.jgit.lfs.test;version="7.7.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 4f9de97..040b222 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 44d8477..0fe46c7 100644
--- a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
@@ -3,33 +3,33 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs
 Bundle-SymbolicName: org.eclipse.jgit.lfs
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Export-Package: org.eclipse.jgit.lfs;version="7.6.0",
- org.eclipse.jgit.lfs.errors;version="7.6.0",
- org.eclipse.jgit.lfs.internal;version="7.6.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.6.0"
+Export-Package: org.eclipse.jgit.lfs;version="7.7.0",
+ org.eclipse.jgit.lfs.errors;version="7.7.0",
+ org.eclipse.jgit.lfs.internal;version="7.7.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.7.0"
 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.6.0,7.7.0)";resolution:=optional,
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.attributes;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.diff;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.dircache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.hooks;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.io;version="[7.6.0,7.7.0)"
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)";resolution:=optional,
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.attributes;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.diff;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.dircache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.hooks;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.io;version="[7.7.0,7.8.0)"
diff --git a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
index cdc7cf9..5ecc42b 100644
--- a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.lfs - Sources
 Bundle-SymbolicName: org.eclipse.jgit.lfs.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.lfs/pom.xml b/org.eclipse.jgit.lfs/pom.xml
index 803606a..19546b7 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 c5521ee..0caab54 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.6.0.qualifier"
+      version="7.7.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 95ec4e9..a8ce298 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 1518beb..e37d622 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.7.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 f3f10fd..d59c8de 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 b9815d6..684d119 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.7.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 1f0ad42..00a0601 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 efbf3c0..8b28f14 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.7.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 a0f6e92..6e07e85 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 fef54ec..bb6b80a 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.7.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 74daa11..0d91543 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 868aa02..d053e0a 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
-      <import feature="org.eclipse.jgit.lfs" version="7.6.0" match="equivalent"/>
-      <import feature="org.eclipse.jgit.ssh.apache" version="7.6.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.7.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit.lfs" version="7.7.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit.ssh.apache" version="7.7.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 8812d72..6a8c021 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml
index 2d5152f..bceab00 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml
@@ -216,6 +216,12 @@
    <bundle id="slf4j.simple.source">
       <category name="JGit-dependency-bundles"/>
    </bundle>
+   <bundle id="jcl.over.slf4j">
+      <category name="JGit-dependency-bundles"/>
+   </bundle>
+   <bundle id="jcl.over.slf4j.source">
+      <category name="JGit-dependency-bundles"/>
+   </bundle>
    <bundle id="org.tukaani.xz">
       <category name="JGit-dependency-bundles"/>
    </bundle>
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 5c71af5..9a1fd3a 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 bfb5360..73f1ecd 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.7.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 4eb2a6d..c5b7592 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.6.0-SNAPSHOT</version>
+    <version>7.7.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.6.0-SNAPSHOT</version>
+      <version>7.7.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 cc7a9d6..edb2020 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="7.7.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 bd38360..0b97560 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 ab0775e..706918f 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.6.0.qualifier"
+      version="7.7.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.6.0" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="7.7.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 7d881a5..8db7e69 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
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 2a5319e..6e1c72a 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="1770853782">
+<target name="jgit-4.34" sequenceNumber="1772188163">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -58,6 +58,12 @@
           <version>2.0.17</version>
           <type>jar</type>
         </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl-over-slf4j</artifactId>
+          <version>2.0.17</version>
+          <type>jar</type>
+        </dependency>
       </dependencies>
     </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
@@ -107,61 +113,61 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-servlet</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-nested</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -207,13 +213,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -271,7 +277,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.20.0</version>
+          <version>1.21.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
index b9084c8..9134dd0 100644
--- 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
@@ -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.35" sequenceNumber="1770853782">
+<target name="jgit-4.35" sequenceNumber="1772188163">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -58,6 +58,12 @@
           <version>2.0.17</version>
           <type>jar</type>
         </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl-over-slf4j</artifactId>
+          <version>2.0.17</version>
+          <type>jar</type>
+        </dependency>
       </dependencies>
     </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
@@ -107,61 +113,61 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-servlet</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-nested</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -207,13 +213,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -271,7 +277,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.20.0</version>
+          <version>1.21.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.36.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.36.target
index 786f0e5..beb25fd 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.36.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.36.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.36" sequenceNumber="1770853782">
+<target name="jgit-4.36" sequenceNumber="1772188163">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -58,6 +58,12 @@
           <version>2.0.17</version>
           <type>jar</type>
         </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl-over-slf4j</artifactId>
+          <version>2.0.17</version>
+          <type>jar</type>
+        </dependency>
       </dependencies>
     </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
@@ -107,61 +113,61 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-servlet</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-nested</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -207,13 +213,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -271,7 +277,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.20.0</version>
+          <version>1.21.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.37.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.37.target
index 54d77d0..1c9135c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.37.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.37.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.37" sequenceNumber="1770853782">
+<target name="jgit-4.37" sequenceNumber="1772188163">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -58,6 +58,12 @@
           <version>2.0.17</version>
           <type>jar</type>
         </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl-over-slf4j</artifactId>
+          <version>2.0.17</version>
+          <type>jar</type>
+        </dependency>
       </dependencies>
     </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
@@ -107,61 +113,61 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-servlet</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-nested</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -207,13 +213,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -271,7 +277,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.20.0</version>
+          <version>1.21.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.38.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.38.target
index 7eef45f..0d838d8 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.38.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.38.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.38" sequenceNumber="1770853782">
+<target name="jgit-4.38" sequenceNumber="1772188163">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -58,6 +58,12 @@
           <version>2.0.17</version>
           <type>jar</type>
         </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl-over-slf4j</artifactId>
+          <version>2.0.17</version>
+          <type>jar</type>
+        </dependency>
       </dependencies>
     </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
@@ -107,61 +113,61 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-servlet</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-nested</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -207,13 +213,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -271,7 +277,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.20.0</version>
+          <version>1.21.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.39.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.39.target
index 786afff..6ce26dd 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.39.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.39.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.39" sequenceNumber="1770853782">
+<target name="jgit-4.39" sequenceNumber="1772188163">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20230916-1400"/>
@@ -24,8 +24,8 @@
       <unit id="org.objectweb.asm.util" version="9.9.1"/>
       <unit id="org.objectweb.asm.tree" version="9.9.1"/>
       <unit id="org.objectweb.asm.tree.analysis" version="9.9.1"/>
-      <unit id="org.objenesis" version="3.4.0"/>
-      <unit id="org.objenesis.source" version="3.4.0"/>
+      <unit id="org.objenesis" version="3.5.0"/>
+      <unit id="org.objenesis.source" version="3.5.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/2026-03"/>
@@ -58,6 +58,12 @@
           <version>2.0.17</version>
           <type>jar</type>
         </dependency>
+        <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl-over-slf4j</artifactId>
+          <version>2.0.17</version>
+          <type>jar</type>
+        </dependency>
       </dependencies>
     </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="sshd">
@@ -107,61 +113,61 @@
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-servlet</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-nested</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty.ee8</groupId>
           <artifactId>jetty-ee8-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-http</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-io</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-security</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-server</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-session</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-util-ajax</artifactId>
-          <version>12.1.5</version>
+          <version>12.1.6</version>
           <type>jar</type>
         </dependency>
         <dependency>
@@ -207,13 +213,13 @@
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
         <dependency>
           <groupId>net.bytebuddy</groupId>
           <artifactId>byte-buddy-agent</artifactId>
-          <version>1.18.4</version>
+          <version>1.18.5</version>
           <type>jar</type>
         </dependency>
       </dependencies>
@@ -271,7 +277,7 @@
         <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
-          <version>1.20.0</version>
+          <version>1.21.0</version>
           <type>jar</type>
         </dependency>
         <dependency>
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 b42c0d8..175141c 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.20.0"
+		version = "1.21.0"
 	}
 	dependency {
 		groupId = "org.apache.commons"
@@ -97,12 +97,12 @@
 	dependency {
 		groupId = "net.bytebuddy"
 		artifactId = "byte-buddy"
-		version = "1.18.4"
+		version = "1.18.5"
 	}
 	dependency {
 		groupId = "net.bytebuddy"
 		artifactId = "byte-buddy-agent"
-		version = "1.18.4"
+		version = "1.18.5"
 	}
 }
 
@@ -154,52 +154,52 @@
 	dependency {
 		groupId = "org.eclipse.jetty.ee8"
 		artifactId = "jetty-ee8-servlet"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty.ee8"
 		artifactId = "jetty-ee8-nested"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty.ee8"
 		artifactId = "jetty-ee8-security"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-http"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-io"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-security"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-server"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-session"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-util"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "org.eclipse.jetty"
 		artifactId = "jetty-util-ajax"
-		version = "12.1.5"
+		version = "12.1.6"
 	}
 	dependency {
 		groupId = "javax.servlet"
@@ -273,6 +273,11 @@
 		artifactId = "slf4j-simple"
 		version = "2.0.17"
 	}
+	dependency {
+		groupId = "org.slf4j"
+		artifactId = "jcl-over-slf4j"
+		version = "2.0.17"
+	}
 }
 
 maven xz
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.39.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.39.tpd
index 48725ca..54f7789 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.39.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/orbit-4.39.tpd
@@ -22,8 +22,8 @@
 	org.objectweb.asm.util [9.9.1,9.9.1]
 	org.objectweb.asm.tree [9.9.1,9.9.1]
 	org.objectweb.asm.tree.analysis [9.9.1,9.9.1]
-	org.objenesis [3.4,3.4]
-	org.objenesis.source [3.4,3.4]
+	org.objenesis [3.5.0,3.5.0]
+	org.objenesis.source [3.5.0,3.5.0]
 	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 07f6f21..2a73924 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.6.0-SNAPSHOT</version>
+  <version>7.7.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>JGit Tycho Parent</name>
diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
index 5f81b7d..28b0ced 100644
--- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
@@ -3,31 +3,31 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.pgm.test
 Bundle-SymbolicName: org.eclipse.jgit.pgm.test
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Import-Package: org.eclipse.jgit.api;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.diff;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.dircache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.merge;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.pgm;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.pgm.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.pgm.opt;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.io;version="[7.6.0,7.7.0)",
+Import-Package: org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.diff;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.dircache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.merge;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.pgm;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.pgm.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.pgm.opt;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.io;version="[7.7.0,7.8.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 de0a37a..f41d83d 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm.test</artifactId>
diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
index 95eff34..60e9480 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -16,50 +16,50 @@
  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.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.archive;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.awtui;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.blame;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.diff;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.dircache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.gitrepo;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.io;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.midx;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.server;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.server.fs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs.server.s3;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.merge;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.notes;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revplot;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http.apache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.resolver;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.ssh.jsch;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.sshd;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.io;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.archive;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.awtui;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.blame;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.diff;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.dircache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.gitrepo;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.io;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.midx;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.server;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs.server.s3;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.merge;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.notes;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revplot;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http.apache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.ssh.jsch;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.sshd;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.io;version="[7.7.0,7.8.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.6.0";
+Export-Package: org.eclipse.jgit.console;version="7.7.0";
  uses:="org.eclipse.jgit.transport,
   org.eclipse.jgit.util",
- org.eclipse.jgit.pgm;version="7.6.0";
+ org.eclipse.jgit.pgm;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util.io,
    org.eclipse.jgit.awtui,
@@ -71,14 +71,14 @@
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.api,
    javax.swing",
- org.eclipse.jgit.pgm.debug;version="7.6.0";
+ org.eclipse.jgit.pgm.debug;version="7.7.0";
   uses:="org.eclipse.jgit.util.io,
    org.eclipse.jgit.pgm,
    org.eclipse.jetty.servlet",
- org.eclipse.jgit.pgm.internal;version="7.6.0";
+ org.eclipse.jgit.pgm.internal;version="7.7.0";
   x-friends:="org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.test",
- org.eclipse.jgit.pgm.opt;version="7.6.0";
+ org.eclipse.jgit.pgm.opt;version="7.7.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 dcb5519..65901e0 100644
--- a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.pgm - Sources
 Bundle-SymbolicName: org.eclipse.jgit.pgm.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml
index f1ead81..1cd2a7c 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm</artifactId>
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java
index a7df4fa..81fc0e8 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java
@@ -13,19 +13,13 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.LinkedHashMap;
 
+import org.eclipse.jgit.internal.storage.file.MidxWriter;
 import org.eclipse.jgit.internal.storage.file.ObjectDirectory;
-import org.eclipse.jgit.internal.storage.file.Pack;
-import org.eclipse.jgit.internal.storage.file.PackFile;
-import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.midx.MultiPackIndexPrettyPrinter;
-import org.eclipse.jgit.internal.storage.midx.MultiPackIndexWriter;
-import org.eclipse.jgit.internal.storage.pack.PackExt;
-import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.TextProgressMonitor;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -85,22 +79,7 @@ private void writeMultiPackIndex() throws IOException {
 		errw.println("Writing " + midx.getAbsolutePath());
 
 		ObjectDirectory odb = (ObjectDirectory) db.getObjectDatabase();
-
-		LinkedHashMap<String, PackIndex> indexes = new LinkedHashMap<>();
-		for (Pack pack : odb.getPacks()) {
-			PackFile packFile = pack.getPackFile().create(PackExt.INDEX);
-			try {
-				indexes.put(packFile.getName(), pack.getIndex());
-			} catch (IOException e) {
-				throw die("Cannot open index in pack", e);
-			}
-		}
-
-		MultiPackIndexWriter writer = new MultiPackIndexWriter();
-		try (FileOutputStream out = new FileOutputStream(midxPath)) {
-			writer.write(NullProgressMonitor.INSTANCE, out, indexes);
-		} catch (IOException e) {
-			throw die("Cannot write midx " + midxPath, e);
-		}
+		MidxWriter.writeMidx(new TextProgressMonitor(errw), odb.getPacks(),
+				midx);
 	}
 }
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 2ef7256..1dc3728 100644
--- a/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
@@ -2,17 +2,17 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.agent;singleton:=true
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/agent
 Bundle-Vendor: %Bundle-Vendor
-Fragment-Host: org.eclipse.jgit.ssh.apache;bundle-version="[7.6.0,7.7.0)"
+Fragment-Host: org.eclipse.jgit.ssh.apache;bundle-version="[7.7.0,7.8.0)"
 Bundle-ActivationPolicy: lazy
 Automatic-Module-Name: org.eclipse.jgit.ssh.apache.agent
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Import-Package: org.eclipse.jgit.transport.sshd;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)"
+Import-Package: org.eclipse.jgit.transport.sshd;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.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.6.0";x-internal:=true
+Export-Package: org.eclipse.jgit.internal.transport.sshd.agent.connector;version="7.7.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 56d463f..a085c04 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,6 +3,6 @@
 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache.agent;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache.agent;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.apache.agent/pom.xml b/org.eclipse.jgit.ssh.apache.agent/pom.xml
index 9c2bf03..4d7b7c2 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 d2bf5ae..ae9e11e 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -26,22 +26,22 @@
  org.apache.sshd.core;version="[2.17.1,2.18.0)",
  org.apache.sshd.server;version="[2.17.1,2.18.0)",
  org.apache.sshd.server.forward;version="[2.17.1,2.18.0)",
- org.eclipse.jgit.annotations;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.signing.ssh;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.sshd;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.sshd.proxy;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit.ssh;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.sshd;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.sshd.agent;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.signing.ssh;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.sshd;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.sshd.proxy;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit.ssh;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.sshd;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.sshd.agent;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.ssh.apache.test/pom.xml b/org.eclipse.jgit.ssh.apache.test/pom.xml
index 5a9057f..2ab6c39 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache.test</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
index 7a7d7e1..2647126 100644
--- a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
@@ -6,11 +6,11 @@
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-ActivationPolicy: lazy
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Export-Package: org.eclipse.jgit.internal.signing.ssh;version="7.6.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
- org.eclipse.jgit.internal.transport.sshd;version="7.6.0";x-friends:="org.eclipse.jgit.ssh.apache.test";
+Export-Package: org.eclipse.jgit.internal.signing.ssh;version="7.7.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
+ org.eclipse.jgit.internal.transport.sshd;version="7.7.0";x-friends:="org.eclipse.jgit.ssh.apache.test";
   uses:="org.apache.sshd.client,
    org.apache.sshd.client.auth,
    org.apache.sshd.client.auth.keyboard,
@@ -25,20 +25,20 @@
    org.apache.sshd.common.signature,
    org.apache.sshd.common.util.buffer,
    org.eclipse.jgit.transport",
- org.eclipse.jgit.internal.transport.sshd.agent;version="7.6.0";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.auth;version="7.6.0";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.pkcs11;version="7.6.0";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.proxy;version="7.6.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
- org.eclipse.jgit.signing.ssh;version="7.6.0";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.transport.sshd;version="7.6.0";
+ org.eclipse.jgit.internal.transport.sshd.agent;version="7.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.auth;version="7.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.pkcs11;version="7.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.proxy;version="7.7.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
+ org.eclipse.jgit.signing.ssh;version="7.7.0";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.transport.sshd;version="7.7.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.6.0"
-Import-Package: org.bouncycastle.jce.provider;version="[1.80.0,2.0.0)",
+ org.eclipse.jgit.transport.sshd.agent;version="7.7.0"
+Import-Package: org.bouncycastle.jce.provider;version="[1.83.0,2.0.0)",
  org.apache.sshd.agent;version="[2.17.1,2.18.0)",
  org.apache.sshd.client;version="[2.17.1,2.18.0)",
  org.apache.sshd.client.auth;version="[2.17.1,2.18.0)",
@@ -91,14 +91,14 @@
  org.apache.sshd.sftp;version="[2.17.1,2.18.0)",
  org.apache.sshd.sftp.client;version="[2.17.1,2.18.0)",
  org.apache.sshd.sftp.common;version="[2.17.1,2.18.0)",
- org.eclipse.jgit.annotations;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.fnmatch;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.fnmatch;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.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 5ef864b..fa44087 100644
--- a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.ssh.apache - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.apache/pom.xml b/org.eclipse.jgit.ssh.apache/pom.xml
index 3edf6e6..18cba18 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache</artifactId>
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 4632a36..73ef145 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
 Import-Package: com.jcraft.jsch;version="[0.1.54,0.2.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit.ssh;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.ssh.jsch;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit.ssh;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.ssh.jsch;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;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 70b0af0..176c91d 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 436d251..9093f85 100644
--- a/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
@@ -3,20 +3,20 @@
 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.6.0,7.7.0)"
+Fragment-Host: org.eclipse.jgit;bundle-version="[7.7.0,7.8.0)"
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: OSGI-INF/l10n/jsch
 Bundle-ActivationPolicy: lazy
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Export-Package: org.eclipse.jgit.transport.ssh.jsch;version="7.6.0"
+Export-Package: org.eclipse.jgit.transport.ssh.jsch;version="7.7.0"
 Import-Package: com.jcraft.jsch;version="[0.1.37,0.2.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.io;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.io;version="[7.7.0,7.8.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 7cba329..4863dae 100644
--- a/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.ssh.jsch - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.jsch;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.jsch;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.jsch/pom.xml b/org.eclipse.jgit.ssh.jsch/pom.xml
index 91caa5e..b8e2e4c 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.6.0-SNAPSHOT</version>
+    <version>7.7.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 bee0f49..36a9e4f 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.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-17
@@ -21,66 +21,66 @@
  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.6.0,7.7.0)",
- org.eclipse.jgit.api;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.api.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.archive;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.attributes;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.awtui;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.blame;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.blame.cache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.diff;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.dircache;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.events;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.fnmatch;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.gitrepo;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.hooks;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.ignore;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.ignore.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.diff;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.fsck;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.commitgraph;version="7.6.0",
- org.eclipse.jgit.internal.storage.dfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.io;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.memory;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.midx;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.connectivity;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.parser;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.junit.time;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lfs;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.logging;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.merge;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.notes;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.patch;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.pgm;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.pgm.internal;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revplot;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.file;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.storage.pack;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.submodule;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.http;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport.resolver;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.io;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util.sha1;version="[7.6.0,7.7.0)",
+ org.eclipse.jgit.annotations;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.api.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.archive;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.attributes;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.awtui;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.blame;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.blame.cache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.diff;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.dircache;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.events;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.fnmatch;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.gitrepo;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.hooks;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.ignore;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.ignore.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.diff;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.fsck;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.commitgraph;version="7.7.0",
+ org.eclipse.jgit.internal.storage.dfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.io;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.memory;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.midx;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.connectivity;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.parser;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.junit.time;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lfs;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.logging;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.merge;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.notes;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.patch;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.pgm;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.pgm.internal;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revplot;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.file;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.storage.pack;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.submodule;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.http;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.io;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util.sha1;version="[7.7.0,7.8.0)",
  org.hamcrest;version="[3.0.0,4.0.0)",
  org.hamcrest.collection;version="[3.0.0,4.0.0)",
  org.junit;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java
index 334e52b..3aa6d69 100644
--- a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java
+++ b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java
@@ -25,13 +25,10 @@
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.jgit.internal.storage.file.Pack;
 import org.eclipse.jgit.internal.storage.file.PackFile;
-import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.pack.PackExt;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
@@ -93,15 +90,15 @@ public void jgit_loadsCgitMidx()
 	}
 
 	private byte[] generateJGitMidx() throws IOException {
-		Map<String, PackIndex> indexes = new HashMap<>();
+		PackIndexMerger.Builder builder = PackIndexMerger.builder();
 		for (Pack pack : db.getObjectDatabase().getPacks()) {
 			PackFile packFile = pack.getPackFile().create(PackExt.INDEX);
-			indexes.put(packFile.getName(), pack.getIndex());
+			builder.addPack(packFile.getName(), pack.getIndex());
 		}
 
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, indexes);
+		writer.write(NullProgressMonitor.INSTANCE, out, builder.build());
 		return out.toByteArray();
 	}
 
diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml
index 387f168..92a7597 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.test</artifactId>
diff --git a/org.eclipse.jgit.test/src/org/eclipse/jgit/internal/storage/dfs/MidxTestUtils.java b/org.eclipse.jgit.test/src/org/eclipse/jgit/internal/storage/dfs/MidxTestUtils.java
index c5210c8..e155f5d 100644
--- a/org.eclipse.jgit.test/src/org/eclipse/jgit/internal/storage/dfs/MidxTestUtils.java
+++ b/org.eclipse.jgit.test/src/org/eclipse/jgit/internal/storage/dfs/MidxTestUtils.java
@@ -150,8 +150,12 @@ static DfsPackFileMidx writeMultipackIndex(DfsRepository db,
 				Arrays.asList(packs),
 				base != null ? base.getPackDescription() : null, packConfig);
 		db.getObjectDatabase().commitPack(List.of(desc), null);
+
+		// "packs" argument can have a midx and its base in the list.
+		List<DfsPackFile> allPlainPacks = MidxPackList
+				.create(db.getObjectDatabase().getPacks()).getAllPlainPacks();
 		return DfsPackFileMidx.create(DfsBlockCache.getInstance(), desc,
-				Arrays.asList(packs), base);
+				allPlainPacks, base);
 	}
 
 	record CommitObjects(RevCommit commit, RevTree tree, RevBlob blob) {
@@ -169,9 +173,7 @@ static List<CommitObjects> writeCommitChain(DfsRepository db,
 		}
 
 		try (TestRepository<InMemoryRepository> repository = new TestRepository<>(
-				(InMemoryRepository) db);
-				DfsInserter ins = (DfsInserter) db.getObjectDatabase()
-						.newInserter()) {
+				(InMemoryRepository) db)) {
 			for (int i = 0; i < length; i++) {
 				RevBlob blob = repository.blob("blob" + commitCounter);
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
index 2266772..0d87109 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
@@ -27,6 +27,7 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.nio.file.Files;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
@@ -110,6 +111,46 @@ public void testAddExistingSingleFile() throws IOException, GitAPIException {
 	}
 
 	@Test
+	public void testAddExistingMultipleFiles()
+			throws IOException, GitAPIException {
+		File file = new File(db.getWorkTree(), "a.txt");
+		FileUtils.createNewFile(file);
+		file = new File(db.getWorkTree(), "b.txt");
+		FileUtils.createNewFile(file);
+		try (PrintWriter writer = new PrintWriter(file, UTF_8.name())) {
+			writer.print("content");
+		}
+
+		try (Git git = new Git(db)) {
+			git.add().addFilepatterns("a.txt", "b.txt").call();
+
+			assertEquals(
+					"[a.txt, mode:100644, content:][b.txt, mode:100644, content:content]",
+					indexState(CONTENT));
+		}
+	}
+
+	@Test
+	public void testAddExistingMultipleFilesCollection()
+			throws IOException, GitAPIException {
+		File file = new File(db.getWorkTree(), "a.txt");
+		FileUtils.createNewFile(file);
+		file = new File(db.getWorkTree(), "b.txt");
+		FileUtils.createNewFile(file);
+		try (PrintWriter writer = new PrintWriter(file, UTF_8.name())) {
+			writer.print("content");
+		}
+
+		try (Git git = new Git(db)) {
+			git.add().addFilepatterns(List.of("a.txt", "b.txt")).call();
+
+			assertEquals(
+					"[a.txt, mode:100644, content:][b.txt, mode:100644, content:content]",
+					indexState(CONTENT));
+		}
+	}
+
+	@Test
 	public void testAddLink() throws IOException, GitAPIException {
 		assumeTrue(db.getFS().supportsSymlinks());
 		try (Git git = new Git(db)) {
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 3f5c5da..cb91b12 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
@@ -11,6 +11,8 @@
 
 import static org.eclipse.jgit.api.CherryPickCommitMessageProvider.ORIGINAL;
 import static org.eclipse.jgit.api.CherryPickCommitMessageProvider.ORIGINAL_WITH_REFERENCE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -22,6 +24,7 @@
 import java.util.Iterator;
 
 import org.eclipse.jgit.api.CherryPickResult.CherryPickStatus;
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.ResetCommand.ResetType;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -396,6 +399,23 @@ public void testCherryPickConflictMarkers() throws Exception {
 	}
 
 	@Test
+	public void testCherryPickConflictDiff3Markers() throws Exception {
+		try (Git git = new Git(db)) {
+			RevCommit sideCommit = prepareCherryPick(git);
+
+			db.getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+					CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+			CherryPickResult result = git.cherryPick()
+					.include(sideCommit.getId()).call();
+			assertEquals(CherryPickStatus.CONFLICTING, result.getStatus());
+
+			String expected = "<<<<<<< master\na(master)\n||||||| BASE\na\n=======\na(side)\n>>>>>>> 527460a side\n";
+			checkFile(new File(db.getWorkTree(), "a"), expected);
+		}
+	}
+
+	@Test
 	public void testCherryPickConflictFiresModifiedEvent() throws Exception {
 		ListenerHandle listener = null;
 		try (Git git = new Git(db)) {
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 1ec5067..086e261 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
@@ -10,6 +10,8 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.lib.Constants.MASTER;
 import static org.eclipse.jgit.lib.Constants.R_HEADS;
 import static org.junit.Assert.assertEquals;
@@ -27,6 +29,7 @@
 import java.util.Iterator;
 import java.util.regex.Pattern;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.api.ResetCommand.ResetType;
@@ -2220,4 +2223,37 @@ private void checkMergeFailedResult(final MergeResult result,
 		assertEquals(null, result.getConflicts());
 		assertEquals(RepositoryState.SAFE, db.getRepositoryState());
 	}
+
+	@Test
+	public void testDiff3ConflictStyle() throws Exception {
+		try (Git git = new Git(db)) {
+			writeTrashFile("a", "1\na\n3\n");
+			git.add().addFilepattern("a").call();
+			RevCommit initialCommit = git.commit().setMessage("initial").call();
+
+			createBranch(initialCommit, "refs/heads/side");
+			checkoutBranch("refs/heads/side");
+
+			writeTrashFile("a", "1\na(side)\n3\n");
+			git.add().addFilepattern("a").call();
+			RevCommit secondCommit = git.commit().setMessage("side").call();
+
+			checkoutBranch("refs/heads/master");
+
+			writeTrashFile("a", "1\na(main)\n3\n");
+			git.add().addFilepattern("a").call();
+			git.commit().setMessage("main").call();
+
+			db.getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+					CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+			MergeResult result = git.merge().include(secondCommit.getId())
+					.setStrategy(MergeStrategy.RESOLVE).call();
+			assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus());
+
+			assertEquals(
+					"1\n<<<<<<< HEAD\na(main)\n||||||| BASE\na\n=======\na(side)\n>>>>>>> d97aebf6e0bbdb3f21f8a22ec8cbf1ac24d986d8\n3\n",
+					read(new File(db.getWorkTree(), "a")));
+		}
+	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java
index 695681d..8d6e7bc 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java
@@ -10,6 +10,8 @@
 package org.eclipse.jgit.api;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -25,6 +27,7 @@
 import java.util.concurrent.Callable;
 
 import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode;
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.api.errors.NoHeadException;
 import org.eclipse.jgit.junit.JGitTestUtil;
@@ -163,6 +166,40 @@ public void testPullConflict() throws Exception {
 	}
 
 	@Test
+	public void testPullConflictDiff3() throws Exception {
+		PullResult res = target.pull().call();
+		// nothing to update since we don't have different data yet
+		assertTrue(res.getFetchResult().getTrackingRefUpdates().isEmpty());
+		assertTrue(res.getMergeResult().getMergeStatus()
+				.equals(MergeStatus.ALREADY_UP_TO_DATE));
+
+		assertFileContentsEqual(targetFile, "Hello world");
+
+		// change the source file
+		writeToFile(sourceFile, "Source change");
+		source.add().addFilepattern("SomeFile.txt").call();
+		source.commit().setMessage("Source change in remote").call();
+
+		// change the target file
+		writeToFile(targetFile, "Target change");
+		target.add().addFilepattern("SomeFile.txt").call();
+		target.commit().setMessage("Target change in local").call();
+
+		target.getRepository().getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+				CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+		target.pull().call();
+
+		String sourceChangeString = "Source change\n>>>>>>> branch 'master' of "
+				+ target.getRepository().getConfig().getString("remote",
+						"origin", "url");
+
+		assertFileContentsEqual(targetFile, "<<<<<<< HEAD\n" + "Target change\n"
+				+ "||||||| BASE\n" + "Hello world\n" + "=======\n"
+				+ sourceChangeString + "\n");
+	}
+
+	@Test
 	public void testPullConflictTheirs() throws Exception {
 		PullResult res = target.pull().call();
 		// nothing to update since we don't have different data yet
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 4c8cf06..d99c285 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
@@ -10,6 +10,8 @@
 package org.eclipse.jgit.api;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -30,6 +32,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.api.RebaseCommand.InteractiveHandler;
 import org.eclipse.jgit.api.RebaseCommand.InteractiveHandler2;
@@ -371,6 +374,43 @@ public void testRebaseNoMergeBaseConflict() throws Exception {
 	}
 
 	/**
+	 * Create a commit A and an unrelated commit B creating the same file with
+	 * different content. Then rebase A onto B. The rebase should stop with a
+	 * conflict and the conflict style should be DIFF3.
+	 *
+	 * @throws Exception on errors
+	 */
+	@Test
+	public void testRebaseNoMergeBaseConflictDiff3() throws Exception {
+		writeTrashFile(FILE1, FILE1);
+		git.add().addFilepattern(FILE1).call();
+		RevCommit first = git.commit().setMessage("Add file").call();
+		File file1 = new File(db.getWorkTree(), FILE1);
+		assertTrue(file1.exists());
+		// Create an independent branch
+		git.checkout().setOrphan(true).setName("orphan").call();
+		git.rm().addFilepattern(FILE1).call();
+		assertFalse(file1.exists());
+		writeTrashFile(FILE1, "something else");
+		git.add().addFilepattern(FILE1).call();
+		git.commit().setMessage("Orphan").call();
+		checkoutBranch("refs/heads/master");
+		assertEquals(first.getId(), db.resolve("HEAD"));
+
+		db.getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+				CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+		RebaseResult res = git.rebase().setUpstream("refs/heads/orphan").call();
+		assertEquals(Status.STOPPED, res.getStatus());
+		assertEquals(first, res.getCurrentCommit());
+		checkFile(file1,
+				"<<<<<<< Upstream, based on orphan\n" + "something else\n"
+						+ "||||||| BASE\n" + "=======\n" + "file1\n"
+						+ ">>>>>>> "
+						+ first.abbreviate(7).name() + " Add file\n");
+	}
+
+	/**
 	 * Create the following commits and then attempt to rebase topic onto
 	 * master. This will serialize the branches.
 	 *
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 89fdb32..a7a1dff 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
@@ -9,6 +9,8 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_ABBREV_STRING_LENGTH;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -20,6 +22,7 @@
 import java.io.IOException;
 import java.util.Iterator;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.api.ResetCommand.ResetType;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -377,6 +380,25 @@ public void testRevertConflictMarkers() throws Exception {
 	}
 
 	@Test
+	public void testRevertConflictMarkersDiff3() throws Exception {
+		try (Git git = new Git(db)) {
+			RevCommit sideCommit = prepareRevert(git);
+
+			db.getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+					CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+			RevertCommand revert = git.revert();
+			RevCommit newHead = revert.include(sideCommit.getId()).call();
+			assertNull(newHead);
+			MergeResult result = revert.getFailingResult();
+			assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus());
+
+			String expected = "<<<<<<< master\na(latest)\n||||||| BASE\na(previous)\n=======\na\n>>>>>>> ca96c31 second master\n";
+			checkFile(new File(db.getWorkTree(), "a"), expected);
+		}
+	}
+
+	@Test
 	public void testRevertOurCommitName() throws Exception {
 		try (Git git = new Git(db)) {
 			RevCommit sideCommit = prepareRevert(git);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java
index 49b31b1..b169fac 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java
@@ -9,15 +9,19 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.text.MessageFormat;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.errors.InvalidRefNameException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
 import org.eclipse.jgit.api.errors.NoHeadException;
@@ -429,6 +433,43 @@ public void stashedContentMerge() throws Exception {
 	}
 
 	@Test
+	public void stashedContentMergeDiff3() throws Exception {
+		writeTrashFile(PATH, "content\nmore content\n");
+		git.add().addFilepattern(PATH).call();
+		git.commit().setMessage("more content").call();
+
+		writeTrashFile(PATH, "content\nhead change\nmore content\n");
+		git.add().addFilepattern(PATH).call();
+		git.commit().setMessage("even content").call();
+
+		writeTrashFile(PATH, "content\nstashed change\nmore content\n");
+
+		db.getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+				CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+		RevCommit stashed = git.stashCreate().call();
+		assertNotNull(stashed);
+		assertEquals("content\nhead change\nmore content\n",
+				read(committedFile));
+		assertTrue(git.status().call().isClean());
+		recorder.assertEvent(new String[] { PATH }, ChangeRecorder.EMPTY);
+
+		writeTrashFile(PATH, "content\nmore content\ncommitted change\n");
+		git.add().addFilepattern(PATH).call();
+		git.commit().setMessage("committed change").call();
+		recorder.assertNoEvent();
+
+		assertThrows(StashApplyFailureException.class,
+				() -> git.stashApply().call());
+		recorder.assertEvent(new String[] { PATH }, ChangeRecorder.EMPTY);
+		Status status = new StatusCommand(db).call();
+		assertEquals(1, status.getConflicting().size());
+		assertEquals(
+				"content\n<<<<<<< HEAD\n||||||| stashed HEAD\nhead change\n=======\nstashed change\n>>>>>>> stash\nmore content\ncommitted change\n",
+				read(PATH));
+	}
+
+	@Test
 	public void stashedContentMergeXtheirs() throws Exception {
 		writeTrashFile(PATH, "content\nmore content\n");
 		git.add().addFilepattern(PATH).call();
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 c5acb95..01eab37 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
@@ -1498,7 +1498,7 @@ private static DfsPackFile findFirstBySource(DfsPackFile[] packs, PackSource sou
 	private DfsPackDescription midx(List<DfsPackFile> coveredPacks,
 			DfsPackDescription base) throws IOException {
 		DfsPackDescription midx = DfsMidxWriter.writeMidx(NULL_PM, odb,
-				coveredPacks, base);
+				coveredPacks, base, null);
 		git.tick(1);
 		midx.setLastModified(git.getInstant().toEpochMilli());
 		return midx;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriterBitmapsTest.java
similarity index 98%
rename from org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriterTest.java
rename to org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriterBitmapsTest.java
index ac89baa..0872dd4 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriterBitmapsTest.java
@@ -37,7 +37,7 @@
 import com.googlecode.javaewah.EWAHCompressedBitmap;
 
 @RunWith(Parameterized.class)
-public class DfsMidxWriterTest {
+public class DfsMidxWriterBitmapsTest {
 
 	@Parameterized.Parameters(name = "{0}")
 	public static Iterable<TestInput> data() throws Exception {
@@ -55,7 +55,7 @@ public String toString() {
 
 	private TestInput ti;
 
-	public DfsMidxWriterTest(TestInput ti) {
+	public DfsMidxWriterBitmapsTest(TestInput ti) {
 		this.ti = ti;
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java
index f20ca38..c275c32 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java
@@ -327,7 +327,7 @@ private DfsPackFileMidx writeMultipackIndex(DfsPackFile[] packs,
 		List<DfsPackFile> packfiles = asList(packs);
 		DfsPackDescription desc = DfsMidxWriter.writeMidx(
 				NullProgressMonitor.INSTANCE, db.getObjectDatabase(), packfiles,
-				base != null ? base.getPackDescription() : null);
+				base != null ? base.getPackDescription() : null, null);
 		db.getObjectDatabase().commitPack(List.of(desc), null);
 		return DfsPackFileMidx.create(DfsBlockCache.getInstance(), desc,
 				packfiles, base);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalkTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalkTest.java
index 321ea01..728feea 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalkTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalkTest.java
@@ -19,6 +19,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.eclipse.jgit.internal.revwalk.RefAdvancerWalk;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MidxIteratorsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MidxIteratorsTest.java
new file mode 100644
index 0000000..3105423
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MidxIteratorsTest.java
@@ -0,0 +1,434 @@
+/*
+ * Copyright (C) 2026, Google LLC.
+ *
+ * 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.internal.storage.midx;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.IntStream;
+
+import org.eclipse.jgit.internal.storage.file.PackIndex;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MidxIterator;
+import org.eclipse.jgit.junit.FakeIndexFactory;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class MidxIteratorsTest {
+	private final static String OID_PREFIX = "0000000000000000000000000000000000";
+
+	@Test
+	public void fromPackIndexIterator_basicIteration() {
+		PackIndex index1 = indexOf(object("000001", 500),
+				object("000003", 3000), object("000005", 1500));
+
+		MidxIterator it = MidxIterators.fromPackIndexIterator("index1", index1);
+		assertNextEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000003", 0, 3000);
+		assertNextEntry(it, "000005", 0, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void fromPackIndexIterator_peek() {
+		PackIndex index1 = indexOf(object("000001", 500),
+				object("000003", 3000), object("000005", 1500));
+
+		MidxIterator it = MidxIterators.fromPackIndexIterator("index1", index1);
+		assertPeekEntry(it, "000001", 0, 500);
+		assertPeekEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000001", 0, 500);
+
+		assertPeekEntry(it, "000003", 0, 3000);
+		assertPeekEntry(it, "000003", 0, 3000);
+		assertNextEntry(it, "000003", 0, 3000);
+
+		assertPeekEntry(it, "000005", 0, 1500);
+		assertPeekEntry(it, "000005", 0, 1500);
+		assertNextEntry(it, "000005", 0, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void fromPackIndexIterator_reset() {
+		PackIndex index1 = indexOf(object("000001", 500),
+				object("000003", 3000), object("000005", 1500));
+
+		MidxIterator it = MidxIterators.fromPackIndexIterator("index1", index1);
+		while (it.hasNext()) {
+			it.next();
+		}
+		it.reset();
+		assertNextEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000003", 0, 3000);
+
+		it.reset();
+		assertPeekEntry(it, "000001", 0, 500);
+	}
+
+	@Test
+	public void fromPackIndexIterator_getPackNames() {
+		PackIndex index1 = indexOf(object("000001", 500),
+				object("000003", 1500), object("000005", 3000));
+		MidxIterator it = MidxIterators.fromPackIndexIterator("index1", index1);
+		assertEquals(List.of("index1"), it.getPackNames());
+	}
+
+	@Test
+	public void fromPackIndexIterator_empty() {
+		MidxIterator it = MidxIterators.fromPackIndexIterator("index1",
+				indexOf());
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_basicIteration() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000003", 1, 1500)));
+
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000002", 0, 500),
+						new IndexEntry("000004", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		assertNextEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000002", 2, 500);
+		assertNextEntry(it, "000003", 1, 1500);
+		assertNextEntry(it, "000004", 3, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_basicIteration_packIndexIterators() {
+		PackIndex idxOne = indexOf(object("000001", 500),
+				object("000003", 1500), object("000005", 3000));
+
+		PackIndex idxTwo = indexOf(object("000002", 500),
+				object("000003", 1500), object("000004", 3000));
+
+		List<MidxIterator> packIts = List.of(
+				MidxIterators.fromPackIndexIterator("index1", idxOne),
+				MidxIterators.fromPackIndexIterator("index2", idxTwo));
+		MidxIterator it = MidxIterators.join(packIts);
+		assertNextEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000002", 1, 500);
+		assertNextEntry(it, "000003", 0, 1500);
+		assertNextEntry(it, "000003", 1, 1500);
+		assertNextEntry(it, "000004", 1, 3000);
+		assertNextEntry(it, "000005", 0, 3000);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_duplicates_inPackIdOrder() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 501),
+						new IndexEntry("000003", 1, 1501)));
+
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000003", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		assertNextEntry(it, "000001", 0, 501);
+		assertNextEntry(it, "000001", 2, 500);
+		assertNextEntry(it, "000003", 1, 1501);
+		assertNextEntry(it, "000003", 3, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_duplicates_inPackIdOrder_shift() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 5,
+				List.of(new IndexEntry("000001", 4, 501),
+						new IndexEntry("000003", 2, 1501)));
+
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000003", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		assertNextEntry(it, "000001", 4, 501);
+		assertNextEntry(it, "000001", 5, 500);
+		assertNextEntry(it, "000003", 2, 1501);
+		assertNextEntry(it, "000003", 6, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_peek() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000003", 1, 1500)));
+
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000002", 0, 500),
+						new IndexEntry("000004", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		assertPeekEntry(it, "000001", 0, 500);
+		assertPeekEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000001", 0, 500);
+
+		assertPeekEntry(it, "000002", 2, 500);
+		assertPeekEntry(it, "000002", 2, 500);
+		assertNextEntry(it, "000002", 2, 500);
+
+		assertPeekEntry(it, "000003", 1, 1500);
+		assertPeekEntry(it, "000003", 1, 1500);
+		assertNextEntry(it, "000003", 1, 1500);
+
+		assertPeekEntry(it, "000004", 3, 1500);
+		assertPeekEntry(it, "000004", 3, 1500);
+		assertNextEntry(it, "000004", 3, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_reset() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000003", 1, 1500)));
+
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000002", 0, 500),
+						new IndexEntry("000004", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		while (it.hasNext()) {
+			it.next();
+		}
+
+		it.reset();
+		assertNextEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000002", 2, 500);
+
+		it.reset();
+		assertPeekEntry(it, "000001", 0, 500);
+	}
+
+	@Test
+	public void join_getPackNames() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000003", 1, 1500)));
+
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000002", 0, 500),
+						new IndexEntry("000004", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		assertEquals(List.of("itOne0", "itOne1", "itTwo0", "itTwo1"),
+				it.getPackNames());
+	}
+
+	@Test
+	public void join_empty_totallyEmpty() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2, List.of());
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2, List.of());
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void join_empty_oneSideEmpty() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2, List.of());
+		FakeMidxIterator itTwo = FakeMidxIterator.from("itTwo", 2,
+				List.of(new IndexEntry("000002", 0, 500),
+						new IndexEntry("000004", 1, 1500)));
+
+		MidxIterator it = MidxIterators.join(List.of(itOne, itTwo));
+		// Even when empty, the first iterator occupies the packIds
+		assertNextEntry(it, "000002", 2, 500);
+		assertNextEntry(it, "000004", 3, 1500);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void dedup_basicIteration() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000001", 1, 600),
+						new IndexEntry("000003", 0, 1500),
+						new IndexEntry("000003", 1, 1501)));
+		MidxIterator dedup = MidxIterators.dedup(itOne);
+		assertNextEntry(dedup, "000001", 0, 500);
+		assertNextEntry(dedup, "000003", 0, 1500);
+		assertFalse(dedup.hasNext());
+	}
+
+	@Test
+	public void dedup_peek() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000001", 1, 600),
+						new IndexEntry("000003", 0, 1500),
+						new IndexEntry("000003", 1, 1501)));
+
+		MidxIterator it = MidxIterators.dedup(itOne);
+		assertPeekEntry(it, "000001", 0, 500);
+		assertPeekEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000001", 0, 500);
+
+		assertPeekEntry(it, "000003", 0, 1500);
+		assertPeekEntry(it, "000003", 0, 1500);
+		assertNextEntry(it, "000003", 0, 1500);
+
+		assertFalse(it.hasNext());
+	}
+
+	@Test
+	public void dedup_reset() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000001", 1, 600),
+						new IndexEntry("000003", 0, 1500),
+						new IndexEntry("000003", 1, 1501),
+						new IndexEntry("000005", 0, 200),
+						new IndexEntry("000005", 1, 201)));
+
+		MidxIterator it = MidxIterators.dedup(itOne);
+		while (it.hasNext()) {
+			it.next();
+		}
+		it.reset();
+		assertNextEntry(it, "000001", 0, 500);
+		assertNextEntry(it, "000003", 0, 1500);
+
+		it.reset();
+		assertPeekEntry(it, "000001", 0, 500);
+	}
+
+	@Test
+	public void dedup_reset_sameElement() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 2,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000001", 1, 600),
+						new IndexEntry("000001", 2, 1500),
+						new IndexEntry("000001", 3, 1501),
+						new IndexEntry("000001", 4, 200),
+						new IndexEntry("000001", 5, 201)));
+
+		MidxIterator it = MidxIterators.dedup(itOne);
+		while (it.hasNext()) {
+			it.next();
+		}
+		it.reset();
+		assertNextEntry(it, "000001", 0, 500);
+
+		it.reset();
+		assertPeekEntry(it, "000001", 0, 500);
+	}
+
+	@Test
+	public void dedup_getPackNames() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 4,
+				List.of(new IndexEntry("000001", 0, 500),
+						new IndexEntry("000001", 1, 600),
+						new IndexEntry("000003", 2, 1500),
+						new IndexEntry("000003", 3, 1501)));
+		MidxIterator dedup = MidxIterators.dedup(itOne);
+		assertEquals(List.of("itOne0", "itOne1", "itOne2", "itOne3"),
+				dedup.getPackNames());
+	}
+
+	@Test
+	public void dedup_getEmpty() {
+		FakeMidxIterator itOne = FakeMidxIterator.from("itOne", 4, List.of());
+		MidxIterator dedup = MidxIterators.dedup(itOne);
+		assertFalse(dedup.hasNext());
+	}
+
+	private static void assertNextEntry(MidxIterator it, String shortOid,
+			int packId, int offset) {
+		assertTrue("expected to have more items", it.hasNext());
+		MultiPackIndex.MutableEntry e = it.next();
+		assertEquals(OID_PREFIX + shortOid, e.getObjectId().name());
+		assertEquals(packId, e.getPackId());
+		assertEquals(offset, e.getOffset());
+	}
+
+	private static void assertPeekEntry(MidxIterator it, String shortOid,
+			int packId, int offset) {
+		assertTrue(it.hasNext());
+		MultiPackIndex.MutableEntry e = it.peek();
+		assertEquals(OID_PREFIX + shortOid, e.getObjectId().name());
+		assertEquals(packId, e.getPackId());
+		assertEquals(offset, e.getOffset());
+	}
+
+	private static PackIndex indexOf(FakeIndexFactory.IndexObject... objs) {
+		return FakeIndexFactory.indexOf(Arrays.asList(objs));
+	}
+
+	private static FakeIndexFactory.IndexObject object(String name,
+			long offset) {
+		return new FakeIndexFactory.IndexObject(OID_PREFIX + name, offset);
+	}
+
+	private static class FakeMidxIterator implements MidxIterator {
+		private final List<String> packNames;
+
+		private final List<IndexEntry> entries;
+
+		private int position;
+
+		static FakeMidxIterator from(String packNameBase, int packCount,
+				List<IndexEntry> entries) {
+			List<String> packNames = IntStream.range(0, packCount)
+					.mapToObj(i -> packNameBase + i).toList();
+			return new FakeMidxIterator(packNames, entries);
+		}
+
+		private FakeMidxIterator(List<String> packNames,
+				List<IndexEntry> entries) {
+			this.entries = entries;
+			this.packNames = packNames;
+		}
+
+		@Override
+		public MultiPackIndex.MutableEntry peek() {
+			return entries.get(position).asMutableEntry();
+		}
+
+		@Override
+		public List<String> getPackNames() {
+			return packNames;
+		}
+
+		@Override
+		public boolean hasNext() {
+			return position < entries.size();
+		}
+
+		@Override
+		public MultiPackIndex.MutableEntry next() {
+			return entries.get(position++).asMutableEntry();
+		}
+
+		@Override
+		public void reset() {
+			position = 0;
+		}
+	}
+
+	record IndexEntry(String shortOid, int packId, int offset) {
+		MultiPackIndex.MutableEntry asMutableEntry() {
+			MultiPackIndex.MutableEntry entry = new MultiPackIndex.MutableEntry();
+			entry.oid.fromObjectId(ObjectId.fromString(OID_PREFIX + shortOid));
+			entry.packOffset.setValues(packId, offset);
+			return entry;
+		}
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java
index 3c7e27d..a59e874 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java
@@ -17,7 +17,6 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import org.eclipse.jgit.internal.storage.file.PackIndex;
@@ -64,13 +63,11 @@ public void load_validFile_basic_jgit() throws Exception {
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000012", 1502)));
 
-		LinkedHashMap<String, PackIndex> packs = new LinkedHashMap<>(3);
-		packs.put("p1", idxOne);
-		packs.put("p2", idxTwo);
-		packs.put("p3", idxThree);
+		PackIndexMerger data = PackIndexMerger.builder().addPack("p1", idxOne)
+				.addPack("p2", idxTwo).addPack("p3", idxThree).build();
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java
index a2c86f3..75a5a95 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java
@@ -22,7 +22,6 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Set;
 
@@ -114,7 +113,7 @@ public void jgit_largeOffsetChunk() throws IOException {
 						"0000000000000000000000000000000000000002", (1L << 35)),
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000003", 13)));
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger packs = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -145,7 +144,7 @@ public void jgit_largeOffset_noChunk() throws IOException {
 						"0000000000000000000000000000000000000002", 501),
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000003", 13)));
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger packs = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -182,7 +181,7 @@ public void jgit_resolve() throws IOException {
 				// Match
 				"32fe829a1c000000000000000000000000000010");
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger packs = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -226,7 +225,7 @@ public void jgit_resolve_matchLimit() throws IOException {
 				// Match
 				"32fe829a1c000000000000000000000000000010");
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("r1", idxOne,
+		PackIndexMerger packs = midxDataFor("r1", idxOne,
 				"r2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -261,7 +260,7 @@ public void jgit_resolve_noMatches() throws IOException {
 				"bbbbbb0000000000000000000000000000000003",
 				"32fe829a1c000000000000000000000000000010");
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger packs = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -292,7 +291,7 @@ public void jgit_resolve_noMatches_last() throws IOException {
 				"bbbbbb0000000000000000000000000000000003",
 				"32fe829a1c000000000000000000000000000010");
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger packs = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -314,11 +313,11 @@ public void jgit_resolve_empty() throws IOException {
 		PackIndex idxOne = FakeIndexFactory.indexOf(List.of());
 		PackIndex idxTwo = FakeIndexFactory.indexOf(List.of());
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
 
@@ -377,11 +376,11 @@ private static MultiPackIndex createMultiPackIndex() throws IOException {
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000012", 1502)));
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo, "p3", idxThree);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 
 		return MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
@@ -398,11 +397,11 @@ public void jgit_getObjectCount_emtpy() throws IOException {
 		PackIndex idxOne = FakeIndexFactory.indexOf(List.of());
 		PackIndex idxTwo = FakeIndexFactory.indexOf(List.of());
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
 
@@ -433,11 +432,11 @@ public void jgit_findBitmapPosition() throws IOException {
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000012", 1502)));
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo, "p3", idxThree);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
@@ -495,11 +494,11 @@ public void jgit_getObjectAtBitmapPosition() throws IOException {
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000012", 1502)));
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo, "p3", idxThree);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
@@ -563,11 +562,11 @@ public void jgit_iterator_emtpy() throws IOException {
 		PackIndex idxOne = FakeIndexFactory.indexOf(List.of());
 		PackIndex idxTwo = FakeIndexFactory.indexOf(List.of());
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
 
@@ -591,11 +590,11 @@ public void jgit_iterator_peek() throws IOException {
 				new FakeIndexFactory.IndexObject(
 						"0000000000000000000000000000000000000015", 1501)));
 
-		LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne,
+		PackIndexMerger data = midxDataFor("p1", idxOne,
 				"p2", idxTwo);
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		writer.write(NullProgressMonitor.INSTANCE, out, packs);
+		writer.write(NullProgressMonitor.INSTANCE, out, data);
 
 		MultiPackIndex midx = MultiPackIndexLoader
 				.read(new ByteArrayInputStream(out.toByteArray()));
@@ -662,21 +661,16 @@ private static void assertEntry(MultiPackIndex.MutableEntry e, String oid,
 		assertEquals(expectedOffset, e.packOffset.getOffset());
 	}
 
-	private static LinkedHashMap<String, PackIndex> orderedMapOf(String s1,
-			PackIndex pi1, String s2, PackIndex pi2) {
-		LinkedHashMap<String, PackIndex> map = new LinkedHashMap<>(2);
-		map.put(s1, pi1);
-		map.put(s2, pi2);
-		return map;
+	private static PackIndexMerger midxDataFor(String s1, PackIndex pi1,
+			String s2, PackIndex pi2) {
+		return PackIndexMerger.builder().addPack(s1, pi1).addPack(s2, pi2)
+				.build();
 	}
 
-	private static LinkedHashMap<String, PackIndex> orderedMapOf(String s1,
+	private static PackIndexMerger midxDataFor(String s1,
 			PackIndex pi1, String s2, PackIndex pi2, String s3, PackIndex pi3) {
-		LinkedHashMap<String, PackIndex> map = new LinkedHashMap<>(3);
-		map.put(s1, pi1);
-		map.put(s2, pi2);
-		map.put(s3, pi3);
-		return map;
+		return PackIndexMerger.builder().addPack(s1, pi1).addPack(s2, pi2)
+				.addPack(s3, pi3).build();
 	}
 
 	private static ObjectId oid(String last3chars) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java
index 5971dceb..1ca8aaf 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java
@@ -23,7 +23,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import org.eclipse.jgit.internal.storage.file.PackIndex;
@@ -47,9 +46,9 @@ public void write_allSmallOffsets() throws IOException {
 				object("0000000000000000000000000000000000000004", 1500),
 				object("0000000000000000000000000000000000000006", 3000));
 
-		LinkedHashMap<String, PackIndex> data = new LinkedHashMap<>();
-		data.put("packname1", index1);
-		data.put("packname2", index2);
+		PackIndexMerger data = PackIndexMerger.builder()
+				.addPack("packname1", index1).addPack("packname2", index2)
+				.build();
 
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -85,9 +84,9 @@ public void write_smallOffset_limit() throws IOException {
 				object("0000000000000000000000000000000000000002", 500),
 				object("0000000000000000000000000000000000000004", 1500),
 				object("0000000000000000000000000000000000000006", 3000));
-		LinkedHashMap<String, PackIndex> data = new LinkedHashMap<>(2);
-		data.put("packname1", index1);
-		data.put("packname2", index2);
+		PackIndexMerger data = PackIndexMerger.builder()
+				.addPack("packname1", index1).addPack("packname2", index2)
+				.build();
 
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -122,9 +121,9 @@ public void write_largeOffset() throws IOException {
 				object("0000000000000000000000000000000000000002", 500),
 				object("0000000000000000000000000000000000000004", 1500),
 				object("0000000000000000000000000000000000000006", 3000));
-		LinkedHashMap<String, PackIndex> data = new LinkedHashMap<>(2);
-		data.put("bbbbbbbbb", index1);
-		data.put("aaaaaaaaa", index2);
+		PackIndexMerger data = PackIndexMerger.builder()
+				.addPack("bbbbbbbbb", index1).addPack("aaaaaaaaa", index2)
+				.build();
 
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -159,9 +158,8 @@ public void write_largeOffset() throws IOException {
 	public void jgit_emptyMidx() throws IOException {
 		PackIndex idxOne = FakeIndexFactory.indexOf(List.of());
 		PackIndex idxTwo = FakeIndexFactory.indexOf(List.of());
-		LinkedHashMap<String, PackIndex> packs = new LinkedHashMap<>(2);
-		packs.put("p1", idxOne);
-		packs.put("p2", idxTwo);
+		PackIndexMerger packs = PackIndexMerger.builder().addPack("p1", idxOne)
+				.addPack("p2", idxTwo).build();
 		MultiPackIndexWriter writer = new MultiPackIndexWriter();
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		writer.write(NullProgressMonitor.INSTANCE, out, packs);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexMergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexMergerTest.java
index a43992d..971087e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexMergerTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexMergerTest.java
@@ -14,19 +14,23 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 
 import org.eclipse.jgit.internal.storage.file.PackIndex;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MutableEntry;
 import org.eclipse.jgit.junit.FakeIndexFactory;
 import org.eclipse.jgit.junit.FakeIndexFactory.IndexObject;
+import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.junit.Test;
 
 public class PackIndexMergerTest {
 
 	@Test
-	public void rawIterator_noDuplicates() {
+	public void bySha1Iterator_noDuplicates() {
 		PackIndex idxOne = indexOf(
 				oidOffset("0000000000000000000000000000000000000001", 500),
 				oidOffset("0000000000000000000000000000000000000005", 12),
@@ -39,12 +43,12 @@ public void rawIterator_noDuplicates() {
 				oidOffset("0000000000000000000000000000000000000004", 502),
 				oidOffset("0000000000000000000000000000000000000007", 14),
 				oidOffset("0000000000000000000000000000000000000012", 1502));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxTwo, "p3", idxThree));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxTwo,
+				"p3", idxThree);
 		assertEquals(9, merger.getUniqueObjectCount());
 		assertEquals(3, merger.getPackCount());
 		assertFalse(merger.needsLargeOffsetsChunk());
-		Iterator<PackIndexMerger.MidxMutableEntry> it = merger.rawIterator();
+		Iterator<MutableEntry> it = merger.bySha1Iterator();
 		assertNextEntry(it, "0000000000000000000000000000000000000001", 0, 500);
 		assertNextEntry(it, "0000000000000000000000000000000000000002", 1, 501);
 		assertNextEntry(it, "0000000000000000000000000000000000000003", 1, 13);
@@ -61,92 +65,31 @@ public void rawIterator_noDuplicates() {
 	}
 
 	@Test
-	public void rawIterator_noDuplicates_honorPackOrder() {
+	public void bySha1Iterator_withDuplicates() {
 		PackIndex idxOne = indexOf(
 				oidOffset("0000000000000000000000000000000000000001", 500),
-				oidOffset("0000000000000000000000000000000000000005", 12),
 				oidOffset("0000000000000000000000000000000000000010", 1500));
 		PackIndex idxTwo = indexOf(
 				oidOffset("0000000000000000000000000000000000000002", 501),
 				oidOffset("0000000000000000000000000000000000000003", 13),
+				oidOffset("0000000000000000000000000000000000000005", 800),
 				oidOffset("0000000000000000000000000000000000000015", 1501));
 		PackIndex idxThree = indexOf(
 				oidOffset("0000000000000000000000000000000000000004", 502),
+				oidOffset("0000000000000000000000000000000000000005", 12),
 				oidOffset("0000000000000000000000000000000000000007", 14),
 				oidOffset("0000000000000000000000000000000000000012", 1502));
-        PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p3", idxThree, "p2", idxTwo, "p1", idxOne));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxTwo,
+				"p3", idxThree);
 		assertEquals(9, merger.getUniqueObjectCount());
 		assertEquals(3, merger.getPackCount());
 		assertFalse(merger.needsLargeOffsetsChunk());
-		Iterator<PackIndexMerger.MidxMutableEntry> it = merger.rawIterator();
-		assertNextEntry(it, "0000000000000000000000000000000000000001", 2, 500);
-		assertNextEntry(it, "0000000000000000000000000000000000000002", 1, 501);
-		assertNextEntry(it, "0000000000000000000000000000000000000003", 1, 13);
-		assertNextEntry(it, "0000000000000000000000000000000000000004", 0, 502);
-		assertNextEntry(it, "0000000000000000000000000000000000000005", 2, 12);
-		assertNextEntry(it, "0000000000000000000000000000000000000007", 0, 14);
-		assertNextEntry(it, "0000000000000000000000000000000000000010", 2,
-				1500);
-		assertNextEntry(it, "0000000000000000000000000000000000000012", 0,
-				1502);
-		assertNextEntry(it, "0000000000000000000000000000000000000015", 1,
-				1501);
-		assertFalse(it.hasNext());
-	}
-
-	@Test
-	public void rawIterator_allDuplicates() {
-		PackIndex idxOne = indexOf(
-				oidOffset("0000000000000000000000000000000000000001", 500),
-				oidOffset("0000000000000000000000000000000000000005", 12),
-				oidOffset("0000000000000000000000000000000000000010", 1500));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxOne, "p3", idxOne));
-		assertEquals(3, merger.getUniqueObjectCount());
-		assertEquals(3, merger.getPackCount());
-		assertFalse(merger.needsLargeOffsetsChunk());
-		Iterator<PackIndexMerger.MidxMutableEntry> it = merger.rawIterator();
-		assertNextEntry(it, "0000000000000000000000000000000000000001", 0, 500);
-		assertNextEntry(it, "0000000000000000000000000000000000000001", 1, 500);
-		assertNextEntry(it, "0000000000000000000000000000000000000001", 2, 500);
-		assertNextEntry(it, "0000000000000000000000000000000000000005", 0, 12);
-		assertNextEntry(it, "0000000000000000000000000000000000000005", 1, 12);
-		assertNextEntry(it, "0000000000000000000000000000000000000005", 2, 12);
-		assertNextEntry(it, "0000000000000000000000000000000000000010", 0,
-				1500);
-		assertNextEntry(it, "0000000000000000000000000000000000000010", 1,
-				1500);
-		assertNextEntry(it, "0000000000000000000000000000000000000010", 2,
-				1500);
-		assertFalse(it.hasNext());
-	}
-
-	@Test
-	public void bySha1Iterator_noDuplicates() {
-		PackIndex idxOne = indexOf(
-				oidOffset("0000000000000000000000000000000000000001", 500),
-				oidOffset("0000000000000000000000000000000000000005", 12),
-				oidOffset("0000000000000000000000000000000000000010", 1500));
-		PackIndex idxTwo = indexOf(
-				oidOffset("0000000000000000000000000000000000000002", 501),
-				oidOffset("0000000000000000000000000000000000000003", 13),
-				oidOffset("0000000000000000000000000000000000000015", 1501));
-		PackIndex idxThree = indexOf(
-				oidOffset("0000000000000000000000000000000000000004", 502),
-				oidOffset("0000000000000000000000000000000000000007", 14),
-				oidOffset("0000000000000000000000000000000000000012", 1502));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxTwo, "p3", idxThree));
-		assertEquals(9, merger.getUniqueObjectCount());
-		assertEquals(3, merger.getPackCount());
-		assertFalse(merger.needsLargeOffsetsChunk());
-		Iterator<PackIndexMerger.MidxMutableEntry> it = merger.bySha1Iterator();
+		Iterator<MutableEntry> it = merger.bySha1Iterator();
 		assertNextEntry(it, "0000000000000000000000000000000000000001", 0, 500);
 		assertNextEntry(it, "0000000000000000000000000000000000000002", 1, 501);
 		assertNextEntry(it, "0000000000000000000000000000000000000003", 1, 13);
 		assertNextEntry(it, "0000000000000000000000000000000000000004", 2, 502);
-		assertNextEntry(it, "0000000000000000000000000000000000000005", 0, 12);
+		assertNextEntry(it, "0000000000000000000000000000000000000005", 1, 800);
 		assertNextEntry(it, "0000000000000000000000000000000000000007", 2, 14);
 		assertNextEntry(it, "0000000000000000000000000000000000000010", 0,
 				1500);
@@ -163,12 +106,12 @@ public void bySha1Iterator_allDuplicates() {
 				oidOffset("0000000000000000000000000000000000000001", 500),
 				oidOffset("0000000000000000000000000000000000000005", 12),
 				oidOffset("0000000000000000000000000000000000000010", 1500));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxOne, "p3", idxOne));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxOne,
+				"p3", idxOne);
 		assertEquals(3, merger.getUniqueObjectCount());
 		assertEquals(3, merger.getPackCount());
 		assertFalse(merger.needsLargeOffsetsChunk());
-		Iterator<PackIndexMerger.MidxMutableEntry> it = merger.bySha1Iterator();
+		Iterator<MutableEntry> it = merger.bySha1Iterator();
 		assertNextEntry(it, "0000000000000000000000000000000000000001", 0, 500);
 		assertNextEntry(it, "0000000000000000000000000000000000000005", 0, 12);
 		assertNextEntry(it, "0000000000000000000000000000000000000010", 0,
@@ -187,12 +130,12 @@ public void bySha1Iterator_differentIndexSizes() {
 				oidOffset("0000000000000000000000000000000000000004", 500),
 				oidOffset("0000000000000000000000000000000000000007", 12),
 				oidOffset("0000000000000000000000000000000000000012", 1500));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxTwo, "p3", idxThree));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxTwo,
+				"p3", idxThree);
 		assertEquals(6, merger.getUniqueObjectCount());
 		assertEquals(3, merger.getPackCount());
 		assertFalse(merger.needsLargeOffsetsChunk());
-		Iterator<PackIndexMerger.MidxMutableEntry> it = merger.bySha1Iterator();
+		Iterator<MutableEntry> it = merger.bySha1Iterator();
 		assertNextEntry(it, "0000000000000000000000000000000000000002", 1, 500);
 		assertNextEntry(it, "0000000000000000000000000000000000000003", 1, 12);
 		assertNextEntry(it, "0000000000000000000000000000000000000004", 2, 500);
@@ -205,8 +148,46 @@ public void bySha1Iterator_differentIndexSizes() {
 	}
 
 	@Test
+	public void bySha1Iterator_withAnotherMidx() throws IOException {
+		PackIndex idxOne = indexOf(
+				oidOffset("0000000000000000000000000000000000000010", 1500));
+		PackIndex idxTwo = indexOf(
+				oidOffset("0000000000000000000000000000000000000002", 500),
+				oidOffset("0000000000000000000000000000000000000003", 12));
+		PackIndex idxThree = indexOf(
+				oidOffset("0000000000000000000000000000000000000004", 500),
+				oidOffset("0000000000000000000000000000000000000007", 12),
+				oidOffset("0000000000000000000000000000000000000012", 1500));
+		MultiPackIndex midx = midxOf("one", idxOne, "two", idxTwo, "three",
+				idxThree);
+
+		PackIndex idxFour = indexOf(
+				oidOffset("0000000000000000000000000000000000000001", 12),
+				oidOffset("0000000000000000000000000000000000000007", 600),
+				oidOffset("0000000000000000000000000000000000000015", 300));
+
+		PackIndexMerger merger = PackIndexMerger.builder()
+				.addMidx(midx.iterator()).addPack("four", idxFour).build();
+		assertEquals(8, merger.getUniqueObjectCount());
+		assertEquals(4, merger.getPackCount());
+		assertFalse(merger.needsLargeOffsetsChunk());
+		Iterator<MutableEntry> it = merger.bySha1Iterator();
+		assertNextEntry(it, "0000000000000000000000000000000000000001", 3, 12);
+		assertNextEntry(it, "0000000000000000000000000000000000000002", 1, 500);
+		assertNextEntry(it, "0000000000000000000000000000000000000003", 1, 12);
+		assertNextEntry(it, "0000000000000000000000000000000000000004", 2, 500);
+		assertNextEntry(it, "0000000000000000000000000000000000000007", 2, 12);
+		assertNextEntry(it, "0000000000000000000000000000000000000010", 0,
+				1500);
+		assertNextEntry(it, "0000000000000000000000000000000000000012", 2,
+				1500);
+		assertNextEntry(it, "0000000000000000000000000000000000000015", 3, 300);
+		assertFalse(it.hasNext());
+	}
+
+	@Test
 	public void merger_noIndexes() {
-        PackIndexMerger merger = new PackIndexMerger(new LinkedHashMap<>());
+		PackIndexMerger merger = PackIndexMerger.builder().build();
 		assertEquals(0, merger.getUniqueObjectCount());
 		assertFalse(merger.needsLargeOffsetsChunk());
 		assertTrue(merger.getPackNames().isEmpty());
@@ -216,8 +197,8 @@ public void merger_noIndexes() {
 
 	@Test
 	public void merger_emptyIndexes() {
-		PackIndexMerger merger = new PackIndexMerger(
-                orderedMapOf("p1", indexOf(), "p2", indexOf()));
+		PackIndexMerger merger = createMergerFor("p1", indexOf(), "p2",
+				indexOf());
 		assertEquals(0, merger.getUniqueObjectCount());
 		assertFalse(merger.needsLargeOffsetsChunk());
 		assertEquals(2, merger.getPackNames().size());
@@ -232,8 +213,7 @@ public void bySha1Iterator_largeOffsets_needsChunk() {
 				oidOffset("0000000000000000000000000000000000000004", 12));
 		PackIndex idx2 = indexOf(oidOffset(
 				"0000000000000000000000000000000000000003", (1L << 31) + 10));
-		PackIndexMerger merger = new PackIndexMerger(
-                orderedMapOf("p1", idx1, "p2", idx2));
+		PackIndexMerger merger = createMergerFor("p1", idx1, "p2", idx2);
 		assertTrue(merger.needsLargeOffsetsChunk());
 		assertEquals(2, merger.getOffsetsOver31BitsCount());
 		assertEquals(3, merger.getUniqueObjectCount());
@@ -248,8 +228,7 @@ public void bySha1Iterator_largeOffsets_noChunk() {
 				oidOffset("0000000000000000000000000000000000000004", 12));
 		PackIndex idx2 = indexOf(oidOffset(
 				"0000000000000000000000000000000000000003", (1L << 31) + 10));
-		PackIndexMerger merger = new PackIndexMerger(
-                orderedMapOf("p1", idx1, "p2", idx2));
+		PackIndexMerger merger = createMergerFor("p1", idx1, "p2", idx2);
 		assertFalse(merger.needsLargeOffsetsChunk());
 		assertEquals(2, merger.getOffsetsOver31BitsCount());
 		assertEquals(3, merger.getUniqueObjectCount());
@@ -269,8 +248,8 @@ public void getObjectsPerPack_noDuplicates() {
 				oidOffset("0000000000000000000000000000000000000004", 502),
 				oidOffset("0000000000000000000000000000000000000007", 14),
 				oidOffset("0000000000000000000000000000000000000012", 1502));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxTwo, "p3", idxThree));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxTwo,
+				"p3", idxThree);
 		assertArrayEquals(new int[] { 3, 3, 3 }, merger.getObjectsPerPack());
 	}
 
@@ -285,8 +264,8 @@ public void getObjectsPerPack_differentIndexSizes() {
 				oidOffset("0000000000000000000000000000000000000004", 500),
 				oidOffset("0000000000000000000000000000000000000007", 12),
 				oidOffset("0000000000000000000000000000000000000012", 1500));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxTwo, "p3", idxThree));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxTwo,
+				"p3", idxThree);
 		assertArrayEquals(new int[] { 1, 2, 3 }, merger.getObjectsPerPack());
 	}
 
@@ -296,29 +275,28 @@ public void getObjectsPerPack_allDuplicates() {
 				oidOffset("0000000000000000000000000000000000000001", 500),
 				oidOffset("0000000000000000000000000000000000000005", 12),
 				oidOffset("0000000000000000000000000000000000000010", 1500));
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", idxOne, "p2", idxOne, "p3", idxOne));
+		PackIndexMerger merger = createMergerFor("p1", idxOne, "p2", idxOne,
+				"p3", idxOne);
 		assertArrayEquals(new int[] { 3, 0, 0 }, merger.getObjectsPerPack());
 	}
 
 	@Test
 	public void getObjectsPerPack_noIndexes() {
-		PackIndexMerger merger = new PackIndexMerger(new LinkedHashMap<>());
+		PackIndexMerger merger = PackIndexMerger.builder().build();
 		assertArrayEquals(new int[] {}, merger.getObjectsPerPack());
 	}
 
 	@Test
 	public void getObjectsPerPack_emptyIndexes() {
-		PackIndexMerger merger = new PackIndexMerger(
-				orderedMapOf("p1", indexOf(), "p2", indexOf()));
+		PackIndexMerger merger = createMergerFor("p1", indexOf(), "p2",
+				indexOf());
 		assertArrayEquals(new int[] { 0, 0 }, merger.getObjectsPerPack());
 	}
 
-	private static void assertNextEntry(
-			Iterator<PackIndexMerger.MidxMutableEntry> it, String oid,
+	private static void assertNextEntry(Iterator<MutableEntry> it, String oid,
 			int packId, long offset) {
 		assertTrue(it.hasNext());
-		PackIndexMerger.MidxMutableEntry e = it.next();
+		MutableEntry e = it.next();
 		assertEquals(oid, e.getObjectId().name());
 		assertEquals(packId, e.getPackId());
 		assertEquals(offset, e.getOffset());
@@ -332,21 +310,28 @@ private static PackIndex indexOf(IndexObject... objs) {
 		return FakeIndexFactory.indexOf(Arrays.asList(objs));
 	}
 
-    private static LinkedHashMap<String, PackIndex> orderedMapOf(String s1,
-                                                                 PackIndex pi1, String s2, PackIndex pi2) {
-        LinkedHashMap map = new LinkedHashMap(3);
-        map.put(s1, pi1);
-        map.put(s2, pi2);
-        return map;
-    }
+	private static MultiPackIndex midxOf(String s1, PackIndex idx1, String s2,
+			PackIndex idx2, String s3, PackIndex idx3) throws IOException {
+		PackIndexMerger merger = createMergerFor(s1, idx1, s2, idx2, s3, idx3);
+		MultiPackIndexWriter w = new MultiPackIndexWriter();
 
-	private static LinkedHashMap<String, PackIndex> orderedMapOf(String s1,
-                                                                 PackIndex pi1, String s2, PackIndex pi2, String s3, PackIndex pi3) {
-        LinkedHashMap map = new LinkedHashMap(3);
-        map.put(s1, pi1);
-        map.put(s2, pi2);
-        map.put(s3, pi3);
-        return map;
-    }
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		w.write(NullProgressMonitor.INSTANCE, out, merger);
+
+		ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+		return MultiPackIndexLoader.read(in);
+	}
+
+	private static PackIndexMerger createMergerFor(String s1, PackIndex pi1,
+			String s2, PackIndex pi2) {
+		return PackIndexMerger.builder().addPack(s1, pi1).addPack(s2, pi2)
+				.build();
+	}
+
+	private static PackIndexMerger createMergerFor(String s1, PackIndex pi1,
+			String s2, PackIndex pi2, String s3, PackIndex pi3) {
+		return PackIndexMerger.builder().addPack(s1, pi1).addPack(s2, pi2)
+				.addPack(s3, pi3).build();
+	}
 
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexPeekIteratorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexPeekIteratorTest.java
deleted file mode 100644
index 0b3ccac..0000000
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/PackIndexPeekIteratorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2025, Google LLC
- *
- * 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.internal.storage.midx;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.util.Arrays;
-
-import org.eclipse.jgit.internal.storage.file.PackIndex;
-import org.eclipse.jgit.junit.FakeIndexFactory;
-import org.junit.Test;
-
-public class PackIndexPeekIteratorTest {
-    @Test
-    public void next() {
-        PackIndex index1 = indexOf(
-                object("0000000000000000000000000000000000000001", 500),
-                object("0000000000000000000000000000000000000003", 1500),
-                object("0000000000000000000000000000000000000005", 3000));
-        PackIndexMerger.PackIndexPeekIterator it = new PackIndexMerger.PackIndexPeekIterator(0, index1);
-        assertEquals("0000000000000000000000000000000000000001", it.next().name());
-        assertEquals("0000000000000000000000000000000000000003", it.next().name());
-        assertEquals("0000000000000000000000000000000000000005", it.next().name());
-        assertNull(it.next());
-    }
-
-    @Test
-    public void peek_doesNotAdvance() {
-        PackIndex index1 = indexOf(
-                object("0000000000000000000000000000000000000001", 500),
-                object("0000000000000000000000000000000000000003", 1500),
-                object("0000000000000000000000000000000000000005", 3000));
-        PackIndexMerger.PackIndexPeekIterator it = new PackIndexMerger.PackIndexPeekIterator(0, index1);
-        it.next();
-        assertEquals("0000000000000000000000000000000000000001", it.peek().name());
-        assertEquals("0000000000000000000000000000000000000001", it.peek().name());
-        it.next();
-        assertEquals("0000000000000000000000000000000000000003", it.peek().name());
-        assertEquals("0000000000000000000000000000000000000003", it.peek().name());
-        it.next();
-        assertEquals("0000000000000000000000000000000000000005", it.peek().name());
-        assertEquals("0000000000000000000000000000000000000005", it.peek().name());
-        it.next();
-        assertNull(it.peek());
-        assertNull(it.peek());
-    }
-
-    @Test
-    public void empty() {
-        PackIndex index1 = indexOf();
-        PackIndexMerger.PackIndexPeekIterator it = new PackIndexMerger.PackIndexPeekIterator(0, index1);
-        assertNull(it.next());
-        assertNull(it.peek());
-    }
-
-    private static PackIndex indexOf(FakeIndexFactory.IndexObject... objs) {
-        return FakeIndexFactory.indexOf(Arrays.asList(objs));
-    }
-
-    private static FakeIndexFactory.IndexObject object(String name, long offset) {
-        return new FakeIndexFactory.IndexObject(name, offset);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
index c6a6321..b5e4b21 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
@@ -11,6 +11,8 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.time.Instant.EPOCH;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -30,6 +32,7 @@
 import java.util.Set;
 
 import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeResult;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.api.RebaseResult;
@@ -964,6 +967,39 @@ public void checkContentMergeConflict(MergeStrategy strategy)
 	}
 
 	@Theory
+	public void checkContentMergeConflictDiff3(MergeStrategy strategy)
+			throws Exception {
+		Git git = Git.wrap(db);
+
+		writeTrashFile("file", "1\n2\n3");
+		git.add().addFilepattern("file").call();
+		RevCommit first = git.commit().setMessage("added file").call();
+
+		writeTrashFile("file", "1master\n2\n3");
+		git.commit().setAll(true).setMessage("modified file on master").call();
+
+		git.checkout().setCreateBranch(true).setStartPoint(first)
+				.setName("side").call();
+		writeTrashFile("file", "1side\n2\n3");
+		RevCommit sideCommit = git.commit().setAll(true)
+				.setMessage("modified file on side").call();
+
+		git.checkout().setName("master").call();
+
+		db.getConfig().setEnum(CONFIG_MERGE_SECTION, null,
+				CONFIG_KEY_CONFLICTSTYLE, ConflictStyle.DIFF3);
+
+		MergeResult result = git.merge().setStrategy(strategy)
+				.include(sideCommit).call();
+		assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus());
+		String expected = "<<<<<<< HEAD\n" + "1master\n" + "||||||| BASE\n"
+				+ "1\n" + "=======\n" + "1side\n" + ">>>>>>> "
+				+ sideCommit.name() + "\n" + "2\n"
+				+ "3";
+		assertEquals(expected, read("file"));
+	}
+
+	@Theory
 	public void checkContentMergeConflict_noTree(MergeStrategy strategy)
 			throws Exception {
 		Git git = Git.wrap(db);
diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
index b3ecf33..ef66f91 100644
--- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
@@ -4,15 +4,15 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ui
 Bundle-SymbolicName: org.eclipse.jgit.ui
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Export-Package: org.eclipse.jgit.awtui;version="7.6.0"
-Import-Package: org.eclipse.jgit.errors;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.lib;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.nls;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revplot;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.revwalk;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.transport;version="[7.6.0,7.7.0)",
- org.eclipse.jgit.util;version="[7.6.0,7.7.0)"
+Export-Package: org.eclipse.jgit.awtui;version="7.7.0"
+Import-Package: org.eclipse.jgit.errors;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.lib;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.nls;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revplot;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.revwalk;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.transport;version="[7.7.0,7.8.0)",
+ org.eclipse.jgit.util;version="[7.7.0,7.8.0)"
diff --git a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
index e20c4f2..2430c2b 100644
--- a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit.ui - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ui.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit.ui;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit.ui;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml
index 2acf0e0..a21d2f3 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ui</artifactId>
diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF
index 15ae6ef..2377e26 100644
--- a/org.eclipse.jgit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit
 Bundle-SymbolicName: org.eclipse.jgit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-Localization: OSGI-INF/l10n/plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -11,8 +11,8 @@
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
 Service-Component: OSGI-INF/org.eclipse.jgit.internal.util.CleanupService.xml
 Eclipse-ExtensibleAPI: true
-Export-Package: org.eclipse.jgit.annotations;version="7.6.0",
- org.eclipse.jgit.api;version="7.6.0";
+Export-Package: org.eclipse.jgit.annotations;version="7.7.0",
+ org.eclipse.jgit.api;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.notes,
    org.eclipse.jgit.dircache,
@@ -27,21 +27,21 @@
    org.eclipse.jgit.revwalk.filter,
    org.eclipse.jgit.blame,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.api.errors;version="7.6.0";
+ org.eclipse.jgit.api.errors;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.errors",
- org.eclipse.jgit.attributes;version="7.6.0";
+ org.eclipse.jgit.attributes;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.blame;version="7.6.0";
+ org.eclipse.jgit.blame;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.blame.cache,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk.filter",
- org.eclipse.jgit.blame.cache;version="7.6.0";
+ org.eclipse.jgit.blame.cache;version="7.7.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.diff;version="7.6.0";
+ org.eclipse.jgit.diff;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.patch,
@@ -49,55 +49,55 @@
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.dircache;version="7.6.0";
+ org.eclipse.jgit.dircache;version="7.7.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.6.0";
+ org.eclipse.jgit.errors;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib",
- org.eclipse.jgit.events;version="7.6.0";
+ org.eclipse.jgit.events;version="7.7.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.fnmatch;version="7.6.0",
- org.eclipse.jgit.gitrepo;version="7.6.0";
+ org.eclipse.jgit.fnmatch;version="7.7.0",
+ org.eclipse.jgit.gitrepo;version="7.7.0";
   uses:="org.xml.sax.helpers,
    org.eclipse.jgit.api,
    org.eclipse.jgit.api.errors,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.xml.sax",
- org.eclipse.jgit.gitrepo.internal;version="7.6.0";x-internal:=true,
- org.eclipse.jgit.hooks;version="7.6.0";
+ org.eclipse.jgit.gitrepo.internal;version="7.7.0";x-internal:=true,
+ org.eclipse.jgit.hooks;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.ignore;version="7.6.0",
- org.eclipse.jgit.ignore.internal;version="7.6.0";
+ org.eclipse.jgit.ignore;version="7.7.0",
+ org.eclipse.jgit.ignore.internal;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal;version="7.6.0";
+ org.eclipse.jgit.internal;version="7.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.http.test",
- org.eclipse.jgit.internal.diff;version="7.6.0";
+ org.eclipse.jgit.internal.diff;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.diffmergetool;version="7.6.0";
+ org.eclipse.jgit.internal.diffmergetool;version="7.7.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.6.0";
+ org.eclipse.jgit.internal.fsck;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.revwalk;version="7.6.0";
+ org.eclipse.jgit.internal.revwalk;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.commitgraph;version="7.6.0";
+ org.eclipse.jgit.internal.storage.commitgraph;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.dfs;version="7.6.0";
+ org.eclipse.jgit.internal.storage.dfs;version="7.7.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.6.0";
+ org.eclipse.jgit.internal.storage.file;version="7.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.junit,
    org.eclipse.jgit.junit.http,
@@ -109,39 +109,39 @@
    org.eclipse.jgit.ssh.apache,
    org.eclipse.jgit.ssh.apache.test,
    org.eclipse.jgit.ssh.jsch.test",
- org.eclipse.jgit.internal.storage.io;version="7.6.0";
+ org.eclipse.jgit.internal.storage.io;version="7.7.0";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.memory;version="7.6.0";
+ org.eclipse.jgit.internal.storage.memory;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.midx;version="7.6.0";
+ org.eclipse.jgit.internal.storage.midx;version="7.7.0";
   x-friends:="org.eclipse.jgit.pgm,
    org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.pack;version="7.6.0";
+ org.eclipse.jgit.internal.storage.pack;version="7.7.0";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.reftable;version="7.6.0";
+ org.eclipse.jgit.internal.storage.reftable;version="7.7.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.6.0";x-internal:=true,
- org.eclipse.jgit.internal.transport.connectivity;version="7.6.0";
+ org.eclipse.jgit.internal.submodule;version="7.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.connectivity;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.http;version="7.6.0";
+ org.eclipse.jgit.internal.transport.http;version="7.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.parser;version="7.6.0";
+ org.eclipse.jgit.internal.transport.parser;version="7.7.0";
   x-friends:="org.eclipse.jgit.http.server,
    org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.ssh;version="7.6.0";
+ org.eclipse.jgit.internal.transport.ssh;version="7.7.0";
   x-friends:="org.eclipse.jgit.ssh.apache,
    org.eclipse.jgit.ssh.jsch,
    org.eclipse.jgit.test",
- org.eclipse.jgit.internal.util;version="7.6.0";
+ org.eclipse.jgit.internal.util;version="7.7.0";
   x-friends:="org.eclipse.jgit.junit",
- org.eclipse.jgit.lib;version="7.6.0";
+ org.eclipse.jgit.lib;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util.sha1,
    org.eclipse.jgit.dircache,
@@ -156,12 +156,12 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.submodule,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.lib.internal;version="7.6.0";
+ org.eclipse.jgit.lib.internal;version="7.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.pgm,
    org.eclipse.egit.ui",
- org.eclipse.jgit.logging;version="7.6.0",
- org.eclipse.jgit.merge;version="7.6.0";
+ org.eclipse.jgit.logging;version="7.7.0",
+ org.eclipse.jgit.merge;version="7.7.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -170,42 +170,42 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.api,
    org.eclipse.jgit.attributes",
- org.eclipse.jgit.nls;version="7.6.0",
- org.eclipse.jgit.notes;version="7.6.0";
+ org.eclipse.jgit.nls;version="7.7.0",
+ org.eclipse.jgit.notes;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.patch;version="7.6.0";
+ org.eclipse.jgit.patch;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.diff",
- org.eclipse.jgit.revplot;version="7.6.0";
+ org.eclipse.jgit.revplot;version="7.7.0";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.lib",
- org.eclipse.jgit.revwalk;version="7.6.0";
+ org.eclipse.jgit.revwalk;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk.filter,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.internal.storage.commitgraph",
- org.eclipse.jgit.revwalk.filter;version="7.6.0";
+ org.eclipse.jgit.revwalk.filter;version="7.7.0";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.storage.file;version="7.6.0";
+ org.eclipse.jgit.storage.file;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.storage.pack;version="7.6.0";
+ org.eclipse.jgit.storage.pack;version="7.7.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.submodule;version="7.6.0";
+ org.eclipse.jgit.submodule;version="7.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.transport;version="7.6.0";
+ org.eclipse.jgit.transport;version="7.7.0";
   uses:="javax.crypto,
    org.eclipse.jgit.hooks,
    org.eclipse.jgit.util.io,
@@ -218,21 +218,21 @@
    org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.storage.pack,
    org.eclipse.jgit.errors",
- org.eclipse.jgit.transport.http;version="7.6.0";
+ org.eclipse.jgit.transport.http;version="7.7.0";
   uses:="javax.net.ssl",
- org.eclipse.jgit.transport.resolver;version="7.6.0";
+ org.eclipse.jgit.transport.resolver;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.lib",
- org.eclipse.jgit.treewalk;version="7.6.0";
+ org.eclipse.jgit.treewalk;version="7.7.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.6.0";
+ org.eclipse.jgit.treewalk.filter;version="7.7.0";
   uses:="org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util;version="7.6.0";
+ org.eclipse.jgit.util;version="7.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.hooks,
    org.eclipse.jgit.revwalk,
@@ -245,12 +245,12 @@
    org.eclipse.jgit.treewalk,
    javax.net.ssl,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.util.io;version="7.6.0";
+ org.eclipse.jgit.util.io;version="7.7.0";
   uses:="org.eclipse.jgit.attributes,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util.sha1;version="7.6.0",
- org.eclipse.jgit.util.time;version="7.6.0"
+ org.eclipse.jgit.util.sha1;version="7.7.0",
+ org.eclipse.jgit.util.time;version="7.7.0"
 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
  javax.crypto,
  javax.management,
diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
index 48db010..46c3552 100644
--- a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
@@ -3,6 +3,6 @@
 Bundle-Name: org.eclipse.jgit - Sources
 Bundle-SymbolicName: org.eclipse.jgit.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 7.6.0.qualifier
+Bundle-Version: 7.7.0.qualifier
 Bundle-SCM: url=https://github.com/eclipse-jgit/jgit, connection=scm:git:https://eclipse.gerrithub.io/eclipse-jgit/jgit.git, developerConnection=scm:git:https://eclipse.gerrithub.io/a/eclipse-jgit/jgit.git
-Eclipse-SourceBundle: org.eclipse.jgit;version="7.6.0.qualifier";roots="."
+Eclipse-SourceBundle: org.eclipse.jgit;version="7.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml
index 890cb9c..e9b16e0 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.6.0-SNAPSHOT</version>
+    <version>7.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit</artifactId>
diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
index 8889d75..5dedccd 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
@@ -512,6 +512,7 @@
 messageAndTaggerNotAllowedInUnannotatedTags = Unannotated tags cannot have a message or tagger
 midxChunkNeeded=midx 0x{0} chunk has not been loaded
 midxChunkRepeated=midx chunk id 0x{0} appears multiple times
+midxChunkTooBig=chunk 0x{0} is too big (%d bytes)
 midxChunkUnknown=unknown midx chunk: 0x{0}
 minutesAgo={0} minutes ago
 mismatchOffset=mismatch offset for object {0}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java
index b4d1cab..23bda6f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java
@@ -20,7 +20,9 @@
 import java.text.MessageFormat;
 import java.time.Instant;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
 
 import org.eclipse.jgit.api.errors.FilterFailedException;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -114,6 +116,36 @@ public AddCommand addFilepattern(String filepattern) {
 	}
 
 	/**
+	 * Add paths to a file/directory whose content should be added.
+	 *
+	 * @param patterns
+	 *            repository-relative paths of file/directory to add (with
+	 *            <code>/</code> as separator)
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public AddCommand addFilepatterns(String... patterns) {
+		List.of(Objects.requireNonNull(patterns)).forEach(this::addFilepattern);
+		return this;
+	}
+
+	/**
+	 * Add paths to a file/directory whose content should be added.
+	 *
+	 * @param patterns
+	 *            repository-relative paths of file/directory to add (with
+	 *            <code>/</code> as separator)
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public AddCommand addFilepatterns(Collection<String> patterns) {
+		if (patterns != null) {
+			patterns.forEach(this::addFilepattern);
+		}
+		return this;
+	}
+
+	/**
 	 * Allow clients to provide their own implementation of a FileTreeIterator
 	 *
 	 * @param f
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
index a353d1a..6761f1e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
@@ -10,6 +10,9 @@
 package org.eclipse.jgit.api;
 
 import static org.eclipse.jgit.api.CherryPickCommitMessageProvider.ORIGINAL;
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_ABBREV_STRING_LENGTH;
 
 import java.io.IOException;
@@ -18,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -73,6 +77,8 @@ public class CherryPickCommand extends GitCommand<CherryPickResult> {
 
 	private ContentMergeStrategy contentStrategy;
 
+	private ConflictStyle conflictStyle;
+
 	private Integer mainlineParentNumber;
 
 	private boolean noCommit = false;
@@ -138,9 +144,9 @@ public CherryPickResult call() throws GitAPIException, NoMessageException,
 				boolean noProblems;
 				Map<String, MergeFailureReason> failingPaths = null;
 				List<String> unmergedPaths = null;
-				if (merger instanceof ResolveMerger) {
-					ResolveMerger resolveMerger = (ResolveMerger) merger;
+				if (merger instanceof ResolveMerger resolveMerger) {
 					resolveMerger.setContentMergeStrategy(contentStrategy);
+					resolveMerger.setConflictStyle(getConflictStyle());
 					resolveMerger.setCommitNames(
 							new String[] { "BASE", ourName, cherryPickName }); //$NON-NLS-1$
 					resolveMerger
@@ -363,6 +369,25 @@ public CherryPickCommand setContentMergeStrategy(
 	}
 
 	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public CherryPickCommand setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+		return this;
+	}
+
+	private ConflictStyle getConflictStyle() {
+		return conflictStyle != null ? conflictStyle
+				: repo.getConfig().getEnum(CONFIG_MERGE_SECTION, null,
+						CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
+	/**
 	 * Set the (1-based) parent number to diff against
 	 *
 	 * @param mainlineParentNumber
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
index 7064f5a..a79fbf7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
@@ -75,6 +75,8 @@ public class MergeCommand extends GitCommand<MergeResult> {
 
 	private ContentMergeStrategy contentStrategy;
 
+	private ConflictStyle conflictStyle;
+
 	private List<Ref> commits = new ArrayList<>();
 
 	private Boolean squash;
@@ -336,9 +338,9 @@ public MergeResult call() throws GitAPIException, NoHeadException,
 				Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults = null;
 				Map<String, MergeFailureReason> failingPaths = null;
 				List<String> unmergedPaths = null;
-				if (merger instanceof ResolveMerger) {
-					ResolveMerger resolveMerger = (ResolveMerger) merger;
+				if (merger instanceof ResolveMerger resolveMerger) {
 					resolveMerger.setContentMergeStrategy(contentStrategy);
+					resolveMerger.setConflictStyle(conflictStyle);
 					resolveMerger.setCommitNames(new String[] {
 							"BASE", "HEAD", ref.getName() }); //$NON-NLS-1$ //$NON-NLS-2$
 					resolveMerger.setWorkingTreeIterator(new FileTreeIterator(repo));
@@ -456,6 +458,8 @@ private void fallBackToConfiguration() {
 			commit = Boolean.valueOf(config.isCommit());
 		if (fastForwardMode == null)
 			fastForwardMode = config.getFastForwardMode();
+		if (conflictStyle == null)
+			conflictStyle = config.getConflictStyle();
 	}
 
 	private void updateHead(StringBuilder refLogMessage, ObjectId newHeadId,
@@ -511,6 +515,19 @@ public MergeCommand setContentMergeStrategy(ContentMergeStrategy strategy) {
 	}
 
 	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public MergeCommand setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+		return this;
+	}
+
+	/**
 	 * Reference to a commit to be merged with the current head
 	 *
 	 * @param aCommit
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
index 4b2cee4..ff5dbff 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
@@ -11,10 +11,15 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
+
 import java.io.IOException;
 import java.text.MessageFormat;
 
 import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
 import org.eclipse.jgit.api.MergeCommand.FastForwardMode.Merge;
 import org.eclipse.jgit.api.RebaseCommand.Operation;
@@ -72,6 +77,8 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
 
 	private ContentMergeStrategy contentStrategy;
 
+	private ConflictStyle conflictStyle;
+
 	private TagOpt tagOption;
 
 	private FastForwardMode fastForwardMode;
@@ -361,6 +368,7 @@ public PullResult call() throws GitAPIException,
 					.setOperation(Operation.BEGIN)
 					.setStrategy(strategy)
 					.setContentMergeStrategy(contentStrategy)
+					.setConflictStyle(getConflictStyle())
 					.setPreserveMerges(
 							pullRebaseMode == BranchRebaseMode.MERGES)
 					.call();
@@ -371,6 +379,7 @@ public PullResult call() throws GitAPIException,
 					.setProgressMonitor(monitor)
 					.setStrategy(strategy)
 					.setContentMergeStrategy(contentStrategy)
+					.setConflictStyle(getConflictStyle())
 					.setFastForward(getFastForwardMode()).call();
 			monitor.update(1);
 			result = new PullResult(fetchRes, remote, mergeRes);
@@ -464,6 +473,25 @@ public PullCommand setContentMergeStrategy(ContentMergeStrategy strategy) {
 	}
 
 	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public PullCommand setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+		return this;
+	}
+
+	private ConflictStyle getConflictStyle() {
+		return conflictStyle != null ? conflictStyle
+				: repo.getConfig().getEnum(CONFIG_MERGE_SECTION, null,
+						CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
+	/**
 	 * Set the specification of annotated tag behavior during fetch
 	 *
 	 * @param tagOpt
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 3ae7a6c..ba8461d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -11,6 +11,9 @@
 package org.eclipse.jgit.api;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -31,6 +34,7 @@
 import java.util.regex.Pattern;
 
 import org.eclipse.jgit.annotations.NonNull;
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.RebaseResult.Status;
 import org.eclipse.jgit.api.ResetCommand.ResetType;
 import org.eclipse.jgit.api.errors.CheckoutConflictException;
@@ -220,6 +224,8 @@ public enum Operation {
 
 	private ContentMergeStrategy contentStrategy;
 
+	private ConflictStyle conflictStyle;
+
 	private boolean preserveMerges = false;
 
 	/**
@@ -557,6 +563,7 @@ private RebaseResult cherryPickCommitFlattening(RevCommit commitToPick)
 					.setReflogPrefix(REFLOG_PREFIX)
 					.setStrategy(strategy)
 					.setContentMergeStrategy(contentStrategy)
+						.setConflictStyle(getConflictStyle())
 					.call();
 				switch (cherryPickResult.getStatus()) {
 				case FAILED:
@@ -611,7 +618,8 @@ private RebaseResult cherryPickCommitPreservingMerges(RevCommit commitToPick)
 							.setOurCommitName(ourCommitName)
 							.setReflogPrefix(REFLOG_PREFIX)
 							.setStrategy(strategy)
-							.setContentMergeStrategy(contentStrategy);
+							.setContentMergeStrategy(contentStrategy)
+							.setConflictStyle(getConflictStyle());
 					if (isMerge) {
 						pickCommand.setMainlineParentNumber(1);
 						// We write a MERGE_HEAD and later commit explicitly
@@ -649,6 +657,7 @@ private RebaseResult cherryPickCommitPreservingMerges(RevCommit commitToPick)
 							.setProgressMonitor(monitor)
 							.setStrategy(strategy)
 							.setContentMergeStrategy(contentStrategy)
+							.setConflictStyle(getConflictStyle())
 							.setCommit(false);
 					for (int i = 1; i < commitToPick.getParentCount(); i++)
 						merge.include(newParents.get(i));
@@ -1039,6 +1048,8 @@ private RevCommit continueRebase() throws GitAPIException, IOException {
 				CommitCommand commit = git.commit();
 				commit.setMessage(rebaseState.readFile(MESSAGE));
 				commit.setAuthor(parseAuthor());
+				commit.setCleanupMode(
+						commitConfig.resolve(CleanupMode.DEFAULT, false));
 				return commit.call();
 			}
 		}
@@ -1698,6 +1709,25 @@ public RebaseCommand setContentMergeStrategy(ContentMergeStrategy strategy) {
 	}
 
 	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public RebaseCommand setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+		return this;
+	}
+
+	private ConflictStyle getConflictStyle() {
+		return conflictStyle != null ? conflictStyle
+				: repo.getConfig().getEnum(CONFIG_MERGE_SECTION, null,
+						CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
+	/**
 	 * Whether to preserve merges during rebase
 	 *
 	 * @param preserve
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 6643c83..5a107d5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
@@ -9,6 +9,9 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_ABBREV_STRING_LENGTH;
 
 import java.io.IOException;
@@ -17,6 +20,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -74,6 +78,8 @@ public class RevertCommand extends GitCommand<RevCommit> {
 
 	private ProgressMonitor monitor = NullProgressMonitor.INSTANCE;
 
+	private ConflictStyle conflictStyle;
+
 	/**
 	 * <p>
 	 * Constructor for RevertCommand.
@@ -138,6 +144,7 @@ public RevCommit call() throws NoMessageException, UnmergedPathsException,
 						+ srcCommit.getShortMessage();
 
 				ResolveMerger merger = (ResolveMerger) strategy.newMerger(repo);
+				merger.setConflictStyle(getConflictStyle());
 				merger.setWorkingTreeIterator(new FileTreeIterator(repo));
 				merger.setBase(srcCommit.getTree());
 				merger.setCommitNames(new String[] {
@@ -344,4 +351,23 @@ public RevertCommand setInsertChangeId(boolean insertChangeId) {
 		return this;
 	}
 
+	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public RevertCommand setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+		return this;
+	}
+
+	private ConflictStyle getConflictStyle() {
+		return conflictStyle != null ? conflictStyle
+				: repo.getConfig().getEnum(CONFIG_MERGE_SECTION, null,
+						CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
index b0b715e..aa733b5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
@@ -9,6 +9,9 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.treewalk.TreeWalk.OperationType.CHECKOUT_OP;
 
 import java.io.IOException;
@@ -17,6 +20,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.InvalidRefNameException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -76,6 +80,8 @@ public class StashApplyCommand extends GitCommand<ObjectId> {
 
 	private ContentMergeStrategy contentStrategy;
 
+	private ConflictStyle conflictStyle;
+
 	/**
 	 * Create command to apply the changes of a stashed commit
 	 *
@@ -173,8 +179,7 @@ public ObjectId call() throws GitAPIException,
 
 			Merger merger = strategy.newMerger(repo);
 			boolean mergeSucceeded;
-			if (merger instanceof ResolveMerger) {
-				ResolveMerger resolveMerger = (ResolveMerger) merger;
+			if (merger instanceof ResolveMerger resolveMerger) {
 				resolveMerger
 						.setCommitNames(new String[] { "stashed HEAD", "HEAD", //$NON-NLS-1$ //$NON-NLS-2$
 								"stash" }); //$NON-NLS-1$
@@ -182,6 +187,7 @@ public ObjectId call() throws GitAPIException,
 				resolveMerger
 						.setWorkingTreeIterator(new FileTreeIterator(repo));
 				resolveMerger.setContentMergeStrategy(contentStrategy);
+				resolveMerger.setConflictStyle(getConflictStyle());
 				mergeSucceeded = resolveMerger.merge(headCommit, stashCommit);
 				List<String> modifiedByMerge = resolveMerger.getModifiedFiles();
 				if (!modifiedByMerge.isEmpty()) {
@@ -199,12 +205,12 @@ public ObjectId call() throws GitAPIException,
 				dco.checkout(); // Ignoring failed deletes....
 				if (restoreIndex) {
 					Merger ixMerger = strategy.newMerger(repo, true);
-					if (ixMerger instanceof ResolveMerger) {
-						ResolveMerger resolveMerger = (ResolveMerger) ixMerger;
+					if (ixMerger instanceof ResolveMerger resolveMerger) {
 						resolveMerger.setCommitNames(new String[] { "stashed HEAD", //$NON-NLS-1$
 								"HEAD", "stashed index" }); //$NON-NLS-1$//$NON-NLS-2$
 						resolveMerger.setBase(stashHeadCommit);
 						resolveMerger.setContentMergeStrategy(contentStrategy);
+						resolveMerger.setConflictStyle(getConflictStyle());
 					}
 					boolean ok = ixMerger.merge(headCommit, stashIndexCommit);
 					if (ok) {
@@ -218,8 +224,7 @@ public ObjectId call() throws GitAPIException,
 
 				if (untrackedCommit != null) {
 					Merger untrackedMerger = strategy.newMerger(repo, true);
-					if (untrackedMerger instanceof ResolveMerger) {
-						ResolveMerger resolveMerger = (ResolveMerger) untrackedMerger;
+					if (untrackedMerger instanceof ResolveMerger resolveMerger) {
 						resolveMerger.setCommitNames(new String[] { "null", "HEAD", //$NON-NLS-1$//$NON-NLS-2$
 								"untracked files" }); //$NON-NLS-1$
 						// There is no common base for HEAD & untracked files
@@ -230,6 +235,7 @@ public ObjectId call() throws GitAPIException,
 						// commit.
 						resolveMerger.setBase(null);
 						resolveMerger.setContentMergeStrategy(contentStrategy);
+						resolveMerger.setConflictStyle(getConflictStyle());
 					}
 					boolean ok = untrackedMerger.merge(headCommit,
 							untrackedCommit);
@@ -305,6 +311,25 @@ public StashApplyCommand setContentMergeStrategy(
 	}
 
 	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @return {@code this}
+	 * @since 7.6
+	 */
+	public StashApplyCommand setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+		return this;
+	}
+
+	private ConflictStyle getConflictStyle() {
+		return conflictStyle != null ? conflictStyle
+				: repo.getConfig().getEnum(CONFIG_MERGE_SECTION, null,
+						CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
+	/**
 	 * Whether the command should restore untracked files
 	 *
 	 * @param restoreUntracked
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
index 1f49629..db4a4e2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -543,6 +543,7 @@ public static JGitText get() {
 	/***/ public String messageAndTaggerNotAllowedInUnannotatedTags;
 	/***/ public String midxChunkNeeded;
 	/***/ public String midxChunkRepeated;
+    /***/ public String midxChunkTooBig;
 	/***/ public String midxChunkUnknown;
 	/***/ public String minutesAgo;
 	/***/ public String mismatchOffset;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/RefAdvancerWalk.java
similarity index 77%
rename from org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalk.java
rename to org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/RefAdvancerWalk.java
index d0d8056..714ccf7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/RefAdvancerWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/RefAdvancerWalk.java
@@ -7,7 +7,7 @@
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
-package org.eclipse.jgit.internal.storage.dfs;
+package org.eclipse.jgit.internal.revwalk;
 
 import java.io.IOException;
 import java.util.HashSet;
@@ -16,6 +16,7 @@
 
 import org.eclipse.jgit.errors.StopWalkException;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevSort;
@@ -25,21 +26,38 @@
 /**
  * Walk from some commits and find where to they enter a pack
  */
-class RefAdvancerWalk {
+public class RefAdvancerWalk {
 
-	private final DfsRepository db;
+	private final Repository db;
 
 	private final InPackPredicate includeP;
 
 	/**
-	 * True when the commit is in the pack
+	 * True when the commit is in the target set
 	 */
 	@FunctionalInterface
-	interface InPackPredicate {
+	public interface InPackPredicate {
+		/**
+		 * Check if the commit belongs to the "pack" (target set of objects)
+		 * 
+		 * @param c
+		 *            a commit
+		 * @return true if the commit is in the set
+		 * @throws IOException
+		 *             an error reading data
+		 */
 		boolean test(RevCommit c) throws IOException;
 	}
 
-	RefAdvancerWalk(DfsRepository db, InPackPredicate include) {
+	/**
+	 * Constructor
+	 *
+	 * @param db
+	 *            a repository
+	 * @param include
+	 *            predicate telling if a commit in the target set
+	 */
+	public RefAdvancerWalk(Repository db, InPackPredicate include) {
 		this.db = db;
 		this.includeP = include;
 	}
@@ -64,7 +82,7 @@ private RevWalk createRevWalk() {
 	 * @throws IOException
 	 *             error browsing history
 	 */
-	Set<RevCommit> advance(List<ObjectId> allTips) throws IOException {
+	public Set<RevCommit> advance(List<ObjectId> allTips) throws IOException {
 		Set<RevCommit> tipsInMidx = new HashSet<>(allTips.size());
 		try (RevWalk rw = createRevWalk()) {
 			for (ObjectId tip : allTips) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java
index 654bc30..6ead06d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java
@@ -13,11 +13,11 @@
 import static java.util.stream.Collectors.toMap;
 import static org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource.GC;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.MULTI_PACK_INDEX;
+import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -25,17 +25,22 @@
 import java.util.function.Function;
 
 import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.internal.revwalk.RefAdvancerWalk;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndexBuilder;
-import org.eclipse.jgit.internal.storage.file.PackIndex;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex;
 import org.eclipse.jgit.internal.storage.midx.MultiPackIndexWriter;
+import org.eclipse.jgit.internal.storage.midx.PackIndexMerger;
+import org.eclipse.jgit.internal.storage.pack.ObjectToPack;
 import org.eclipse.jgit.internal.storage.pack.PackBitmapCalculator;
 import org.eclipse.jgit.internal.storage.pack.PackBitmapIndexWriter;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdOwnerMap;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.storage.pack.PackConfig;
+import org.eclipse.jgit.util.Base64;
 
 /**
  * Create a pack with a multipack index, setting the required fields in the
@@ -47,30 +52,6 @@ private DfsMidxWriter() {
 	}
 
 	/**
-	 * Create a pack with the multipack index (without bitmaps).
-	 *
-	 * @param pm
-	 *            a progress monitor
-	 * @param objdb
-	 *            an object database
-	 * @param packs
-	 *            the packs to cover
-	 * @param base
-	 *            parent of this midx in the chain (if any).
-	 *
-	 * @return a pack (uncommitted) with the multipack index of the packs passed
-	 *         as parameter.
-	 * @throws IOException
-	 *             an error opening the packs or writing the stream.
-	 */
-	public static DfsPackDescription writeMidx(ProgressMonitor pm,
-			DfsObjDatabase objdb, List<DfsPackFile> packs,
-			@Nullable DfsPackDescription base) throws IOException {
-		return writeMidx(pm, objdb, packs, base,
-				new PackConfig(objdb.getRepository()));
-	}
-
-	/**
 	 * Create a pack with the multipack index
 	 *
 	 * @param pm
@@ -82,7 +63,8 @@ public static DfsPackDescription writeMidx(ProgressMonitor pm,
 	 * @param base
 	 *            parent of this midx in the chain (if any).
 	 * @param packConfig
-	 *            pack config with the parameters to write bitmaps.
+	 *            pack config with parameter to build bitmaps. Null to disable
+	 *            bitmaps.
 	 * @return a pack (uncommitted) with the multipack index of the packs passed
 	 *         as parameter.
 	 * @throws IOException
@@ -90,25 +72,28 @@ public static DfsPackDescription writeMidx(ProgressMonitor pm,
 	 */
 	public static DfsPackDescription writeMidx(ProgressMonitor pm,
 			DfsObjDatabase objdb, List<DfsPackFile> packs,
-			@Nullable DfsPackDescription base, PackConfig packConfig)
+			@Nullable DfsPackDescription base, @Nullable PackConfig packConfig)
 			throws IOException {
-		LinkedHashMap<String, PackIndex> inputs = new LinkedHashMap<>(
-				packs.size());
+		PackIndexMerger.Builder dataBuilder = PackIndexMerger.builder();
 		try (DfsReader ctx = objdb.newReader()) {
 			for (DfsPackFile pack : packs) {
-				inputs.put(pack.getPackDescription().getPackName(),
+				dataBuilder.addPack(pack.getPackDescription().getPackName(),
 						pack.getPackIndex(ctx));
 			}
 		}
 
+		PackIndexMerger data = dataBuilder.build();
+		byte[] checksum;
+
 		DfsPackDescription midxPackDesc = objdb.newPack(GC);
 		try (DfsOutputStream out = objdb.writeFile(midxPackDesc,
 				MULTI_PACK_INDEX)) {
 			MultiPackIndexWriter w = new MultiPackIndexWriter();
-			MultiPackIndexWriter.Result result = w.write(pm, out, inputs);
+			MultiPackIndexWriter.Result result = w.write(pm, out, data);
 			midxPackDesc.addFileExt(MULTI_PACK_INDEX);
 			midxPackDesc.setFileSize(MULTI_PACK_INDEX, result.bytesWritten());
 			midxPackDesc.setObjectCount(result.objectCount());
+			checksum = Base64.decode(result.checksum());
 
 			Map<String, DfsPackDescription> byName = packs.stream()
 					.map(DfsPackFile::getPackDescription)
@@ -122,11 +107,10 @@ public static DfsPackDescription writeMidx(ProgressMonitor pm,
 			}
 		}
 
-		// TODO(ifrade): At the moment write bitmaps only in the bottom midx.
-		// A single-pack midx in the base should be covering only GC. No
-		// need to write midx bitmaps (we will use GC bitmaps).
-		if (base == null && midxPackDesc.getCoveredPacks().size() > 1) {
+		// TODO(ifrade): At the moment we only support bitmaps on the base
+		if (base == null && packConfig != null) {
 			createAndAttachBitmaps(objdb.getRepository(), midxPackDesc,
+					checksum, data, packs,
 					packConfig);
 		}
 
@@ -134,12 +118,8 @@ public static DfsPackDescription writeMidx(ProgressMonitor pm,
 	}
 
 	private static void createAndAttachBitmaps(DfsRepository db,
-			DfsPackDescription desc, PackConfig cfg) throws IOException {
-
-		DfsObjDatabase objdb = db.getObjectDatabase();
-		// We need a DfsPackFile to reread the contents
-		DfsPackFileMidx midxPack = db.getObjectDatabase().createDfsPackFileMidx(
-				DfsBlockCache.getInstance(), desc, new ArrayList<>());
+			DfsPackDescription desc, byte[] checksum, PackIndexMerger data,
+			List<DfsPackFile> packs, PackConfig cfg) throws IOException {
 
 		// TODO(ifrade): Verify we duplicate the behaviour about tags of regular
 		// bitmapping
@@ -150,14 +130,16 @@ private static void createAndAttachBitmaps(DfsRepository db,
 			return;
 		}
 
-		try (DfsReader ctx = objdb.newReader()) {
+		try (DfsReader ctx = db.getObjectDatabase().newReader()) {
+			ObjectIdOwnerMap<ObjectToPack> byId = new ObjectIdOwnerMap<>();
+			List<ObjectToPack> otps = asObjectsToPack(ctx, data, packs, byId);
+
 			RefAdvancerWalk adv = new RefAdvancerWalk(db,
-					c -> midxPack.hasObject(ctx, c));
+					c -> byId.contains(c));
 			Set<RevCommit> inPack = adv.advance(allHeads);
 
-			byte[] checksum = midxPack.getChecksum(ctx);
 			PackBitmapIndexBuilder writeBitmaps = new PackBitmapIndexBuilder(
-					midxPack.getLocalObjects(ctx));
+					otps);
 			int commitCount = writeBitmaps.getCommits().cardinality();
 
 			PackBitmapCalculator calculator = new PackBitmapCalculator(cfg);
@@ -170,4 +152,30 @@ private static void createAndAttachBitmaps(DfsRepository db,
 		}
 	}
 
+	private static List<ObjectToPack> asObjectsToPack(DfsReader ctx,
+			PackIndexMerger data, List<DfsPackFile> packs,
+			ObjectIdOwnerMap<ObjectToPack> byId) throws IOException {
+		long[] accPackSize = new long[packs.size()];
+		for (int i = 1; i < packs.size(); i++) {
+			long prevValue = accPackSize[i - 1];
+			accPackSize[i] = prevValue
+					+ packs.get(i - 1).getPackDescription().getFileSize(PACK);
+		}
+
+		List<ObjectToPack> result = new ArrayList<>(
+				data.getUniqueObjectCount());
+		MultiPackIndex.MidxIterator it = data.bySha1Iterator();
+		while (it.hasNext()) {
+			MultiPackIndex.MutableEntry entry = it.next();
+			int objectType = packs.get(entry.getPackId()).getObjectType(ctx,
+					entry.getOffset());
+			ObjectToPack o = new ObjectToPack(entry.getObjectId().toObjectId(),
+					objectType);
+			o.setOffset(accPackSize[entry.getPackId()] + entry.getOffset());
+			result.add(o);
+			byId.add(o);
+		}
+		return result;
+	}
+
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidx.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidx.java
index 0582737..50ae998 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidx.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidx.java
@@ -20,6 +20,7 @@
 import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException;
 import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.file.PackReverseIndex;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex;
 import org.eclipse.jgit.internal.storage.pack.ObjectToPack;
 import org.eclipse.jgit.internal.storage.pack.PackOutputStream;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
@@ -56,7 +57,12 @@ public static DfsPackFileMidx create(DfsBlockCache cache,
 			DfsPackDescription desc, List<DfsPackFile> requiredPacks,
 			@Nullable DfsPackFileMidx base) {
 		if (desc.getCoveredPacks().size() == 1) {
-			return new DfsPackFileMidxSingle(cache, desc, requiredPacks.get(0),
+			String coveredPackName = desc.getCoveredPacks().get(0)
+					.getPackName();
+			DfsPackFile coveredPack = requiredPacks.stream().filter(p -> p
+					.getPackDescription().getPackName().equals(coveredPackName))
+					.findFirst().orElseThrow();
+			return new DfsPackFileMidxSingle(cache, desc, coveredPack,
 					base);
 		}
 		return new DfsPackFileMidxNPacks(cache, desc, requiredPacks, base);
@@ -152,6 +158,18 @@ protected int getObjectCount(DfsReader ctx) throws IOException {
 	 */
 	protected abstract byte[] getChecksum(DfsReader ctx) throws IOException;
 
+	/**
+	 * Get a midx iterator over the contents of *this* midx, without the base.
+	 *
+	 * @param ctx
+	 *            a ready
+	 * @return an iterator over the objects in this midx in sha1 order
+	 * @throws IOException
+	 *             an error loading the underlying data
+	 */
+	protected abstract MultiPackIndex.MidxIterator localIterator(DfsReader ctx)
+			throws IOException;
+
 	@Override
 	public final PackIndex getPackIndex(DfsReader ctx) {
 		return new MidxPackIndex(this, ctx);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxNPacks.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxNPacks.java
index bed7a53..f042f2e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxNPacks.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxNPacks.java
@@ -52,8 +52,6 @@ public final class DfsPackFileMidxNPacks extends DfsPackFileMidx {
 
 	private static final int REF_POSITION = 0;
 
-	private final List<DfsPackFile> packs;
-
 	// The required packs, in the order specified in the multipack index
 	// Initialized lazily, when the midx is loaded
 	private final DfsPackFile[] packsInIdOrder;
@@ -64,14 +62,27 @@ public final class DfsPackFileMidxNPacks extends DfsPackFileMidx {
 
 	private final VOffsetCalculatorNPacks offsetCalculator;
 
+	/**
+	 * Create the DfsPackFileMidx instance for this midx with n packs
+	 *
+	 * @param cache
+	 *            dfs block cache
+	 * @param desc
+	 *            description of the midx
+	 * @param knownPacks
+	 *            known packs, to translate the pack names in coveredPacks into
+	 *            DfsPackFile instances. It must contain at least all packs
+	 *            covered by this midx.
+	 * @param base
+	 *            base used by this midx.
+	 */
 	DfsPackFileMidxNPacks(DfsBlockCache cache, DfsPackDescription desc,
-			List<DfsPackFile> requiredPacks, @Nullable DfsPackFileMidx base) {
+			List<DfsPackFile> knownPacks, @Nullable DfsPackFileMidx base) {
 		super(cache, desc);
 		this.base = base;
-		this.packs = requiredPacks;
 		String[] coveredPackNames = desc.getCoveredPacks().stream()
 				.map(DfsPackDescription::getPackName).toArray(String[]::new);
-		packsInIdOrder = getPacksInMidxIdOrder(coveredPackNames);
+		packsInIdOrder = getPacksInMidxIdOrder(knownPacks, coveredPackNames);
 		offsetCalculator = VOffsetCalculatorNPacks.fromPacks(packsInIdOrder,
 				base != null ? base.getOffsetCalculator() : null);
 		this.length = offsetCalculator.getMaxOffset();
@@ -114,8 +125,9 @@ private static RefWithSize loadMultiPackIndex(DfsReader ctx,
 	private record RefWithSize(MultiPackIndex idx, long size) {
 	}
 
-	private DfsPackFile[] getPacksInMidxIdOrder(String[] packNames) {
-		Map<String, DfsPackFile> byName = packs.stream()
+	private DfsPackFile[] getPacksInMidxIdOrder(List<DfsPackFile> knownPacks,
+			String[] packNames) {
+		Map<String, DfsPackFile> byName = knownPacks.stream()
 				.collect(Collectors.toUnmodifiableMap(
 						p -> p.getPackDescription().getPackName(),
 						Function.identity()));
@@ -170,7 +182,7 @@ && getPackDescription().hasFileExt(BITMAP_INDEX)) {
 	List<DfsPackFile> fullyIncludedIn(DfsReader ctx,
 			BitmapIndex.BitmapBuilder need) throws IOException {
 		List<DfsPackFile> fullyIncluded = new ArrayList<>();
-		for (DfsPackFile pack : packs) {
+		for (DfsPackFile pack : packsInIdOrder) {
 			List<DfsPackFile> includedPacks = pack.fullyIncludedIn(ctx, need);
 			if (!includedPacks.isEmpty()) {
 				fullyIncluded.addAll(includedPacks);
@@ -186,7 +198,7 @@ List<DfsPackFile> fullyIncludedIn(DfsReader ctx,
 
 	@Override
 	public CommitGraph getCommitGraph(DfsReader ctx) throws IOException {
-		for (DfsPackFile pack : packs) {
+		for (DfsPackFile pack : packsInIdOrder) {
 			CommitGraph cg = pack.getCommitGraph(ctx);
 			if (cg != null) {
 				return cg;
@@ -242,6 +254,12 @@ protected int getObjectCount(DfsReader ctx) throws IOException {
 		return midx(ctx).getChecksum();
 	}
 
+	@Override
+	protected MultiPackIndex.MidxIterator localIterator(DfsReader ctx)
+			throws IOException {
+		return midx(ctx).iterator();
+	}
+
 	/**
 	 * Packs indexed by this multipack index (base NOT included)
 	 *
@@ -249,7 +267,7 @@ protected int getObjectCount(DfsReader ctx) throws IOException {
 	 */
 	@Override
 	public List<DfsPackFile> getCoveredPacks() {
-		return packs;
+		return List.of(packsInIdOrder);
 	}
 
 	/**
@@ -344,7 +362,7 @@ void resolve(DfsReader ctx, Set<ObjectId> matches, AbbreviatedObjectId id,
 	@Override
 	void copyPackAsIs(PackOutputStream out, DfsReader ctx) throws IOException {
 		// Assumming the order of the packs does not really matter
-		for (DfsPackFile pack : packs) {
+		for (DfsPackFile pack : packsInIdOrder) {
 			pack.copyPackAsIs(out, ctx);
 		}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxSingle.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxSingle.java
index 71ff884..89dbf9d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxSingle.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFileMidxSingle.java
@@ -25,6 +25,8 @@
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndex;
 import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.file.PackReverseIndex;
+import org.eclipse.jgit.internal.storage.midx.MidxIterators;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex;
 import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.PackOffset;
 import org.eclipse.jgit.internal.storage.pack.ObjectToPack;
 import org.eclipse.jgit.internal.storage.pack.PackExt;
@@ -149,6 +151,14 @@ protected int getObjectCount(DfsReader ctx) throws IOException {
 		return checksum;
 	}
 
+	@Override
+	protected MultiPackIndex.MidxIterator localIterator(DfsReader ctx)
+			throws IOException {
+		String packName = pack.getPackDescription().getPackName();
+		PackIndex packIndex = pack.getPackIndex(ctx);
+		return MidxIterators.fromPackIndexIterator(packName, packIndex);
+	}
+
 	/**
 	 * Packs indexed by this multipack index (base NOT included)
 	 *
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/MidxWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/MidxWriter.java
new file mode 100644
index 0000000..91f60b6
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/MidxWriter.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2026, Google LLC
+ *
+ * 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.internal.storage.file;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Comparator;
+
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndexWriter;
+import org.eclipse.jgit.internal.storage.midx.PackIndexMerger;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
+import org.eclipse.jgit.lib.ProgressMonitor;
+
+/**
+ * Helper to write multipack indexes.
+ */
+public class MidxWriter {
+
+	/**
+	 * Write a mdix over the packs
+	 *
+	 * @param pm
+	 *            a progress monitor
+	 * @param packs
+	 *            packs to cover with the midx
+	 * @param midxOut
+	 *            file to write the resulting midx
+	 * @throws IOException
+	 *             an error reading any of the input packs or indexes
+	 */
+	public static void writeMidx(ProgressMonitor pm, Collection<Pack> packs,
+			File midxOut) throws IOException {
+		PackIndexMerger.Builder builder = PackIndexMerger.builder();
+		builder.setProgressMonitor(pm);
+
+		Collection<Pack> packList = packs.stream()
+				.sorted(Comparator.comparing(Pack::getPackName)).toList();
+		pm.beginTask("Adding packs to midx", packList.size());
+		for (Pack pack : packList) {
+			PackFile packFile = pack.getPackFile().create(PackExt.INDEX);
+			builder.addPack(packFile.getName(), pack.getIndex());
+			pm.update(1);
+		}
+		pm.endTask();
+
+		MultiPackIndexWriter writer = new MultiPackIndexWriter();
+		try (FileOutputStream out = new FileOutputStream(
+				midxOut.getAbsolutePath())) {
+			writer.write(pm, out, builder.build());
+		}
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
index 544961b..872bb9e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
@@ -313,45 +313,53 @@ private int checkRescanPackThreshold(int retries, PackMismatchException e)
 	}
 
 	private void handlePackError(IOException e, Pack p) {
-		String warnTemplate = null;
-		String debugTemplate = null;
-		int transientErrorCount = 0;
-		String errorTemplate = JGitText.get().exceptionWhileReadingPack;
-		if ((e instanceof CorruptObjectException)
-				|| (e instanceof PackInvalidException)) {
-			warnTemplate = JGitText.get().corruptPack;
-			LOG.warn(MessageFormat.format(warnTemplate,
-					p.getPackFile().getAbsolutePath()), e);
-			// Assume the pack is corrupted, and remove it from the list.
-			remove(p);
-		} else if (e instanceof FileNotFoundException) {
-			if (p.getPackFile().exists()) {
-				errorTemplate = JGitText.get().packInaccessible;
-				transientErrorCount = p.incrementTransientErrorCount();
-			} else {
-				debugTemplate = JGitText.get().packWasDeleted;
-				remove(p);
-			}
+		Throwable cause = e.getCause();
+		if (e instanceof FileNotFoundException
+				|| cause instanceof FileNotFoundException) {
+			handleFileNotFound(e, p);
+		} else if (e instanceof CorruptObjectException
+				|| e instanceof PackInvalidException) {
+			handleCorruptPack(e, p);
 		} else if (FileUtils.isStaleFileHandleInCausalChain(e)) {
-			warnTemplate = JGitText.get().packHandleIsStale;
-			remove(p);
+			handleStaleFileHandle(e, p);
 		} else {
-			transientErrorCount = p.incrementTransientErrorCount();
+			handleTransientError(e, p,
+					JGitText.get().exceptionWhileReadingPack);
 		}
-		if (warnTemplate != null) {
-			LOG.warn(MessageFormat.format(warnTemplate,
-					p.getPackFile().getAbsolutePath()), e);
-		} else if (debugTemplate != null) {
-			LOG.debug(MessageFormat.format(debugTemplate,
-				p.getPackFile().getAbsolutePath()), e);
+	}
+
+	private void handleFileNotFound(IOException e, Pack p) {
+		if (p.getPackFile().exists()) {
+			handleTransientError(e, p, JGitText.get().packInaccessible);
 		} else {
-			if (doLogExponentialBackoff(transientErrorCount)) {
-				// Don't remove the pack from the list, as the error may be
-				// transient.
-				LOG.error(MessageFormat.format(errorTemplate,
-						p.getPackFile().getAbsolutePath(),
-						Integer.valueOf(transientErrorCount)), e);
+			if (LOG.isDebugEnabled()) {
+				LOG.debug(MessageFormat.format(JGitText.get().packWasDeleted,
+						p.getPackFile().getAbsolutePath()), e);
 			}
+			remove(p);
+		}
+	}
+
+	private void handleCorruptPack(IOException e, Pack p) {
+		LOG.warn(MessageFormat.format(JGitText.get().corruptPack,
+				p.getPackFile().getAbsolutePath()), e);
+		// Assume the pack is corrupted, and remove it from the list.
+		remove(p);
+	}
+
+	private void handleStaleFileHandle(IOException e, Pack p) {
+		LOG.warn(MessageFormat.format(JGitText.get().packHandleIsStale,
+				p.getPackFile().getAbsolutePath()), e);
+		remove(p);
+	}
+
+	private void handleTransientError(IOException e, Pack p,
+			String errorTemplate) {
+		int transientErrorCount = p.incrementTransientErrorCount();
+		if (doLogExponentialBackoff(transientErrorCount)) {
+			LOG.error(MessageFormat.format(errorTemplate,
+					p.getPackFile().getAbsolutePath(),
+					Integer.valueOf(transientErrorCount)), e);
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java
index 72434db..bc2c028 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java
@@ -43,7 +43,7 @@
  *            type of values in this tree
  * @since 6.5
  */
-public final class TernarySearchTree<Value> {
+public class TernarySearchTree<Value> {
 
 	private static final char WILDCARD = '?';
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MidxIterators.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MidxIterators.java
new file mode 100644
index 0000000..c30b9b8
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MidxIterators.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2026, Google LLC.
+ *
+ * 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.internal.storage.midx;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.eclipse.jgit.internal.storage.file.PackIndex;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MidxIterator;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MutableEntry;
+import org.eclipse.jgit.lib.MutableObjectId;
+
+/**
+ * Helpers for midx iterators
+ */
+public final class MidxIterators {
+
+	/**
+	 * Wrap a PackIndex iterator so it looks like a midx iterator with a fixed
+	 * packId
+	 *
+	 * @param packName
+	 *            pack name this iterator is going over
+	 * @param idx
+	 *            a PackIndex
+	 * @return a midx iterator that returns the objects of the pack index in the
+	 *         original iterator order
+	 */
+	public static MidxIterator fromPackIndexIterator(String packName,
+			PackIndex idx) {
+		return new MidxIteratorOverPackIndex(packName, idx);
+	}
+
+	/**
+	 * Merge results from multiple midx iterators.
+	 * <p>
+	 * This iterator can return duplicates (in ascending packId order). Wrap
+	 * with {@link #dedup(MidxIterator)} to remove duplicates.
+	 * <p>
+	 * This iterator shifts the pack ids in iterator order. If the first
+	 * iterator covers 3 packs, packIds of the second iterator are increased by
+	 * 3.
+	 *
+	 * @param iterators
+	 *            midx iterators to combine
+	 * @return a unique iterator that returns the union of the iterators in sha1
+	 *         order. The packIds of the entries are shi
+	 */
+	public static MidxIterator join(List<MidxIterator> iterators) {
+		return new JoinMidxIterator(iterators);
+	}
+
+	/**
+	 * Dedup consecutive duplicates from a midx iterator
+	 *
+	 * @param source
+	 *            a midx iterator emitting entries in sha1 order. In case of
+	 *            duplicates, the first one is returned and others skipped.
+	 * @return iterator without duplicates.
+	 */
+	public static MidxIterator dedup(MidxIterator source) {
+		return new DedupMidxIterator(source);
+	}
+
+	private MidxIterators() {
+	}
+
+	/**
+	 * Convert a PackIndex iterator into a MidxIterator
+	 */
+	private static class MidxIteratorOverPackIndex implements MidxIterator {
+
+		private final List<String> packNames;
+
+		private final PackIndex idx;
+
+		private Iterator<PackIndex.MutableEntry> idxIt;
+
+		private boolean peeked;
+
+		private final MutableEntry entry = new MutableEntry();
+
+		MidxIteratorOverPackIndex(String packName,
+				PackIndex idx) {
+			this.packNames = List.of(packName);
+			this.idx = idx;
+			this.idxIt = idx.iterator();
+		}
+
+		@Override
+		public MutableEntry peek() {
+			if (peeked) {
+				return entry;
+			}
+
+			peeked = true;
+			readNext();
+			return entry;
+		}
+
+		@Override
+		public List<String> getPackNames() {
+			return packNames;
+		}
+
+		@Override
+		public boolean hasNext() {
+			if (peeked) {
+				return true;
+			}
+			return idxIt.hasNext();
+		}
+
+		@Override
+		public MutableEntry next() {
+			if (peeked) {
+				peeked = false;
+				return entry;
+			}
+			readNext();
+			return entry;
+		}
+
+		private void readNext() {
+			PackIndex.MutableEntry idx = idxIt.next();
+			idx.copyOidTo(entry.oid);
+			entry.packOffset.setValues(0, idx.getOffset());
+		}
+
+		@Override
+		public void reset() {
+			this.idxIt = idx.iterator();
+			this.entry.clear();
+			peeked = false;
+		}
+	}
+
+	private static class JoinMidxIterator implements MidxIterator {
+
+		private final List<String> packNames;
+
+		private final List<MidxIterator> indexIterators;
+
+		private final int[] packCountAgg;
+
+		private final MutableEntry local = new MutableEntry();
+
+		public JoinMidxIterator(List<MidxIterator> indexIterators) {
+			this.indexIterators = indexIterators;
+			packCountAgg = new int[indexIterators.size()];
+			for (int i = 1; i < indexIterators.size(); i++) {
+				packCountAgg[i] = indexIterators.get(i - 1).getPackNames()
+						.size() + packCountAgg[i - 1];
+			}
+			packNames = indexIterators.stream().map(MidxIterator::getPackNames)
+					.flatMap(List::stream).toList();
+		}
+
+		@Override
+		public MutableEntry peek() {
+			int p = best();
+			MidxIterator it = indexIterators.get(p);
+			return shiftPackId(it.peek(), packCountAgg[p]);
+		}
+
+		@Override
+		public List<String> getPackNames() {
+			return packNames;
+		}
+
+		@Override
+		public boolean hasNext() {
+			return indexIterators.stream().anyMatch(Iterator::hasNext);
+		}
+
+		@Override
+		public MutableEntry next() {
+			int p = best();
+			MidxIterator it = indexIterators.get(p);
+			return shiftPackId(it.next(), packCountAgg[p]);
+		}
+
+		private MutableEntry shiftPackId(MutableEntry entry, int shift) {
+			local.fill(entry, shift);
+			return local;
+		}
+
+		private int best() {
+			int winnerPos = -1;
+			int winnerPackShift = 0;
+			MidxIterator winner = null;
+			for (int index = 0; index < indexIterators.size(); index++) {
+				MidxIterator current = indexIterators.get(index);
+				if (!current.hasNext()) {
+					continue;
+				}
+				if (winner == null
+						|| compareEntries(current.peek(), packCountAgg[index],
+								winner.peek(), winnerPackShift) < 0) {
+					winner = current;
+					winnerPos = index;
+					winnerPackShift = packCountAgg[winnerPos];
+				}
+			}
+
+			if (winner == null) {
+				throw new NoSuchElementException();
+			}
+
+			return winnerPos;
+		}
+
+		private static int compareEntries(MutableEntry a, int aPackShift,
+				MutableEntry b, int bPackShift) {
+			int cmp = a.oid.compareTo(b.oid);
+			if (cmp != 0) {
+				return cmp;
+			}
+
+			return Integer.compare(a.getPackId() + aPackShift,
+					b.getPackId() + bPackShift);
+		}
+
+		@Override
+		public void reset() {
+			indexIterators.stream().forEach(MidxIterator::reset);
+			local.clear();
+		}
+	}
+
+	private static class DedupMidxIterator implements MidxIterator {
+		private final MidxIterator src;
+
+		private final MutableObjectId lastOid = new MutableObjectId();
+
+		private MutableEntry next;
+
+		private final MutableEntry copy = new MutableEntry();
+
+		/**
+		 * Iterator over sorted by sha1 entries that removes duplicates choosing
+		 * the first one found.
+		 *
+		 * @param src
+		 *            iterator in sha1 order
+		 */
+		DedupMidxIterator(MidxIterator src) {
+			this.src = src;
+			readNext();
+		}
+
+		@Override
+		public MutableEntry peek() {
+			return next;
+		}
+
+		@Override
+		public List<String> getPackNames() {
+			return src.getPackNames();
+		}
+
+		@Override
+		public boolean hasNext() {
+			return next != null;
+		}
+
+		@Override
+		public MutableEntry next() {
+			copy.fill(next, 0);
+			readNext();
+			return copy;
+		}
+
+		private void readNext() {
+			while (true) {
+				if (!src.hasNext()) {
+					next = null;
+					return;
+				}
+
+				next = src.next();
+				if (!lastOid.equals(next.oid)) {
+					lastOid.fromObjectId(next.oid);
+					return;
+				}
+			}
+		}
+
+		@Override
+		public void reset() {
+			lastOid.clear();
+			src.reset();
+			readNext();
+		}
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndex.java
index 1721cb6..b209aa9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndex.java
@@ -162,6 +162,11 @@ interface MidxIterator extends Iterator<MutableEntry> {
 		 * @return pack names
 		 */
 		List<String> getPackNames();
+
+		/**
+		 * Restart the iteration from the beginning
+		 */
+		void reset();
 	}
 
 	/**
@@ -235,21 +240,11 @@ public String toString() {
 	 * <p>
 	 * Mutable so the iterator can reuse the instance for performance.
 	 */
-	class MutableEntry implements Comparable<MutableEntry> {
+	class MutableEntry {
 		protected final MutableObjectId oid = new MutableObjectId();
 
 		protected final PackOffset packOffset = new PackOffset();
 
-		@Override
-		public int compareTo(MutableEntry mutableEntry) {
-			int cmp = oid.compareTo(mutableEntry.oid);
-			if (cmp != 0) {
-				return cmp;
-			}
-
-			return packOffset.getPackId() - mutableEntry.packOffset.getPackId();
-		}
-
 		/**
 		 * Copy data from other into this instance, adding the shift to the
 		 * packId
@@ -278,6 +273,11 @@ public long getOffset() {
 			return packOffset.getOffset();
 		}
 
+		public void clear() {
+			oid.clear();
+			packOffset.setValues(0, 0);
+		}
+
 		@Override
 		public String toString() {
 			return String.format("%s,%s", oid.name(), packOffset);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoader.java
index 4b70c2c..a3cb115 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoader.java
@@ -162,7 +162,8 @@ public static MultiPackIndex read(InputStream fd)
 
 			if (len > Integer.MAX_VALUE - 8) { // http://stackoverflow.com/a/8381338
 				throw new MultiPackIndexFormatException(
-						JGitText.get().multiPackIndexFileIsTooLargeForJgit);
+						MessageFormat.format(JGitText.get().midxChunkTooBig,
+								chunkId, len));
 			}
 
 			byte[] buffer = new byte[(int) len];
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexV1.java
index ac6f00c..cfa5c33 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexV1.java
@@ -392,6 +392,11 @@ public MutableEntry peek() {
 		public List<String> getPackNames() {
 			return Arrays.asList(midx.getPackNames());
 		}
+
+		@Override
+		public void reset() {
+			position = 0;
+		}
 	}
 
 	private static class ReverseIndex {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java
index 4d2e580..00c2a93 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java
@@ -35,10 +35,10 @@
 import java.util.Map;
 
 import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.io.CancellableDigestOutputStream;
-import org.eclipse.jgit.internal.storage.midx.PackIndexMerger.MidxMutableEntry;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MutableEntry;
 import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.util.Base64;
 import org.eclipse.jgit.util.NB;
 
 /**
@@ -66,9 +66,11 @@ public class MultiPackIndexWriter {
 	 *            packs)
 	 * @param packNames
 	 *            packNames
+	 * @param checksum
+	 *            checksum of the written midx
 	 */
 	public record Result(long bytesWritten, int objectCount,
-			List<String> packNames) {
+			List<String> packNames, String checksum) {
 	}
 
 	/**
@@ -78,17 +80,15 @@ public record Result(long bytesWritten, int objectCount,
 	 *            progress monitor
 	 * @param outputStream
 	 *            stream to write the multipack index file
-	 * @param inputs
-	 *            pairs of name and index for each pack to include in the
-	 *            multipack index.
+	 * @param data
+	 *            a pack index merger with the data sources (in order) for this
+	 *            midx
 	 * @return data about the write (e.g. bytes written)
 	 * @throws IOException
 	 *             Error writing to the stream
 	 */
 	public Result write(ProgressMonitor monitor, OutputStream outputStream,
-			Map<String, PackIndex> inputs) throws IOException {
-		PackIndexMerger data = new PackIndexMerger(inputs);
-
+			PackIndexMerger data) throws IOException {
 		// List of chunks in the order they need to be written
 		List<ChunkHeader> chunkHeaders = createChunkHeaders(data);
 		long expectedSize = calculateExpectedSize(chunkHeaders);
@@ -97,11 +97,14 @@ public Result write(ProgressMonitor monitor, OutputStream outputStream,
 			writeHeader(out, chunkHeaders.size(), data.getPackCount());
 			writeChunkLookup(out, chunkHeaders);
 
+			monitor.beginTask("Writing midx chuncks", chunkHeaders.size());
 			WriteContext ctx = new WriteContext(out, data);
 			for (ChunkHeader chunk : chunkHeaders) {
 				chunk.writerFn.write(ctx);
+				monitor.update(1);
 			}
-			writeCheckSum(out);
+			monitor.endTask();
+			byte[] checksum = writeCheckSum(out);
 			if (expectedSize != out.length()) {
 				throw new IllegalStateException(String.format(
 						JGitText.get().multiPackIndexUnexpectedSize,
@@ -109,7 +112,7 @@ public Result write(ProgressMonitor monitor, OutputStream outputStream,
 						Long.valueOf(out.length())));
 			}
 			return new Result(expectedSize, data.getUniqueObjectCount(),
-					data.getPackNames());
+					data.getPackNames(), Base64.encodeBytes(checksum));
 		} catch (InterruptedIOException e) {
 			throw new IOException(JGitText.get().multiPackIndexWritingCancelled,
 					e);
@@ -223,9 +226,9 @@ private void writeChunkLookup(CancellableDigestOutputStream out,
 	private void writeFanoutTable(WriteContext ctx) throws IOException {
 		byte[] tmp = new byte[4];
 		int[] fanout = new int[256];
-		Iterator<MidxMutableEntry> iterator = ctx.data.bySha1Iterator();
+		Iterator<MutableEntry> iterator = ctx.data.bySha1Iterator();
 		while (iterator.hasNext()) {
-			MidxMutableEntry e = iterator.next();
+			MutableEntry e = iterator.next();
 			fanout[e.getObjectId().getFirstByte() & 0xff]++;
 		}
 		for (int i = 1; i < fanout.length; i++) {
@@ -250,9 +253,9 @@ private void writeFanoutTable(WriteContext ctx) throws IOException {
 	private void writeOidLookUp(WriteContext ctx) throws IOException {
 		byte[] tmp = new byte[OBJECT_ID_LENGTH];
 
-		Iterator<MidxMutableEntry> iterator = ctx.data.bySha1Iterator();
+		Iterator<MutableEntry> iterator = ctx.data.bySha1Iterator();
 		while (iterator.hasNext()) {
-			MidxMutableEntry e = iterator.next();
+			MutableEntry e = iterator.next();
 			e.getObjectId().copyRawTo(tmp, 0);
 			ctx.out.write(tmp, 0, OBJECT_ID_LENGTH);
 		}
@@ -272,9 +275,9 @@ private void writeOidLookUp(WriteContext ctx) throws IOException {
 	 */
 	private void writeObjectOffsets(WriteContext ctx) throws IOException {
 		byte[] entry = new byte[8];
-		Iterator<MidxMutableEntry> iterator = ctx.data.bySha1Iterator();
+		Iterator<MutableEntry> iterator = ctx.data.bySha1Iterator();
 		while (iterator.hasNext()) {
-			MidxMutableEntry e = iterator.next();
+			MutableEntry e = iterator.next();
 			NB.encodeInt32(entry, 0, e.getPackId());
 			if (!ctx.data.needsLargeOffsetsChunk()
 					|| fitsIn31bits(e.getOffset())) {
@@ -305,10 +308,10 @@ private void writeRidx(WriteContext ctx) throws IOException {
 		// memory. We could also iterate reverse indexes looking up
 		// their position in the midx (and discarding if the pack doesn't
 		// match).
-		Iterator<MidxMutableEntry> iterator = ctx.data.bySha1Iterator();
+		Iterator<MutableEntry> iterator = ctx.data.bySha1Iterator();
 		int midxPosition = 0;
 		while (iterator.hasNext()) {
-			MidxMutableEntry e = iterator.next();
+			MutableEntry e = iterator.next();
 			OffsetPosition op = new OffsetPosition(e.getOffset(), midxPosition);
 			midxPosition++;
 			packOffsets.computeIfAbsent(e.getPackId(), k -> new ArrayList<>())
@@ -384,13 +387,16 @@ private void writePackfileNames(WriteContext ctx) throws IOException {
 	 *
 	 * @param out
 	 *            output stream used to write
+	 * @return the checksum (same value that is written as footer of the file)
 	 * @throws IOException
 	 *             error writing to the output stream
 	 */
-	private void writeCheckSum(CancellableDigestOutputStream out)
+	private byte[] writeCheckSum(CancellableDigestOutputStream out)
 			throws IOException {
-		out.write(out.getDigest());
+		byte[] checksum = out.getDigest();
+		out.write(checksum);
 		out.flush();
+		return checksum;
 	}
 
 	private record OffsetPosition(long offset, int position) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java
index 4a296ee..8584176 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java
@@ -10,14 +10,14 @@
 package org.eclipse.jgit.internal.storage.midx;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
 
 import org.eclipse.jgit.internal.storage.file.PackIndex;
-import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MidxIterator;
+import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MutableEntry;
 import org.eclipse.jgit.lib.MutableObjectId;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ProgressMonitor;
 
 /**
  * Collect the stats and offers an iterator over the union of n-pack indexes.
@@ -32,59 +32,13 @@
  * entries. The stats of the combined index are calculated in an iteration at
  * construction time.
  */
-class PackIndexMerger {
+public class PackIndexMerger {
 
 	private static final int LIMIT_31_BITS = (1 << 31) - 1;
 
 	private static final long LIMIT_32_BITS = (1L << 32) - 1;
 
-	/**
-	 * Object returned by the iterator.
-	 * <p>
-	 * The iterator returns (on each next()) the same instance with different
-	 * values, to avoid allocating many short-lived objects. Callers should not
-	 * keep a reference to that returned value.
-	 */
-	static class MidxMutableEntry {
-		// The object id
-		private final MutableObjectId oid = new MutableObjectId();
-
-		// Position of the pack in the ordered list of pack in this merger
-		private int packId;
-
-		// Offset in its pack
-		private long offset;
-
-		public AnyObjectId getObjectId() {
-			return oid;
-		}
-
-		public int getPackId() {
-			return packId;
-		}
-
-		public long getOffset() {
-			return offset;
-		}
-
-		/**
-		 * Copy values from another mutable entry
-		 *
-		 * @param packId
-		 *            packId
-		 * @param other
-		 *            another mutable entry
-		 */
-		private void fill(int packId, PackIndex.MutableEntry other) {
-			other.copyOidTo(oid);
-			this.packId = packId;
-			this.offset = other.getOffset();
-		}
-	}
-
-	private final List<String> packNames;
-
-	private final List<PackIndex> indexes;
+	private final MidxIterator midxIterator;
 
 	private final boolean needsLargeOffsetsChunk;
 
@@ -94,47 +48,127 @@ private void fill(int packId, PackIndex.MutableEntry other) {
 
 	private final int[] objectsPerPack;
 
-	/**
-	 * Build a common view of these pack indexes
-	 * <p>
-	 * Order matters: in case of duplicates, the first pack with the object wins
-	 *
-	 * @param packs
-	 *            map of pack names to indexes, ordered.
-	 */
-	PackIndexMerger(Map<String, PackIndex> packs) {
-		this.packNames = packs.keySet().stream().toList();
-		this.indexes = packs.values().stream().toList();
+	private final List<String> packnames;
 
-		objectsPerPack = new int[packNames.size()];
-		// Iterate for duplicates
+	/**
+	 * Builder collecting the inputs for the merger.
+	 * <p>
+	 * Order matters. Packs will appear in the midx in the order they are added.
+	 */
+	public static class Builder {
+
+		private final List<MidxIterator> packIndexes = new ArrayList<>();
+
+		private ProgressMonitor pm = NullProgressMonitor.INSTANCE;
+
+		/**
+		 * Add a regular pack to the midx
+		 *
+		 * @param name
+		 *            name of the pack
+		 * @param idx
+		 *            primary index of the pack
+		 * @return this builder
+		 */
+		public Builder addPack(String name, PackIndex idx) {
+			packIndexes.add(MidxIterators.fromPackIndexIterator(name, idx));
+			return this;
+		}
+
+		/**
+		 * Add data from this midx iterator to the merge
+		 * <p>
+		 * Packs are kept in the order of the iterator.
+		 *
+		 * @param midx
+		 *            a midx iterator
+		 * @return this builder
+		 */
+		public Builder addMidx(MidxIterator midx) {
+			packIndexes.add(midx);
+			return this;
+		}
+
+		/**
+		 * Add a progress monitor to the build process
+		 * <p>
+		 * Give visibility over the first iteration of the packs calculating the
+		 * data needed for midx headers (unique object count, if large offsets
+		 * are needed...)
+		 *
+		 * @param pm
+		 *            a progress monitor
+		 * @return this builder
+		 */
+		public Builder setProgressMonitor(ProgressMonitor pm) {
+			this.pm = pm;
+			return this;
+		}
+
+		/**
+		 * Build the merger instance
+		 *
+		 * @return a merger instance
+		 */
+		public PackIndexMerger build() {
+			return new PackIndexMerger(
+					MidxIterators.dedup(MidxIterators.join(packIndexes)), pm);
+		}
+	}
+
+	/**
+	 * Create a builder
+	 *
+	 * @return an empty builder
+	 */
+	public static Builder builder() {
+		return new Builder();
+	}
+
+	/**
+	 * A common view of the input pack indexes
+	 *
+	 * @param midxIterator
+	 *            MidxIterator built by deduping union of all pack indexes
+	 * @param pm
+	 *            a progress monitor
+	 */
+	private PackIndexMerger(MidxIterator midxIterator, ProgressMonitor pm) {
+		this.midxIterator = midxIterator;
+		this.packnames = midxIterator.getPackNames();
+
+		objectsPerPack = new int[packnames.size()];
+		pm.beginTask("Iterating objects for midx headers",
+				ProgressMonitor.UNKNOWN);
+		// Iterate for duplicates and counts that we need to build the chunk
+		// headers.
 		int objectCount = 0;
 		boolean hasLargeOffsets = false;
 		int over31bits = 0;
 		MutableObjectId lastSeen = new MutableObjectId();
-		MultiIndexIterator it = new MultiIndexIterator(indexes);
-		while (it.hasNext()) {
-			MidxMutableEntry entry = it.next();
-			if (lastSeen.equals(entry.oid)) {
-				continue;
-			}
+		while (midxIterator.hasNext()) {
+			MutableEntry entry = midxIterator.next();
 			// If there is at least one offset value larger than 2^32-1, then
 			// the large offset chunk must exist, and offsets larger than
 			// 2^31-1 must be stored in it instead
-			if (entry.offset > LIMIT_32_BITS) {
+			if (entry.getOffset() > LIMIT_32_BITS) {
 				hasLargeOffsets = true;
 			}
-			if (entry.offset > LIMIT_31_BITS) {
+			if (entry.getOffset() > LIMIT_31_BITS) {
 				over31bits++;
 			}
 
 			lastSeen.fromObjectId(entry.oid);
 			objectCount++;
-			objectsPerPack[entry.packId]++;
+			// TODO(ifrade): we can calculate the fanout table already here.
+			// It saves an iteration over all objects for only 1Kb of memory
+			objectsPerPack[entry.getPackId()]++;
+			pm.update(1);
 		}
 		uniqueObjectCount = objectCount;
 		offsetsOver31BitsCount = over31bits;
 		needsLargeOffsetsChunk = hasLargeOffsets;
+		pm.endTask();
 	}
 
 	/**
@@ -142,7 +176,7 @@ private void fill(int packId, PackIndex.MutableEntry other) {
 	 *
 	 * @return object count of the merged index
 	 */
-	int getUniqueObjectCount() {
+	public int getUniqueObjectCount() {
 		return uniqueObjectCount;
 	}
 
@@ -168,7 +202,7 @@ int getOffsetsOver31BitsCount() {
 	}
 
 	/**
-	 * Number of objects selected for the midx per packid
+	 * Number of objects selected for the midx per pack id
 	 *
 	 * @return array where position n contains the amount of objects selected
 	 *         for pack id n
@@ -187,7 +221,7 @@ int getOffsetsOver31BitsCount() {
 	 * @return List of pack names, in the order used by the merge.
 	 */
 	List<String> getPackNames() {
-		return packNames;
+		return packnames;
 	}
 
 	/**
@@ -196,160 +230,22 @@ List<String> getPackNames() {
 	 * @return count of packs merged
 	 */
 	int getPackCount() {
-		return packNames.size();
+		return packnames.size();
 	}
 
 	/**
 	 * Iterator over the merged indexes in sha1 order without duplicates
 	 * <p>
+	 * This always returns the same iterator resetted. We don't support two
+	 * iterators over this merged data.
+	 * <p>
 	 * The returned entry in the iterator is mutable, callers should NOT keep a
 	 * reference to it.
 	 *
 	 * @return an iterator in sha1 order without duplicates.
 	 */
-	Iterator<MidxMutableEntry> bySha1Iterator() {
-		return new DedupMultiIndexIterator(new MultiIndexIterator(indexes),
-				getUniqueObjectCount());
-	}
-
-	/**
-	 * For testing. Iterate all entries, not skipping duplicates (stable order)
-	 *
-	 * @return an iterator of all objects in sha1 order, including duplicates.
-	 */
-	Iterator<MidxMutableEntry> rawIterator() {
-		return new MultiIndexIterator(indexes);
-	}
-
-	/**
-	 * Iterator over n-indexes in ObjectId order.
-	 * <p>
-	 * It returns duplicates if the same object id is in different indexes. Wrap
-	 * it with {@link DedupMultiIndexIterator (Iterator, int)} to avoid
-	 * duplicates.
-	 */
-	private static final class MultiIndexIterator
-			implements Iterator<MidxMutableEntry> {
-
-		private final List<PackIndexPeekIterator> indexIterators;
-
-		private final MidxMutableEntry mutableEntry = new MidxMutableEntry();
-
-		MultiIndexIterator(List<PackIndex> indexes) {
-			this.indexIterators = new ArrayList<>(indexes.size());
-			for (int i = 0; i < indexes.size(); i++) {
-				PackIndexPeekIterator it = new PackIndexPeekIterator(i,
-						indexes.get(i));
-				// Position in the first element
-				if (it.next() != null) {
-					indexIterators.add(it);
-				}
-			}
-		}
-
-		@Override
-		public boolean hasNext() {
-			return !indexIterators.isEmpty();
-		}
-
-		@Override
-		public MidxMutableEntry next() {
-			PackIndexPeekIterator winner = null;
-			for (int index = 0; index < indexIterators.size(); index++) {
-				PackIndexPeekIterator current = indexIterators.get(index);
-				if (winner == null
-						|| current.peek().compareBySha1To(winner.peek()) < 0) {
-					winner = current;
-				}
-			}
-
-			if (winner == null) {
-				throw new NoSuchElementException();
-			}
-
-			mutableEntry.fill(winner.getPackId(), winner.peek());
-			if (winner.next() == null) {
-				indexIterators.remove(winner);
-			}
-			return mutableEntry;
-		}
-	}
-
-	private static class DedupMultiIndexIterator
-			implements Iterator<MidxMutableEntry> {
-		private final MultiIndexIterator src;
-
-		private int remaining;
-
-		private final MutableObjectId lastOid = new MutableObjectId();
-
-		DedupMultiIndexIterator(MultiIndexIterator src, int totalCount) {
-			this.src = src;
-			this.remaining = totalCount;
-		}
-
-		@Override
-		public boolean hasNext() {
-			return remaining > 0;
-		}
-
-		@Override
-		public MidxMutableEntry next() {
-			MidxMutableEntry next = src.next();
-			while (next != null && lastOid.equals(next.oid)) {
-				next = src.next();
-			}
-
-			if (next == null) {
-				throw new NoSuchElementException();
-			}
-
-			lastOid.fromObjectId(next.oid);
-			remaining--;
-			return next;
-		}
-	}
-
-	/**
-	 * Convenience around the PackIndex iterator to read the current value
-	 * multiple times without consuming it.
-	 * <p>
-	 * This is used to merge indexes in the multipack index, where we need to
-	 * compare the current value between indexes multiple times to find the
-	 * next.
-	 * <p>
-	 * We could also implement this keeping the position (int) and
-	 * MutableEntry#getObjectId, but that would create an ObjectId per entry.
-	 * This implementation reuses the MutableEntry and avoid instantiations.
-	 */
-	// Visible for testing
-	static class PackIndexPeekIterator {
-		private final Iterator<PackIndex.MutableEntry> it;
-
-		private final int packId;
-
-		PackIndex.MutableEntry current;
-
-		PackIndexPeekIterator(int packId, PackIndex index) {
-			it = index.iterator();
-			this.packId = packId;
-		}
-
-		PackIndex.MutableEntry next() {
-			if (it.hasNext()) {
-				current = it.next();
-			} else {
-				current = null;
-			}
-			return current;
-		}
-
-		PackIndex.MutableEntry peek() {
-			return current;
-		}
-
-		int getPackId() {
-			return packId;
-		}
+	public MidxIterator bySha1Iterator() {
+		midxIterator.reset();
+		return midxIterator;
 	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java
index b1ba5df..ae5b214 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java
@@ -97,11 +97,11 @@ public boolean matchConfigValue(String in) {
 
 	private final static Charset DEFAULT_COMMIT_MESSAGE_ENCODING = StandardCharsets.UTF_8;
 
-	private String i18nCommitEncoding;
+	private final String i18nCommitEncoding;
 
-	private String commitTemplatePath;
+	private final String commitTemplatePath;
 
-	private CleanupMode cleanupMode;
+	private final CleanupMode cleanupMode;
 
 	private char commentCharacter = '#';
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java
index 54b7aa4..680e3e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java
@@ -9,8 +9,13 @@
  *******************************************************************************/
 package org.eclipse.jgit.merge;
 
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
+
 import java.io.IOException;
 
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Config.SectionParser;
@@ -60,6 +65,8 @@ public static final SectionParser<MergeConfig> getParser(
 
 	private final FastForwardMode fastForwardMode;
 
+	private final ConflictStyle conflictStyle;
+
 	private final boolean squash;
 
 	private final boolean commit;
@@ -67,12 +74,14 @@ public static final SectionParser<MergeConfig> getParser(
 	private MergeConfig(String branch, Config config) {
 		String[] mergeOptions = getMergeOptions(branch, config);
 		fastForwardMode = getFastForwardMode(config, mergeOptions);
+		conflictStyle = getConflictStyle(config);
 		squash = isMergeConfigOptionSet("--squash", mergeOptions); //$NON-NLS-1$
 		commit = !isMergeConfigOptionSet("--no-commit", mergeOptions); //$NON-NLS-1$
 	}
 
 	private MergeConfig() {
 		fastForwardMode = FastForwardMode.FF;
+		conflictStyle = ConflictStyle.MERGE;
 		squash = false;
 		commit = true;
 	}
@@ -87,6 +96,16 @@ public FastForwardMode getFastForwardMode() {
 	}
 
 	/**
+	 * Get the configured conflict style
+	 *
+	 * @return the configured conflict style
+	 * @since 7.6
+	 */
+	public ConflictStyle getConflictStyle() {
+		return conflictStyle;
+	}
+
+	/**
 	 * Whether merges into this branch are configured to be squash merges, false
 	 * otherwise
 	 *
@@ -120,6 +139,11 @@ private static FastForwardMode getFastForwardMode(Config config,
 		return ffmode;
 	}
 
+	private ConflictStyle getConflictStyle(Config config) {
+		return config.getEnum(CONFIG_MERGE_SECTION, null,
+						CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
 	private static boolean isMergeConfigOptionSet(String optionToLookFor,
 			String[] mergeOptions) {
 		for (String option : mergeOptions) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
index dc96f65..cb82577 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
@@ -16,9 +16,12 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.time.Instant.EPOCH;
+import static org.eclipse.jgit.api.MergeCommand.ConflictStyle.MERGE;
 import static org.eclipse.jgit.diff.DiffAlgorithm.SupportedAlgorithm.HISTOGRAM;
 import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_DIFF_SECTION;
 import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_ALGORITHM;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_CONFLICTSTYLE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_MERGE_SECTION;
 import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
 
 import java.io.Closeable;
@@ -39,6 +42,7 @@
 
 import org.eclipse.jgit.annotations.NonNull;
 import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.api.MergeCommand.ConflictStyle;
 import org.eclipse.jgit.attributes.Attribute;
 import org.eclipse.jgit.attributes.Attributes;
 import org.eclipse.jgit.attributes.AttributesNodeProvider;
@@ -831,6 +835,8 @@ public enum MergeFailureReason {
 	 */
 	protected MergeAlgorithm mergeAlgorithm;
 
+	private ConflictStyle conflictStyle;
+
 	/**
 	 * The {@link ContentMergeStrategy} to use for "resolve" and "recursive"
 	 * merges.
@@ -870,6 +876,7 @@ protected ResolveMerger(Repository local, boolean inCore) {
 		super(local);
 		Config config = local.getConfig();
 		mergeAlgorithm = getMergeAlgorithm(config);
+		conflictStyle = getConflictStyle(config);
 		commitNames = defaultCommitNames();
 		this.inCore = inCore;
 	}
@@ -896,6 +903,7 @@ protected ResolveMerger(Repository local) {
 	protected ResolveMerger(ObjectInserter inserter, Config config) {
 		super(inserter);
 		mergeAlgorithm = getMergeAlgorithm(config);
+		conflictStyle = getConflictStyle(config);
 		commitNames = defaultCommitNames();
 		inCore = true;
 	}
@@ -923,6 +931,23 @@ public void setContentMergeStrategy(ContentMergeStrategy strategy) {
 				: strategy;
 	}
 
+	/**
+	 * Sets the conflict style to be used when formatting merge conflicts.
+	 *
+	 * @param conflictStyle
+	 *            a {@link org.eclipse.jgit.api.MergeCommand.ConflictStyle}
+	 * @since 7.6
+	 */
+	public void setConflictStyle(ConflictStyle conflictStyle) {
+		this.conflictStyle = conflictStyle;
+	}
+
+	private ConflictStyle getConflictStyle(Config config) {
+		return config.getEnum(CONFIG_MERGE_SECTION,
+				null,
+				CONFIG_KEY_CONFLICTSTYLE, MERGE);
+	}
+
 	@Override
 	protected boolean mergeImpl() throws IOException {
 		return mergeTrees(mergeBase(), sourceTrees[0], sourceTrees[1],
@@ -1668,8 +1693,16 @@ private TemporaryBuffer doMerge(MergeResult<RawText> result)
 				db != null ? nonNullRepo().getDirectory() : null, workTreeUpdater.getInCoreFileSizeLimit());
 		boolean success = false;
 		try {
-			new MergeFormatter().formatMerge(buf, result,
-					Arrays.asList(commitNames), UTF_8);
+			switch (conflictStyle) {
+			case MERGE:
+				new MergeFormatter().formatMerge(buf, result,
+						Arrays.asList(commitNames), UTF_8);
+				break;
+			case DIFF3:
+				new MergeFormatter().formatMergeDiff3(buf, result,
+						Arrays.asList(commitNames), UTF_8);
+				break;
+			}
 			buf.close();
 			success = true;
 		} finally {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
index ba7573a..8e604ba 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
@@ -623,7 +623,7 @@ private Set<RevCommit> getCommitsMergedInto(RevCommit needle, Collection<RevComm
 				markStart(c);
 				boolean commitFound = false;
 				RevCommit next;
-				while ((next = next()) != null) {
+				while ((next = next()) != null && !monitor.isCancelled()) {
 					if (next.getGeneration() < cutoff) {
 						markUninteresting(next);
 						uninteresting.add(next);
diff --git a/pom.xml b/pom.xml
index 8980605..8e00d87 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.6.0-SNAPSHOT</version>
+  <version>7.7.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.5.0.202512021534-r</jgit-last-release-version>
+    <jgit-last-release-version>7.6.0.202603022253-r</jgit-last-release-version>
     <ant-version>1.10.15</ant-version>
     <apache-sshd-version>2.17.1</apache-sshd-version>
     <jsch-version>0.1.55</jsch-version>
@@ -130,7 +130,7 @@
     <commons-compress-version>1.28.0</commons-compress-version>
     <osgi-core-version>6.0.0</osgi-core-version>
     <servlet-api-version>4.0.1</servlet-api-version>
-    <jetty-version>12.1.5</jetty-version>
+    <jetty-version>12.1.6</jetty-version>
     <japicmp-version>0.25.0</japicmp-version>
     <httpclient-version>4.5.14</httpclient-version>
     <httpcore-version>4.4.16</httpcore-version>
@@ -148,7 +148,7 @@
     <hamcrest-version>3.0</hamcrest-version>
     <assertj-version>3.27.7</assertj-version>
     <jna-version>5.18.1</jna-version>
-    <byte-buddy-version>1.18.4</byte-buddy-version>
+    <byte-buddy-version>1.18.5</byte-buddy-version>
 
     <!-- Properties to enable jacoco code coverage analysis -->
     <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
@@ -899,7 +899,7 @@
       <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
-        <version>1.20.0</version>
+        <version>1.21.0</version>
       </dependency>
 
       <dependency>
@@ -970,6 +970,12 @@
       </dependency>
 
       <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>jcl-over-slf4j</artifactId>
+        <version>${slf4j-version}</version>
+      </dependency>
+
+      <dependency>
         <groupId>com.google.code.gson</groupId>
         <artifactId>gson</artifactId>
         <version>${gson-version}</version>
diff --git a/tools/maven-central/README.md b/tools/maven-central/README.md
index d4533d9..0c40598 100644
--- a/tools/maven-central/README.md
+++ b/tools/maven-central/README.md
@@ -87,7 +87,7 @@
   - update the version in its `pom.xml` to the new JGit release you staged
   - delete all jgit artifacts from your local m2 repository
     ```
-    $ rm -r ~/.m2/org/eclipse/jgit
+    $ rm -r ~/.m2/repository/org/eclipse/jgit
     ```
   - build the jgit-built-test maven project to test if all artifacts of the new release
     can be downloaded and used in a build
diff --git a/tools/maven-central/download_release.py b/tools/maven-central/download_release.py
index 4ce44bc..fa24b2f 100755
--- a/tools/maven-central/download_release.py
+++ b/tools/maven-central/download_release.py
@@ -10,7 +10,7 @@
 from functools import partial
 
 
-BASE_REPO_URL = "https://repo.eclipse.org/content/groups/releases"
+BASE_REPO_URL = "https://repo.eclipse.org/content/repositories/releases"
 JGIT_GROUP_ID = "org.eclipse.jgit"
 JGIT_PARENT_ARTIFACT_ID = "org.eclipse.jgit-parent"
 DOWNLOAD_DIR = "staging-deploy"