Index: applications/editors/josm/plugins/http2/src/org/openstreetmap/josm/plugins/http2/Http2Client.java
===================================================================
--- applications/editors/josm/plugins/http2/src/org/openstreetmap/josm/plugins/http2/Http2Client.java	(revision 35355)
+++ applications/editors/josm/plugins/http2/src/org/openstreetmap/josm/plugins/http2/Http2Client.java	(revision 35356)
@@ -22,4 +22,5 @@
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.openstreetmap.josm.data.Version;
@@ -34,6 +35,6 @@
 public final class Http2Client extends org.openstreetmap.josm.tools.HttpClient {
 
-    private HttpClient.Builder clientBuilder;
-    private HttpRequest.Builder requestBuilder;
+    private static final Map<Duration, HttpClient> clientForConnectTimeout = new ConcurrentHashMap<>();
+    private HttpRequest request;
     private HttpResponse<InputStream> response;
 
@@ -44,9 +45,5 @@
     @Override
     protected void setupConnection(ProgressMonitor progressMonitor) throws IOException {
-        clientBuilder = HttpClient.newBuilder().followRedirects(Redirect.NEVER); // we do that ourselves
-        int timeout = getConnectTimeout();
-        if (timeout > 0) {
-            clientBuilder.connectTimeout(Duration.ofMillis(timeout));
-        }
+        HttpRequest.Builder requestBuilder;
         try {
             requestBuilder = HttpRequest.newBuilder()
@@ -59,5 +56,5 @@
             throw new IOException(e);
         }
-        timeout = getReadTimeout();
+        int timeout = getReadTimeout();
         if (timeout > 0) {
             requestBuilder.timeout(Duration.ofMillis(timeout));
@@ -79,4 +76,5 @@
             }
         }
+        request = requestBuilder.build();
 
         notifyConnect(progressMonitor);
@@ -89,6 +87,12 @@
     @Override
     protected ConnectionResponse performConnection() throws IOException {
+        // reuse HttpClient
+        HttpClient client = clientForConnectTimeout.computeIfAbsent(Duration.ofMillis(getConnectTimeout()), timeout ->
+                HttpClient.newBuilder()
+                        .followRedirects(Redirect.NEVER) // we do that ourselves
+                        .connectTimeout(timeout)
+                        .build());
         try {
-            response = clientBuilder.build().send(requestBuilder.build(), BodyHandlers.ofInputStream());
+            response = client.send(request, BodyHandlers.ofInputStream());
             return new ConnectionResponse() {
                 @Override
