diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index e97dd34806b64349fffe0f5945ddbabdf5de0534..a458b60ee76c0337a14cf7dc51f92e20229bffe9 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -435,10 +435,10 @@ public class SummaryHelper extends HelperBase {
                     buf.append("client.png\" alt=\"Client\" title=\"").append(_("Client")).append("\">");
                 buf.append("</td><td align=\"left\"><b><a href=\"tunnels#").append(h.toBase64().substring(0,4));
                 buf.append("\" target=\"_top\" title=\"").append(_("Show tunnels")).append("\">");
-                if (name.length() < 18)
+                if (name.length() <= 20)
                     buf.append(DataHelper.escapeHTML(name));
                 else
-                    buf.append(DataHelper.escapeHTML(name.substring(0,15))).append("&hellip;");
+                    buf.append(DataHelper.escapeHTML(name.substring(0,18))).append("&hellip;");
                 buf.append("</a></b></td>\n");
                 LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h);
                 if (ls != null && _context.tunnelManager().getOutboundClientTunnelCount(h) > 0) {
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java
index 20e3ff55c38833730c47dcd428eb70703607228d..a501a8d22484e09d13e8935bf9264eef516ef551 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java
@@ -11,6 +11,7 @@ import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -29,9 +30,11 @@ import net.i2p.client.streaming.I2PSocketOptions;
 import net.i2p.crypto.SigType;
 import net.i2p.data.Certificate;
 import net.i2p.data.Destination;
+import net.i2p.data.Hash;
 import net.i2p.data.PrivateKey;
 import net.i2p.data.PublicKey;
 import net.i2p.data.SimpleDataStructure;
+import net.i2p.util.ConvertToHash;
 import net.i2p.util.Log;
 
 /**
@@ -57,7 +60,23 @@ public class I2PSocketManagerFull implements I2PSocketManager {
     private static final AtomicInteger __managerId = new AtomicInteger();
     private final ConnectionManager _connectionManager;
     private final AtomicBoolean _isDestroyed = new AtomicBoolean();
+
+    private static final Set<Hash> _dsaOnly = new HashSet<Hash>(16);
+    private static final String[] DSA_ONLY_HASHES = {
+        "3t5Ar2NCTIOId70uzX2bZyJljR0aBogxMEzNyHirB7A="   // forum.i2p
+    };
     
+    static {
+        for (int i = 0; i < DSA_ONLY_HASHES.length; i++) {
+            String s = DSA_ONLY_HASHES[i];
+            Hash h = ConvertToHash.getHash(s);
+            if (h != null)
+                _dsaOnly.add(h);
+            else
+                System.out.println("Bad hash " + s);
+        }
+    }
+
     /**
      * How long to wait for the client app to accept() before sending back CLOSE?
      * This includes the time waiting in the queue.  Currently set to 5 seconds.
@@ -401,9 +420,22 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         if (_log.shouldLog(Log.INFO))
             _log.info("Connecting to " + peer.calculateHash().toBase64().substring(0,6) 
                       + " with options: " + opts);
-// fixme pick the subsession here
+        // pick the subsession here
+        ConnectionManager cm = _connectionManager;
+        if (!_subsessions.isEmpty()) {
+            Hash h = peer.calculateHash();
+            if (_dsaOnly.contains(h)) {
+                // FIXME just taking the first one for now
+                for (Map.Entry<I2PSession, ConnectionManager> e : _subsessions.entrySet()) {
+                    if (e.getKey().getMyDestination().getSigType() == SigType.DSA_SHA1) {
+                        cm = e.getValue();
+                        break;
+                    }
+                }
+            }
+        }
         // the following blocks unless connect delay > 0
-        Connection con = _connectionManager.connect(peer, opts);
+        Connection con = cm.connect(peer, opts);
         if (con == null)
             throw new TooManyStreamsException("Too many streams, max " + _defaultOptions.getMaxConns());
         I2PSocketFull socket = new I2PSocketFull(con,_context);
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index f8fc2bb8e35a1e9e0e065f361eebca2ce5fcbee6..5004baedd04addcb760a3f6fb04fd9f1450a5e62 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -401,7 +401,7 @@ class ClientManager {
     public void requestLeaseSet(Destination dest, LeaseSet set, long timeout, Job onCreateJob, Job onFailedJob) {
         ClientConnectionRunner runner = getRunner(dest);
         if (runner == null) {
-            if (_log.shouldLog(Log.ERROR))
+            if (_log.shouldLog(Log.WARN))
                 _log.warn("Cannot request the lease set, as we can't find a client runner for " 
                           + dest.calculateHash().toBase64() + ".  disconnected?");
             _ctx.jobQueue().addJob(onFailedJob);
@@ -424,6 +424,10 @@ class ClientManager {
         if (runner != null)  {
             // no need to fire off any jobs...
             runner.requestLeaseSet(dest, ls, REQUEST_LEASESET_TIMEOUT, null, null);
+        } else {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Cannot request the lease set, as we can't find a client runner for " 
+                          + dest + ".  disconnected?");
         }
     }
     
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index ead5dcd2628f2123c15294e68455ca6de125031a..628d8b0a5d7c12bd228ea699a48cae07e9dd600b 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -289,16 +289,19 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
             if (pcfg != null) {
                 ClientTunnelSettings settings = new ClientTunnelSettings(dest.calculateHash());
                 settings.readFromProperties(props);
+                // addAlias() sends the create lease set msg, so we have to send the SMS first
+                sendStatusMessage(id, status);
                 boolean ok = _context.tunnelManager().addAlias(dest, settings, pcfg.getDestination());
                 if (!ok) {
                     _log.error("Add alias failed");
-                    status = SessionStatusMessage.STATUS_REFUSED;
+                    // FIXME cleanup
                 }
             } else {
                 _log.error("no primary config?");
                 status = SessionStatusMessage.STATUS_INVALID;
+                sendStatusMessage(id, status);
+                // FIXME cleanup
             }
-            sendStatusMessage(id, status);
         }
     }
     
diff --git a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java
index 05132c9adeeee29895b5d94ce63b258970b45501..d4d6ccc23a2dd20403d4e0ec47de2c34ac6e03b9 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java
@@ -34,6 +34,7 @@ public class AliasedTunnelPool extends TunnelPool {
         if (_log.shouldLog(Log.INFO))
             _log.info(toString() + ": Startup() called, was already alive? " + _alive, new Exception());
         _alive = true;
+        super.refreshLeaseSet();
     }
     
     @Override
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 b69caa7896cca678071014a352afba859a02e025..ef6403a5bc9db7f6bfe4a314fe773294214ca311 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -607,7 +607,7 @@ public class TunnelPool {
         if (_settings.isInbound() && !_settings.isExploratory()) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)");
-            LeaseSet ls = null;
+            LeaseSet ls;
             synchronized (_tunnels) {
                 ls = locked_buildNewLeaseSet();
             }