diff --git a/history.txt b/history.txt
index 1047c9dfecd01f3c3e8280185b9a2f1a477e3f1b..cbab53412662f9d649bf5a3dd7a6e2009b003df2 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,6 @@
+2022-12-29 zzz
+ * Tunnels: Limit requested client tunnels during congestion
+
 2022-12-26 zzz
  * Console: Sort tunnels by name on /tunnels, /configtunnels, /i2ptunnel
  * Router: Don't blocklist our own IP
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 470d52b4beaa1ece360fe8714dbd35bd1f84a12b..32c3be4234ef76def4e27063a72e21e51f0a200b 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,10 +18,10 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Git";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 12;
+    public final static long BUILD = 13;
 
     /** for example "-test" */
-    public final static String EXTRA = "";
+    public final static String EXTRA = "-rc";
     public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + FULL_VERSION);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
index 3b556ce0620355f52600419ab1b04fb8d245f5e7..d98b87f3c99d701436137310bf3b4ff9ac523ebe 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -332,8 +332,24 @@ public class TunnelPool {
         if (_settings.getLength() == 0 && _settings.getLengthVariance() == 0)
             return 1;
         int rv = _settings.getTotalQuantity();
-        if (!_settings.isExploratory())
+        if (!_settings.isExploratory()) {
+            if (rv <= 1)
+                return rv;
+            // throttle client tunnel builds in times of congestion
+            int fails = _consecutiveBuildTimeouts.get();
+            if (fails > 4) {
+                if (fails > 8) {
+                    rv = 1;
+                    if (_log.shouldWarn())
+                        _log.warn("Limit to 1 tunnel after " + fails + " consec. build timeouts on " + this);
+                } else if (rv > 2) {
+                    rv--;
+                    if (_log.shouldWarn())
+                        _log.warn("Limit to " + rv + " tunnels after " + fails + " consec. build timeouts on " + this);
+                }
+            }
             return rv;
+        }
         // TODO high-bw non-ff also
         if (_context.netDb().floodfillEnabled() &&
             _context.router().getUptime() > 5*60*1000) {